Лекция · 4.5–4.8

Таңдауды ұйымдастыру

Кейбір бағдарламалау тілдерінде арнайы «switch-case» деген құрылым бар — ол көп нұсқадан таңдауды ыңғайлы етіп жазуға арналған. Python тілінде мұндай арнайы құрылым жоқ. Сонда көп нұсқадан таңдауды Python-да қалай ұйымдастырамыз? Дәл осы сұраққа жауап беретін тақырыппен танысамыз — таңдауды ұйымдастырудың екі негізгі тәсілі: кеңейтілген if-elif-else тізбегі және сөздік (dict). Бұл тақырып ҰБТ-да жиі кездеседі: ұпай бойынша баға қою, мәтіндік командаға қарай амал орындайтын калькулятор, апта күнін немесе санатты кесте бойынша анықтау — барлығы дәл осы тақырыпқа негізделген.

Python-да switch-case неге жоқ?

Кейбір телефон қосымшаларында мәзір болады: «1 — профиль, 2 — параметрлер, 3 — шығу» деген сияқты. Пайдаланушы санды басады, қосымша сол санға сай әрекет жасайды. Бұл — көп нұсқадан таңдаудың кәдімгі мысалы.

Бағдарламалауда мұндай көп нұсқадан таңдауды арнайы жеңілдететін switch-case деген құрылым көптеген тілдерде бар (мыс. C++, Java). Сұрақ: Python-да дәл осындай арнайы құрылым бар ма?

Жауабы — жоқ. Python тілін жасаушылар әдейі switch-case құрылымын қоспаған, себебі олардың пікірінше, if-elif-else тізбегі мен сөздік (dict) дәл осы мақсатқа жеткілікті әрі түсінікті. Сондықтан Python-да көп нұсқадан таңдауды ұйымдастыру үшін осы екі тәсілді меңгеру керек.

🚫
switch-case
басқа тілдерде бар
🐍
Python-да:
if-elif-else немесе dict
Анықтама
Көптеген программалау тілдерінде switch-case таңдау операторы болады. Python тілінде арнайы таңдау операторы жоқ — оның орнына if-elif-else құрылымы немесе сөздік (dict) қолданылады.

Бөлшектеп қарайық: «switch-case» — бұл, негізінен, бір айнымалының бірнеше нақты мәніне қарай әрекет таңдайтын құрылым, ол көп тілдерде бар, бірақ Python-да жоқ. «if-elif-else құрылымы» — бұл өткен сабақтарда көрген таныс тәсіл, тек енді оны көбірек elif-пен, көбірек нұсқаға қолданамыз. «сөздік (dict)» — бұл мүлдем жаңа тәсіл, ол мәндерді кілт арқылы тікелей сақтап, іздеуге мүмкіндік береді.

Неге Python switch-case-ті қоспаған? Себебі if-elif-else кез келген жағдайды (тіпті диапазон, кешенді шартты да) тексере алады, ал dict тура сәйкестікке негізделген таңдауды әлдеқайда қысқа әрі жылдам жасайды — екеуінің тіркесімі switch-case-тен де икемді. Мысалы: ұпай бойынша баға қою — диапазон қажет болғандықтан, if-elif-else қолданылады. Ал апта күнінің атауын табу — әр санға бір нақты сөз сәйкес келетіндіктен, dict ыңғайлырақ.

Бұл — асхана мәзіріне ұқсас: кейбір мәзірлерде «бағасы 1000-нан төмен тағамдар» деп диапазон бойынша іздейсің (if-elif сияқты), ал кейбір мәзірлерде «тағамның нөмірін айт, дәл сол тағамды әкелеміз» дейді (dict сияқты, тікелей нөмір бойынша табу).

⚠️
Жиі кеткен қате: кейбір оқушылар интернеттен «Python switch-case» деп іздеп, өздерінің кодында switch немесе case деген сөзді қолданбақ болады. Бұл — SyntaxError-ға әкеледі, себебі Python-да мұндай кілт сөздер мүлдем жоқ. Есте сақта: Python-да тек if-elif-else немесе dict қолданылады.
Көп тармақты elif есепте қолдану

Мұғалім тақтада қалай шешер еді, дәл солай қадаммен жүрейік.

Деңгей: орта
Не белгілі: Тест нәтижесі бойынша ұпай саны (points).
Не табу керек: Ұпайға сай баға қою (85+: өте жақсы, 70+: жақсы, 55+: қанағаттанарлық, 40+: қанағаттанарлықсыз, 40-нан төмен: қайта тапсыру).
Неге дәл осы әдісті қолданамыз: бұл — бес диапазонды анықтау есебі, әр диапазон төменгі шегімен беріледі. Диапазондар бір-бірімен қабаттаспас үшін, оларды ЕҢ ЖОҒАРЫСЫНАН бастап, кему ретімен тексеру керек — бұл elif тізбегінің табиғи жұмыс істеу тәртібіне дәл сәйкес келеді.
1
Ұпай санын енгіземіз.
points = int(input("Сен жинаған ұпай саны="))
2
Ең жоғары шектен бастап тізбектей тексереміз.
if points >= 85:
    print("Сенің бағаң - өте жақсы")
elif points >= 70:
    print("Сенің бағаң - жақсы")
elif points >= 55:
    print("Сенің бағаң - қанағаттанарлық")
elif points >= 40:
    print("Сенің бағаң - қанағаттанарлықсыз")
else:
    print("Саған тестті қайта тапсыру қажет")
3
Назар аудар: «points >= 70» шарты тексерілгенде, points 85-тен төмен екені автоматты түрде белгілі болады (себебі бірінші шарт жалған болды), сондықтан «70 <= points < 85» деп қайта жазудың қажеті жоқ.
Тексеру: points=90 болса, «90 >= 85» — ақиқат, бірінші шарттың өзінде тоқтайды → «өте жақсы». points=30 болса, барлық elif шарттары жалған (30 < 40 да), демек else іске қосылады → «қайта тапсыру қажет». Жауабы: points=90 → "өте жақсы"; points=30 → "қайта тапсыру қажет". Қорытынды идея: диапазондарды кему ретімен тексергенде, әр келесі шарттың «жоғарғы шегін» қайта жазудың қажеті жоқ — алдыңғы шарттың жалған болуы өзі соны білдіреді. Бұл elif тізбегінің ең үлкен артықшылықтарының бірі.
<40 40–54 55–69 70–84 85+ points=90 points=30
Деңгей: орта
Не белгілі: Екі сан мен амал түрі (мәтін: add/sub/mul/div).
Не табу керек: Таңдалған амалды орындайтын калькулятор программасы.
Неге дәл осы әдісті қолданамыз: мұндағы таңдау диапазон бойынша емес, нақты мәтіндік мәндер бойынша (add, sub, mul немесе div) жасалады. Сондықтан әр нұсқаны «==» арқылы дәл салыстырып, elif тізбегімен тексереміз. Сонымен қатар, пайдаланушы қате мән енгізуі мүмкін болғандықтан, else бөлігін «қате хабарлама» үшін қалдырамыз.
1
Екі санды және амал түрін енгіземіз. operation — мәтіндік мән, сондықтан оны int() арқылы санға айналдырудың қажеті жоқ.
a1 = int(input("Birinshi sandy engizinder: "))
a2 = int(input("Ekinshi sandy engizinder: "))
operation = input("add/sub/mul/div: ")
2
Әр амалды мәтінмен «==» арқылы салыстырып, elif тізбегімен тексереміз.
if operation == 'add':
    a3 = a1 + a2
elif operation == 'sub':
    a3 = a1 - a2
elif operation == 'mul':
    a3 = a1 * a2
elif operation == 'div':
    a3 = a1 / a2
else:
    a3 = 'Kate!'
3
Нәтижені шығарамыз.
print("Jauaby: = ", a3)
Тексеру: a1=55, a2=7, operation="div" болса, «operation == 'div'» ақиқат → a3 = 55/7 ≈ 7.857. operation="22" болса, төрт шарттың бірі де сәйкес келмейді → else іске қосылып, a3 = 'Kate!' болады. Жауабы: a1=55, a2=7, operation="div" → 7.857...; operation="22" (қате мән) → "Kate!". Қорытынды идея: мәтіндік мән бойынша таңдау жасағанда, әр нұсқаны «==» арқылы дәл салыстырамыз, ал пайдаланушы күтпеген мән енгізсе, else бөлігі арқылы программаны «бұзылып қалудан» қорғаймыз.
add? sub? mul? div?
Сөздік (dict) арқылы таңдау

Апта күндерінің атауын нөмірі бойынша табу керек делік: 1 — Дүйсенбі, 2 — Сейсенбі, және солай жалғасады. Бұл — жеті нұсқа, оны elif арқылы жазуға да болады, бірақ ойлап көрсек: бұл жерде ешқандай диапазон жоқ, тек «нөмір → атау» деген тура сәйкестік қана бар.

Сұрақ: жеті рет «elif i == ...:» деп жазудың орнына, барлық сәйкестікті бір жерде, тура кесте түрінде сақтап, содан керекті мәнді бірден алуға бола ма?

Жауабы — иә, болады. Python-да мұндай «кілт → мән» сәйкестігін сақтайтын арнайы құрылым бар — оны сөздік (dict) дейміз. Сөздікте әрбір кілттің (мыс. 1) өзіне сәйкес мәні (мыс. «Дүйсенбі») болады, ал керекті мәнді табу үшін elif тізбегін тексерудің қажеті жоқ — кілтті тікелей көрсетсең жеткілікті.

🔁
7 × elif
тізбектей тексеру
vs
1 × dict
бір қадамда нәтиже
Анықтама
Сөздік (dict) — таңдауды ұйымдастырудың балама тәсілі. Деректер кілт : мәні жұбында {} жақша ішінде сақталады, кілт қайталанбауы керек.
1 2 кілт 'Duisenbi' 'Seisenbi' мән

Бөлшектеп қарайық: «Кілт:мәні жұбы» — әрбір жазба екі бөліктен тұрады: кілт (іздеу үшін қолданылатын белгі, мыс. 1) және мән (сол кілтке сәйкес дерек, мыс. «Дүйсенбі»). «{} жақша ішінде» — сөздік фигуралық жақшамен жазылады, ал ішіндегі жұптар үтірмен бөлінеді. «Кілт қайталанбауы керек» — әр кілт сөздікте тек бір рет кездесуі керек, әйтпесе соңғы жазылған мән алдыңғысын ауыстырып жібереді.

Неге dict тиімді? Себебі dict кілт бойынша мәнді іздегенде, барлық жазбаны тізбектей тексермейді — ол кілтті бірден «таниды» және сәйкес мәнді қайтарады. Бұл, әсіресе көп нұсқа болғанда, elif тізбегінен әлдеқайда жылдам әрі қысқа. Мысалы: k = {1: 'Duisenbi', 2: 'Seisenbi'} деген сөздікте, k[1] жазуы тікелей «Duisenbi» мәнін қайтарады, ешқандай шартты тексерудің қажеті жоқ.

Сөздікті телефон кітапшасына ұқсатуға болады: аты бойынша (кілт) адамның нөмірін (мән) бірден табасың, барлық тізімді басынан соңына дейін парақтаудың қажеті жоқ. Дәл осылай dict те кілт бойынша мәнді бірден береді.

⚠️
Жиі кеткен қате: кейбір оқушылар сөздіктен жоқ кілт бойынша мән алмақ болады (мыс. k[10], бірақ сөздікте тек 1-ден 7-ге дейінгі кілттер бар). Бұл — KeyError қатесіне әкеледі. Сондай-ақ, бірдей кілтті екі рет жазса (мыс. {1: 'A', 1: 'B'}), Python тек соңғы мәнді ('B') сақтайды, біріншісі жоғалады.
Dict есепте қолдану

Мұғалім тақтада қалай шешер еді, дәл солай қадаммен жүрейік.

Деңгей: оңай
Не белгілі: Апта күнінің нөмірі (1-7).
Не табу керек: Сөздік арқылы күн атауын шығару.
Неге дәл осы әдісті қолданамыз: бұл — тура сәйкестік есебі: әр нөмірге белгілі бір күн атауы сай келеді, диапазон жоқ. Сондықтан жеті elif жазудың орнына, барлық сәйкестікті бір сөздікте сақтап, тікелей кілт бойынша алу ыңғайлы.
1
Жеті кілт (1-ден 7-ге дейін) пен оларға сәйкес жеті мән (күн атаулары) бар сөздікті құрамыз.
k = {1: 'Duisenbi', 2: 'Seisenbi', 3: 'Sarsenbi',
     4: 'Beisenbi', 5: 'Juma', 6: 'Senbi', 7: 'Jeksenbi'}
2
Пайдаланушыдан нөмірді сұраймыз.
i = int(input("kun nomeri: "))
3
Сөздіктен тікелей мәнді аламыз. k[i] жазуы — i айнымалысының мәніне сәйкес кілтті сөздіктен іздеп, оның мәнін қайтарады.
print(k[i])
Тексеру: i=4 болса, k[4] — сөздіктегі 4 кілтіне сәйкес мән, ол «Beisenbi». Ешқандай шартты тексерудің қажеті болмады, мән бірден табылды. Жауабы: i=4 → "Beisenbi". Қорытынды идея: тура сәйкестік (бір кілт — бір мән) болатын есептерде сөздік ең қысқа әрі жылдам шешім береді — elif тізбегін жазудың қажеті жоқ.
КілтМән
1Duisenbi
2Seisenbi
3Sarsenbi
4Beisenbi ←
5Juma
6Senbi
7Jeksenbi
Қашан elif, қашан dict қолдану керек?

Енді бір сұрақ туады: қашан elif қолданамыз, қашан dict қолданамыз? Екеуі де таңдау жасайды емес пе?

Бұған дейінгі екі есепті салыстырып көрейік: баға қою есебінде «85 және одан жоғары» деген ДИАПАЗОН бар еді — мұнда нақты бір сан емес, сан аралығы маңызды. Ал апта күні есебінде «нөмір 4-ке ТЕҢ болса» деген ТУРА сәйкестік бар еді — диапазон жоқ. Дәл осы айырмашылық — қашан elif, қашан dict қолдану керектігін анықтайтын негізгі белгі.

Салыстыру
if-elif-else мен сөздік (dict) арасындағы айырмашылық: dict тікелей кілт бойынша мәнді табады (жылдамырақ, қысқа жазылады), ал if-elif-else әр шартты тізбектей тексереді (аралық мәндерді — мыс. «5-тен үлкен» — тексеру қажет болғанда тиімдірек).

Бөлшектеп қарайық, қашан қайсысын қолдану керек: dict қолдану керек, егер әр нұсқаға нақты бір мән сәйкес келсе (мыс. нөмір → атау, код → баға) және диапазон тексеру қажет болмаса. if-elif-else қолдану керек, егер шарт диапазонды («70-тен жоғары»), күрделі логиканы (and/or) немесе бір-біріне тәуелді тексерулерді талап етсе.

Неге dict диапазонға жарамайды? Себебі dict тек нақты кілттерді біледі — оның ішінде «70-тен жоғары барлық сан» деген «ауқымды кілт» болмайды, әр кілт нақты бір мән болуы керек (мыс. тек 70 саны, 71 емес, 72 емес). Ал elif кез келген логикалық шартты тексере алады, тіпті диапазон болса да.

Мысалы: егер ұпай бойынша баға қоюды dict-пен жазбақ болсақ, әр мүмкін ұпайға (0-ден 100-ге дейін) бөлек жазба керек болар еді — бұл мүлдем тиімсіз. Сондықтан мұндай есепте elif дұрыс таңдау. Ал апта күнін табуда керісінше — әр санға нақты бір атау сәйкес келетіндіктен, dict ең қысқа шешім.

🛣️ Жол бойымен (elif)
🚶→🚶→🚶
Әр белгіні («осы ма?») кезекпен тексеру — диапазон керек жерде
✈️ Тіркеу нөмірі (dict)
🎫➡️💺
Нөмір бойынша орынды бірден табу — тура сәйкестік керек жерде

elif — жол бойымен жүріп, әр белгіні («осы ма?») кезекпен тексеру сияқты. dict — әуежайдағы тіркеу нөмірі бойынша орынды бірден табу сияқты, жол жүрмейсің, тікелей сол орынға барасың. Жол керек болса (диапазон) — elif, тікелей орын керек болса (тура сәйкестік) — dict.

⚠️
Жиі кеткен қате: кейбір оқушылар диапазон қажет болатын есепте де dict қолданбақ болады (мыс. әр ұпай үшін бөлек кілт жазуға тырысады). Бұл — өте тиімсіз әрі қатеге толы тәсіл. Есте сақта: dict — тек нақты, шектеулі санды кілттер үшін, ал диапазон болса — elif қолдан.
📝 ҰБТ-мен байланысы

Бұл тақырып ҰБТ-да жиі үш түрлі формада кездеседі: (1) ұпай немесе сан бойынша диапазонды анықтап, баға немесе санат қою (elif); (2) мәтіндік командаға қарай амалды таңдау (elif, == арқылы); (3) сөздік арқылы кілт бойынша мән табу немесе сөздіктің нәтижесін трассировкалау.

Есте сақтау керек негізгі ережелер: Python-да switch-case жоқ, оның орнына if-elif-else немесе dict қолданылады; диапазон болғанда elif-ті ЕҢ ЖОҒАРЫ шектен бастап жаз; тура сәйкестік болғанда dict қысқа әрі жылдам; dict-те кілт қайталанбауы керек, жоқ кілт алуға тырыссаң KeyError шығады.

Ең жиі кеткен қателер:
!
диапазонды кему ретімен тексермей, қате ретпен жазу (нәтижесінде дұрыс емес тармақ таңдалады)
!
мәтіндік мәнді салыстырғанда тырнақшаны ұмытып кету немесе «=» мен «==» шатастыру
!
сөздікте жоқ кілт бойынша мән алуға тырысу (KeyError)
!
диапазон қажет жерде dict қолдануға тырысу
Сабақ қорытындысы
  • Python-да switch-case құрылымы жоқ, оның орнына көп нұсқадан таңдауды екі тәсілмен ұйымдастырамыз.
  • if-elif-else тізбегі — диапазонды, мәтіндік мәнді немесе кез келген күрделі логиканы тексере алады, бірақ диапазон болғанда оны ең жоғары шектен бастап жазу маңызды.
  • Сөздік (dict) — кілт:мәні жұптарын сақтап, тура сәйкестікті бірден, тізбектей тексерусіз табады.
  • if-elif-else — «икемді, бірақ баяуырақ жол», ал dict — «қысқа әрі жылдам тура сілтеме». Есептің сипатына қарай — диапазон бар ма, әлде тура сәйкестік қана ма — қайсысын қолдану керектігін шешеміз.
switch-case жоқ
Python-да арнайы таңдау операторы жоқ
if-elif-else
Диапазон, мәтіндік мән, күрделі логика үшін
dict
Тура сәйкестік үшін — қысқа әрі жылдам