Python: деректен өз есебіңізге дейін 7-сабақ (барлығы 56)
Шарттар: if, elif, else — және жоқ сан
Python курсының жетінші сабағы. Сан өздігінен ештеңе айтпайды: 11,4% — көп пе, аз ба? Шарт салыстырады да, жолды таңдайды. Инфляцияда өлшенді: 2025 жылы Қазақстан — 11,4%, әлем — 3,0%. Қоса деректе жұмыс істеудің басты ережесі: қатардағы жетіспейтін мән — нөл емес, оны `is None` арқылы тексереді.
Не үшін керек
Осы уақытқа дейін бағдарлама кез келген санға бірдей есеп жүргізді. Деректегі нағыз жұмыс сандар әртүрлі болғанда, жол соларға тәуелді болғанда басталады: олқылығы бар жылды нөл деп санамай, аттап өту; нормадан жоғары мәнді белгілеу; қоқысы бар қатарды бөлек қою.
Мұның бәрі — бір құрылым. Ол салыстырады да, таңдайды, ішінде үш сөз бар: if, elif, else.
Бүгін дерек туралы курста синтаксистен қымбат тұратын ереже де шығады: санның болмауы мен нөл — бір нәрсе емес. Жетіспейтін мәнты нөл деп санаған есеп үнсіз қателеседі, ал сіз ол туралы оқырманнан білесіз.
Бірден тұтас
shart.py файлы. Іске қосу: ортадан python shart.py.
"""7-сабақ: шарттар — салыстыруға болатын инфляцияда.
Бір сан салыстыратын нәрсе болмайынша ештеңе білдірмейді. Шарт — сол
салыстырудың өзі, содан кейін бағдарлама бір жолмен жүреді, екіншісімен емес.
"""
# Жылдық инфляция, %. Сандар бірінші сабақтан, Дүниежүзілік банк.
# 2026 жылдың мәні жоқ: жыл бітпеген. Бұл — олқылық, нөл емес.
kz = {2022: 15.0, 2023: 14.5, 2024: 8.7, 2025: 11.4, 2026: None}
world = {2022: 8.1, 2023: 5.8, 2024: 3.0, 2025: 3.0}
here = kz[2025]
there = world[2025]
print("== 2025 жыл")
print(f"Қазақстан: {here} | әлем: {there}")
if here is None:
print("бұл жылдың саны әлі жоқ")
elif here < there:
print("әлемдікінен төмен")
elif here < 2 * there:
print("әлемдікінен жоғары, бірақ екі еседен кем")
else:
print("әлемдікінен екі есе жоғары немесе одан да көп")
print()
print("== 2026 жыл")
future = kz[2026]
if future is None:
print("сан әлі жоқ — салыстыратын нәрсе жоқ")
else:
print("сан бар:", future)
print()
print("== бір шартта екі салыстыру")
if 2.0 <= there < 4.0:
print(f"әлем: {there} — екі мен төрттің арасында")
if here > there and kz[2024] > world[2024]:
print("Қазақстан: әлемдікінен қатарынан екінші жыл жоғары")
Шығатыны:
== 2025 жыл
Қазақстан: 11.4 | әлем: 3.0
әлемдікінен екі есе жоғары немесе одан да көп
== 2026 жыл
сан әлі жоқ — салыстыратын нәрсе жоқ
== бір шартта екі салыстыру
әлем: 3.0 — екі мен төрттің арасында
Қазақстан: әлемдікінен қатарынан екінші жыл жоғары
Талдау
Жақшаның орнына қос нүкте мен шегініс
if here < there:
print("әлемдікінен төмен")
Жол соңындағы қос нүкте «әрі қарай блок» дегенді білдіреді. Блоктың өзі шегініспен — төрт бос орынмен — беріледі. Көп тілде бұл үшін фигуралық жақша керек, Python-да олардың рөлін сол жақтағы бос орын атқарады.
Осыдан жаңадан бастағанның көзге түсетін жалғыз қатесі шығады: жол басқа деңгейге кетіп қалады да, сіз ойлаған сәтте емес, басқа кезде орындалады. Редактор төрт бос орынды өзі қояды; оларды табуляциямен араластыруға болмайды, Python бұған бөлек ескерту береді.
Елестетіп көріңіз. Хаттағы азат жол. Сіз «азат жолдың басы», «азат жолдың соңы» деп жазбайсыз — шегініс жасайсыз, әрі ол көрініп тұрады.
elif — «тағы бір if» емес
Сүрінетін айырма біздің шығуымыздан көрінеді. Тізбек жоғарыдан төмен тексеріледі: 11,4 — None емес, әлемдікінен төмен емес, оның екі еселенгенінен де кіші емес. Бірде-бір шарт орындалмады, сондықтан кезек else-ке жетті де, бір жол басылды.
if — elif — else тізбегі жоғарыдан төмен тексеріледі де, алғаш орындалғанында тоқтайды. Қалғандары мүлде тексерілмейді.
Үш бөлек if — мүлде басқа нәрсе:
if here > there: → орындалады
if here > 2 * there: → бұл да орындалады
Бір жолдың орнына екеу. Бұл тілдің қатесі емес, бұл — әртүрлі құрал: тізбек нұсқалардың біреуін таңдайды, бөлек if-тер бір-біріне тәуелсіз сұрақтарды тексереді.
Соңындағы else — «қалған жағдайлардың бәрінде». Ол міндетті емес, бірақ болмаса, бірде-бір шарт келмегенде ештеңе болмайды — мұны да саналы түрде шешу керек.
Жетіспейтін мән — нөл емес
Сабақтың ең қымбат жолы:
if future is None:
2026 жылдың орнында None тұр — инфляция нөл болғандықтан емес, жыл әлі болмағандықтан. Бұл екеуі бөлек нәрсе, әрі есепте екеуі екі түрлі жауап береді.
Мұны дәл is None арқылы тексеру керек, былай емес:
if future: → None үшін де, 0.0 үшін де False
Типтер сабағынан есіңізде болар: bool(0.0) — жалған. Инфляциясы нөл жыл мұндай тексеруден «дерек жоқ» болып өтеді де, есептен үнсіз жоғалады. is None дәл керегін сұрайды: мән жоқ па.
Мұндағы is сөзі кездейсоқ емес. Ол мәндерді емес, сол объект пе дегенді салыстырады, ал None Python-да жалғыз данада болады — сондықтан дұрыс тексеру де осы.
Бір шартта екі салыстыру
if 2.0 <= there < 4.0:
Математикадағыдай оқылады: «екіден бастап төртке дейін». Көп тілде былай жазуға болмайды, there >= 2.0 and there < 4.0 деп құрастыруға тура келеді; Python салыстыру тізбегін тікелей түсінеді де, there-ді бір рет есептейді.
and, or және тексеру реті
if here > there and kz[2024] > world[2024]:
and — екеуі де ақиқат болғанда ақиқат; or — ең болмаса біреуі ақиқат болғанда; not кері аударады.
Одан маңыздысы: and алғаш кездескен жалғанда тоқтайды, or — алғаш кездескен ақиқатта. Оң жағы мүлде есептелмейді. Осыдан курста әрі қарай үнемі керек болатын тәсіл шығады:
if value is not None and value > 5:
Алдымен санның бар екеніне көз жеткіземіз, содан кейін ғана салыстырамыз. Орнын ауыстырыңыз — жетіспейтін мәнде бағдарлама құлайды, өйткені None > 5 дегенді салыстыруға болмайды.
Бір нәрсе неге үш рет жазылған
Бағдарламаға тағы қараңыз: үш блок, әрқайсысында тағы print, тағы салыстыру. Жыл үшеу емес, отыз болса, былай жазу мүмкін болмас еді.
Келесі екі сабақтың себебі де осы: цикл барлық жылды өзі аралап шығады, ал функция салыстыруға ат беріп, оны қанша керек болса, сонша шақыруға мүмкіндік береді. Әзірге қолмен — олардың неден өсіп шығатыны көрінсін.
Сабақ картасы
Өз сөзіңізбен айтыңыз
Қарамай, дауыстап немесе қағазға жауап беріңіз. Жауаптары — сабақтың соңында.
if — elif — elseтізбегінен неге бір жол басылады, ал үш бөлекif-тен — екеу?if value is Noneдегенніңif not valueдегеннен айырмасы неде, әрі деректе бұл неге маңызды?- Сол жағы жалған болып шыққанда
andне істейді?
Жаттығу
Тапсырмаға дейінгі үш қысқа қадам: болжау, толықтыру, жөндеу. Жауаптары — сабақтың соңында, бірақ алдымен өзіңіз жауап беріңіз.
1. Болжаңыз. Бұл бағдарлама не басып шығарады? Дауыстап айтыңыз да, содан кейін іске қосыңыз.
value = None
if value == 0:
print("нөл")
elif value is None:
print("сан жоқ")
else:
print("сан:", value)
2. Бос орынды толтырыңыз. ... орнына «орташадан кез келген жаққа 5%-дан аспай ауытқиды» деген шартты қойыңыз.
value = 8.3
average = 8.0
if ...:
print("орташаға жуық")
else:
print("орташадан алыс")
3. Жөндеңіз. Бұл бағдарлама екінші жұпта құлайды. Соған себеп болған жолды тауып, екеуі де басылатындай етіңіз.
kz = {2024: 8.7, 2025: None}
for year, value in kz.items():
if value > 8:
print(year, "сегізден жоғары")
elif value is None:
print(year, "сан жоқ")
Тапсырма
Міндетті. Берілгені:
prices = {"қаңтар": 520.0, "ақпан": 580.0, "наурыз": None, "сәуір": 498.0}
Саны бар айлар бойынша орташаны басып шығарыңыз, содан кейін әр айды белгісімен: баға орташадан 5%-дан аспай ауытқыса — «орташаға жуық» (дәл 5% те — «жуық»), әйтпесе «орташадан жоғары» немесе «орташадан төмен»; саны жоқ ай — «дерек жоқ». Тексерулердің реті мынадай: алдымен жетіспейтін мән, содан кейін «жуық», сосын «жоғары» мен «төмен».
Күтілетін шығу:
орташа: 532.67
қаңтар: 520.0 — орташаға жуық
ақпан: 580.0 — орташадан жоғары
наурыз: дерек жоқ
сәуір: 498.0 — орташадан төмен
Дайын болғаны: шығу жол-жолмен сәйкес келеді; орташа төрт емес, үш ай бойынша есептелген; бірде-бір салыстыру None-ға тап болмайды.
Өз деректеріңізде. Өзіңіздің үш саныңызды алыңыз — бір тауардың әр дүкендегі бағасын, чектеріңіз бойынша жеке инфляцияңызды немесе өлшеуге келетін кез келген нәрсені. Әрқайсысын орташамен салыстырып, if — elif — else тізбегімен басып шығарыңыз: «орташадан арзан», «орташаға жуық» (5% шегінде), «орташадан қымбат». Үш санның бірін None қылып, оны бірінші — барлық салыстырудан бұрын — тексеріңіз.
Қалауыңызша.
- Тізбекті үш бөлек
if-пен алмастырып, қанша жол басылатынын қараңыз. - Оң жағын бірінші қойса құлайтын
andшартын жазыңыз. - Өз қатарыңызда тексеріңіз: бес жылдың нешеуі әлемдік инфляциядан жоғары болды?
Жобада бұл қайда тұрады
Шолу бәрін қатарынан санауды қояды. Осы сабақтан бастап оның талғауы пайда болады: олқылығы бар жыл орташаға кірмейді, нормадан жоғары мән белгіленеді, ал қоқысы бар қатар қорытындыны бұзудың орнына бөлек қойылады.
Қарыздар. Шарттар әзірге әр жылға бір-бірден жазылған — циклмен бұл үш жол болады. Ал «нормадан жоғары» дегенін көзбен шешіп отырмыз: норманың қай жерден өтетіні ешқайда жазылмаған.
Жауаптар
Жауаптарды көрсету
Сұрақтарға
- Өйткені тізбек жоғарыдан төмен тексеріледі де, алғаш келген шартта тоқтайды: қалғандары мүлде тексерілмейді. Бөлек
if-тер — бір-біріне тәуелсіз сұрақтар, әрқайсысы орындалуы мүмкін. is Noneмәннің жоқтығын сұрайды.not valueNoneүшін де, нөл үшін де, бос жол үшін де ақиқат — инфляциясы нөл жыл мұндай тексеруден «дерек жоқ» болып есептен жоғалады.- Ештеңе: оң жағы есептелмейді. Сондықтан
value is not None and value > 5қауіпсіз, ал кері рет жетіспейтін мәнде құлайды.
Жаттығуға
сан жоқ.None == 0— бұлFalse: жетіспейтін мән нөлге тең емес, сондықтан бірінші тармақ орындалмайды, ал екіншісіis Noneдеп сұрайды да, дәл келеді.
сан жоқ
abs(value - average) <= average * 0.05. Айырманың модулі — «кез келген жаққа» дегеннің өзі, ал<=дәл 5%-ды да қосады: шекараны бір рет шешіп, жазып қою керек, әйтпесе бір деректе екі адам екі түрлі жауап алады.
value = 8.3
average = 8.0
if abs(value - average) <= average * 0.05:
print("орташаға жуық")
else:
print("орташадан алыс")
орташаға жуық
- Кінәлі —
Noneтұрған жол емес, рет:value > 8бірінші тексеріледі де, 2025 жылда салыстыруNone-ға тап болады —TypeError. Жетіспейтін мәнты барлық салыстырудан бұрын тексереді:
kz = {2024: 8.7, 2025: None}
for year, value in kz.items():
if value is None:
print(year, "сан жоқ")
elif value > 8:
print(year, "сегізден жоғары")
2024 сегізден жоғары
2025 сан жоқ
Пікірлер (0)
Пікір қалдыру үшін кіріңіз →
Әзірге пікір жоқ. Бірінші болыңыз.