Таңдауды ұйымдастыру
Кейбір бағдарламалау тілдерінде арнайы «switch-case» деген құрылым бар — ол көп нұсқадан таңдауды ыңғайлы етіп жазуға арналған. Python тілінде мұндай арнайы құрылым жоқ. Сонда көп нұсқадан таңдауды Python-да қалай ұйымдастырамыз? Дәл осы сұраққа жауап беретін тақырыппен танысамыз — таңдауды ұйымдастырудың екі негізгі тәсілі: кеңейтілген if-elif-else тізбегі және сөздік (dict). Бұл тақырып ҰБТ-да жиі кездеседі: ұпай бойынша баға қою, мәтіндік командаға қарай амал орындайтын калькулятор, апта күнін немесе санатты кесте бойынша анықтау — барлығы дәл осы тақырыпқа негізделген.
Кейбір телефон қосымшаларында мәзір болады: «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 құрылымы» — бұл өткен сабақтарда көрген таныс тәсіл, тек енді оны көбірек elif-пен, көбірек нұсқаға қолданамыз. «сөздік (dict)» — бұл мүлдем жаңа тәсіл, ол мәндерді кілт арқылы тікелей сақтап, іздеуге мүмкіндік береді.
Неге Python switch-case-ті қоспаған? Себебі if-elif-else кез келген жағдайды (тіпті диапазон, кешенді шартты да) тексере алады, ал dict тура сәйкестікке негізделген таңдауды әлдеқайда қысқа әрі жылдам жасайды — екеуінің тіркесімі switch-case-тен де икемді. Мысалы: ұпай бойынша баға қою — диапазон қажет болғандықтан, if-elif-else қолданылады. Ал апта күнінің атауын табу — әр санға бір нақты сөз сәйкес келетіндіктен, dict ыңғайлырақ.
Бұл — асхана мәзіріне ұқсас: кейбір мәзірлерде «бағасы 1000-нан төмен тағамдар» деп диапазон бойынша іздейсің (if-elif сияқты), ал кейбір мәзірлерде «тағамның нөмірін айт, дәл сол тағамды әкелеміз» дейді (dict сияқты, тікелей нөмір бойынша табу).
switch немесе case деген сөзді қолданбақ болады. Бұл — SyntaxError-ға әкеледі, себебі Python-да мұндай кілт сөздер мүлдем жоқ. Есте сақта: Python-да тек if-elif-else немесе dict қолданылады.Мұғалім тақтада қалай шешер еді, дәл солай қадаммен жүрейік.
points = int(input("Сен жинаған ұпай саны="))
if points >= 85: print("Сенің бағаң - өте жақсы") elif points >= 70: print("Сенің бағаң - жақсы") elif points >= 55: print("Сенің бағаң - қанағаттанарлық") elif points >= 40: print("Сенің бағаң - қанағаттанарлықсыз") else: print("Саған тестті қайта тапсыру қажет")
operation — мәтіндік мән, сондықтан оны int() арқылы санға айналдырудың қажеті жоқ.
a1 = int(input("Birinshi sandy engizinder: ")) a2 = int(input("Ekinshi sandy engizinder: ")) operation = input("add/sub/mul/div: ")
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!'
print("Jauaby: = ", a3)
Апта күндерінің атауын нөмірі бойынша табу керек делік: 1 — Дүйсенбі, 2 — Сейсенбі, және солай жалғасады. Бұл — жеті нұсқа, оны elif арқылы жазуға да болады, бірақ ойлап көрсек: бұл жерде ешқандай диапазон жоқ, тек «нөмір → атау» деген тура сәйкестік қана бар.
Сұрақ: жеті рет «elif i == ...:» деп жазудың орнына, барлық сәйкестікті бір жерде, тура кесте түрінде сақтап, содан керекті мәнді бірден алуға бола ма?
Жауабы — иә, болады. Python-да мұндай «кілт → мән» сәйкестігін сақтайтын арнайы құрылым бар — оны сөздік (dict) дейміз. Сөздікте әрбір кілттің (мыс. 1) өзіне сәйкес мәні (мыс. «Дүйсенбі») болады, ал керекті мәнді табу үшін elif тізбегін тексерудің қажеті жоқ — кілтті тікелей көрсетсең жеткілікті.
Сөздік (dict) — таңдауды ұйымдастырудың балама тәсілі. Деректер
кілт : мәні жұбында {} жақша ішінде сақталады, кілт қайталанбауы керек.
Бөлшектеп қарайық: «Кілт:мәні жұбы» — әрбір жазба екі бөліктен тұрады: кілт (іздеу үшін қолданылатын белгі, мыс. 1) және мән (сол кілтке сәйкес дерек, мыс. «Дүйсенбі»). «{} жақша ішінде» — сөздік фигуралық жақшамен жазылады, ал ішіндегі жұптар үтірмен бөлінеді. «Кілт қайталанбауы керек» — әр кілт сөздікте тек бір рет кездесуі керек, әйтпесе соңғы жазылған мән алдыңғысын ауыстырып жібереді.
Неге dict тиімді? Себебі dict кілт бойынша мәнді іздегенде, барлық жазбаны тізбектей тексермейді — ол кілтті бірден «таниды» және сәйкес мәнді қайтарады. Бұл, әсіресе көп нұсқа болғанда, elif тізбегінен әлдеқайда жылдам әрі қысқа. Мысалы: k = {1: 'Duisenbi', 2: 'Seisenbi'} деген сөздікте, k[1] жазуы тікелей «Duisenbi» мәнін қайтарады, ешқандай шартты тексерудің қажеті жоқ.
Сөздікті телефон кітапшасына ұқсатуға болады: аты бойынша (кілт) адамның нөмірін (мән) бірден табасың, барлық тізімді басынан соңына дейін парақтаудың қажеті жоқ. Дәл осылай dict те кілт бойынша мәнді бірден береді.
k[10], бірақ сөздікте тек 1-ден 7-ге дейінгі кілттер бар). Бұл — KeyError қатесіне әкеледі. Сондай-ақ, бірдей кілтті екі рет жазса (мыс. {1: 'A', 1: 'B'}), Python тек соңғы мәнді ('B') сақтайды, біріншісі жоғалады.Мұғалім тақтада қалай шешер еді, дәл солай қадаммен жүрейік.
k = {1: 'Duisenbi', 2: 'Seisenbi', 3: 'Sarsenbi',
4: 'Beisenbi', 5: 'Juma', 6: 'Senbi', 7: 'Jeksenbi'} i = int(input("kun nomeri: "))
k[i] жазуы — i айнымалысының мәніне сәйкес кілтті сөздіктен іздеп, оның мәнін қайтарады.
print(k[i]) | Кілт | Мән |
|---|---|
| 1 | Duisenbi |
| 2 | Seisenbi |
| 3 | Sarsenbi |
| 4 | Beisenbi ← |
| 5 | Juma |
| 6 | Senbi |
| 7 | Jeksenbi |
Енді бір сұрақ туады: қашан 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.
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 — «қысқа әрі жылдам тура сілтеме». Есептің сипатына қарай — диапазон бар ма, әлде тура сәйкестік қана ма — қайсысын қолдану керектігін шешеміз.