Shanraq.org Shanraq.org
Шарттар: if, elif, else — және жоқ сан
IT

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,4None емес, әлемдікінен төмен емес, оның екі еселенгенінен де кіші емес. Бірде-бір шарт орындалмады, сондықтан кезек 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, тағы салыстыру. Жыл үшеу емес, отыз болса, былай жазу мүмкін болмас еді.

Келесі екі сабақтың себебі де осы: цикл барлық жылды өзі аралап шығады, ал функция салыстыруға ат беріп, оны қанша керек болса, сонша шақыруға мүмкіндік береді. Әзірге қолмен — олардың неден өсіп шығатыны көрінсін.

Сабақ картасы

Сабақ картасы: айыр, тізбек және жетіспейтін мән

Өз сөзіңізбен айтыңыз

Қарамай, дауыстап немесе қағазға жауап беріңіз. Жауаптары — сабақтың соңында.

  1. if — elif — else тізбегінен неге бір жол басылады, ал үш бөлек if-тен — екеу?
  2. if value is None дегеннің if not value дегеннен айырмасы неде, әрі деректе бұл неге маңызды?
  3. Сол жағы жалған болып шыққанда 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 шартын жазыңыз.
  • Өз қатарыңызда тексеріңіз: бес жылдың нешеуі әлемдік инфляциядан жоғары болды?

Жобада бұл қайда тұрады

Шолу бәрін қатарынан санауды қояды. Осы сабақтан бастап оның талғауы пайда болады: олқылығы бар жыл орташаға кірмейді, нормадан жоғары мән белгіленеді, ал қоқысы бар қатар қорытындыны бұзудың орнына бөлек қойылады.

Қарыздар. Шарттар әзірге әр жылға бір-бірден жазылған — циклмен бұл үш жол болады. Ал «нормадан жоғары» дегенін көзбен шешіп отырмыз: норманың қай жерден өтетіні ешқайда жазылмаған.

Жауаптар

Жауаптарды көрсету

Сұрақтарға

  1. Өйткені тізбек жоғарыдан төмен тексеріледі де, алғаш келген шартта тоқтайды: қалғандары мүлде тексерілмейді. Бөлек if-тер — бір-біріне тәуелсіз сұрақтар, әрқайсысы орындалуы мүмкін.
  2. is None мәннің жоқтығын сұрайды. not value None үшін де, нөл үшін де, бос жол үшін де ақиқат — инфляциясы нөл жыл мұндай тексеруден «дерек жоқ» болып есептен жоғалады.
  3. Ештеңе: оң жағы есептелмейді. Сондықтан value is not None and value > 5 қауіпсіз, ал кері рет жетіспейтін мәнде құлайды.

Жаттығуға

  1. сан жоқ. None == 0 — бұл False: жетіспейтін мән нөлге тең емес, сондықтан бірінші тармақ орындалмайды, ал екіншісі is None деп сұрайды да, дәл келеді.
сан жоқ
  1. abs(value - average) <= average * 0.05. Айырманың модулі — «кез келген жаққа» дегеннің өзі, ал <= дәл 5%-ды да қосады: шекараны бір рет шешіп, жазып қою керек, әйтпесе бір деректе екі адам екі түрлі жауап алады.
value = 8.3
average = 8.0
if abs(value - average) <= average * 0.05:
    print("орташаға жуық")
else:
    print("орташадан алыс")
орташаға жуық
  1. Кінәлі — 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 сан жоқ

Дереккөздер

Мәтінде қате не теру қатесі кездессе, бізге айтыңыз

Тапсырманы тексеру

Алдымен VS Code-та шешіп, іске қосыңыз — редактор қатені сол жерде көрсетеді. Дайын шешімді осында қойыңыз. Тексеретін — модель: ол қатені атап көрсетеді, бірақ дайын жауапты бермейді.

Тексеру үшін кіру керек. Кіру

Пікірлер (0)

Әзірге пікір жоқ. Бірінші болыңыз.