OzbekPython / Bob 09

Şartli holatlar

Dastur qanday qaror qabul qiladi — True/False, taqqoslaş, and/or/not, if-elif-else va namunaga moslaş.

Boşlanğiç daraja22 daqiqa22 kod misoli9 / 24

Dastur yuqoridan pastga işlaydi

Hozirgaça yozgan dasturlarimiz juda oddiy yöldan yurardi: Python birinçi qatorni bajaradi, keyin ikkinçisini, keyin uçinçisini va hokazo. Heç bir qator taşlab ketilmaydi, heç biri ikki marta bajarilmaydi.

Python
print("1. Uyğondim")
print("2. Nonuşta qildim")
print("3. Işga ketdim")

Natija:

Natija
1. Uyğondim
2. Nonuşta qildim
3. Işga ketdim

Lekin hayotda biz doim qaror qabul qilamiz: "Agar yomğir yoğsa, soyabon olaman, aks holda olmayman." Dastur ham şunday bölişi kerak: maʼlum şart bajarilsa bir işni, bajarilmasa boşqa işni qilişi lozim. Bu bobda aynan şu haqida gaplaşamiz.

Mantiqiy qiymatlar: True va False

Har qanday qaror ortida bitta savol turadi: bu rostmi yoki yolğonmi? Pythonda buning uçun maxsus bool turi bor va u faqat ikkita qiymatga ega: True (rost) va False (yolğon). Ular katta harf bilan boşlanişiga eʼtibor bering: true deb yozsangiz, NameError xatosi çiqadi.

Python
yomgir_yogyapti = True
quyosh_bor = False

print(yomgir_yogyapti)
print(type(quyosh_bor))

Natija:

Natija
True
<class 'bool'>

Taqqoslaş operatorlari

Odatda True yoki False qiymatini qölda yozmaymiz, ular taqqoslaş natijasida paydo böladi.

OperatorMaʼnosiMisolNatija
==teng5 == 5True
!=teng emas5 != 3True
<kiçik2 < 1False
>katta10 > 3True
<=kiçik yoki teng4 <= 4True
>=katta yoki teng7 >= 9False
Python
narx = 12000
byudjet = 10000

print(narx > byudjet)
print(narx == 12000)
print("olma" == "Olma")
print("anor" < "behi")

Natija:

Natija
True
True
False
True

Satrlar ham taqqoslanadi: katta-kiçik harf farq qiladi, < esa alifbo tartibini tekşiradi.

Pythonda taqqoslaşlarni zanjir qilib yoziş mumkin. Bu matematikadagi yozuvga juda öxşaydi va kodni öqişni osonlaştiradi:

Python
harorat = 23

print(18 <= harorat <= 26)   # xona uçun qulay haroratmi?
print(1 < harorat < 10)

Natija:

Natija
True
False

18 <= harorat <= 26 yozuvi aslida 18 <= harorat and harorat <= 26 bilan bir xil, faqat qisqaroq.

Rostlik (truthiness)

Pythonda faqat True va False emas, har qanday qiymat şart sifatida işlatilişi mumkin. Quyidagilar "yolğon" deb hisoblanadi:

  • False va None
  • nol: 0, 0.0
  • böş töplamlar: "", [], (), {}, set()

Qolgan hamma narsa "rost" hisoblanadi. Buni bool() funksiyasi bilan tekşiriş mumkin:

Python
print(bool(0), bool(42))
print(bool(""), bool("salom"))
print(bool([]), bool([1, 2]))
print(bool(None))

Natija:

Natija
False True
False True
False True
False

Bu xususiyat amalda juda qulay: if savat: deb yozsangiz, "savatda biror narsa bormi?" degan maʼnoni beradi.

Mantiqiy operatorlar: and, or, not

Bir neçta şartni birlaştiriş uçun uçta söz bor:

  • and — ikkala şart ham rost bölsa, natija rost.
  • or — kamida bittasi rost bölsa, natija rost.
  • not — qiymatni teskarisiga aylantiradi.
Python
yosh = 20
guvohnoma_bor = True

print(yosh >= 18 and guvohnoma_bor)   # maşina hayday oladimi?
print(yosh < 7 or yosh > 65)          # bepul çipta?
print(not guvohnoma_bor)

Natija:

Natija
True
False
False

Qisqa tutaşuv (short-circuit)

Python dangasa, lekin aqlli: and ifodasida birinçi qism False bölsa, ikkinçisiga qaramaydi ham, çunki natija baribir False. or ifodasida esa birinçi qism rost bölsa, qolganini tekşirmaydi. Bu xatolardan saqlaydi:

Python
talabalar_soni = 0
umumiy_ball = 0

# Agar talabalar_soni 0 bölsa, böliş umuman bajarilmaydi
if talabalar_soni > 0 and umumiy_ball / talabalar_soni > 50:
    print("Örtaça yaxşi")
else:
    print("Ma'lumot yetarli emas")

ism = ""
print(ism or "Mehmon")

Natija:

Natija
Ma'lumot yetarli emas
Mehmon

Agar and bölmaganida, 0 ga böliş ZeroDivisionError xatosini bergan bölardi. Oxirgi qatordagi ism or "Mehmon" esa ism böş bölsa standart qiymatni qaytaradi — bu juda köp işlatiladigan usul.

if, else va elif

Endi asosiy qismga ötamiz. if blokining tuzilişi:

Python
if shart:
    bajariladigan_ish()   # şart rost bölsa işlaydi

Ikki nuqta (:) va keyingi qatorlarning 4 böş joy bilan surilişi (indent) şart. Aynan şu suriliş qaysi qatorlar if ga tegişli ekanini körsatadi.

Python
balans = 50000
narx = 35000

if balans >= narx:
    balans -= narx
    print("Xarid amalga oşirildi")
else:
    print("Mablag' yetarli emas")

print(f"Qolgan balans: {balans} söm")

Natija:

Natija
Xarid amalga oşirildi
Qolgan balans: 15000 söm

Oxirgi print() surilmagan, şuning uçun u har doim bajariladi.

Ikkidan köp variant bölsa, elif (else if — "aks holda, agar") işlatiladi. Python şartlarni yuqoridan pastga tekşiradi va birinçi rost çiqqan şartning blokini bajaradi, qolganlarini taşlab ketadi:

Python
harorat = 8

if harorat < 0:
    print("Sovuq! Issiq kiyining.")
elif harorat < 15:
    print("Salqin. Kurtka oling.")
elif harorat < 25:
    print("Havo yoqimli.")
else:
    print("Issiq! Suv içing.")

Natija:

Natija
Salqin. Kurtka oling.

if-if-if va if-elif farqi

Yangi boşlovçilar köp qiladigan xato: bir-birini istisno qiladigan şartlarni alohida if lar bilan yoziş. Farqni köring:

Python
ball = 95

print("if-if-if:")
if ball >= 90:
    print("  A")
if ball >= 70:
    print("  B")
if ball >= 50:
    print("  C")

print("if-elif:")
if ball >= 90:
    print("  A")
elif ball >= 70:
    print("  B")
elif ball >= 50:
    print("  C")

Natija:

Natija
if-if-if:
  A
  B
  C
if-elif:
  A

Alohida if larning har biri mustaqil tekşiriladi, şuning uçun 95 ball uçta baho oldi. elif zanjirida esa birinçi mos kelgan şart işlaydi. Qoida oddiy: variantlardan faqat bittasi tanlanişi kerak bölsa — elif, har bir şart mustaqil bölsa — alohida if.

Içma-iç şartlar

Bir if içida boşqa if yoziş mumkin. Masalan, kitob dökonida çegirma hisoblaymiz:

Python
summa = 320000
doimiy_mijoz = True

if summa >= 200000:
    if doimiy_mijoz:
        chegirma = 15
    else:
        chegirma = 10
else:
    chegirma = 0

tolov = summa * (100 - chegirma) / 100
print(f"Çegirma: {chegirma}%, tölov: {tolov:,.0f} söm")

Natija:

Natija
Çegirma: 15%, tölov: 272,000 söm

Şartli ifoda: x if shart else y

Ikki qiymatdan birini tanlaş uçun tört qatorli if-else örniga bitta qatorli şartli ifoda işlatiş mumkin:

Python
yosh = 16
holat = "kattalar" if yosh >= 18 else "ösmir"
print(holat)

son = 7
print(f"{son} - {'juft' if son % 2 == 0 else 'toq'} son")

Natija:

Natija
ösmir
7 - toq son

Uni faqat oddiy holatlarda işlating. Murakkab mantiq uçun oddiy if blok tuşunarliroq.

match va case (Python 3.10+)

Python 3.10 versiyasidan boşlab match operatori paydo böldi. U bitta qiymatni bir neçta namuna (pattern) bilan soliştiradi. Oddiy holatda u uzun if-elif zanjirining çiroyli körinişi:

Python
kun = "şanba"

match kun:
    case "şanba" | "yakşanba":
        print("Dam oliş kuni")
    case "juma":
        print("Qisqa iş kuni")
    case _:
        print("Oddiy iş kuni")

Natija:

Natija
Dam oliş kuni

| belgisi "yoki" maʼnosini beradi, _ esa "qolgan hamma holatlar" degani (else ga öxşaş).

Lekin matchning haqiqiy kuçi — tuzilmalarni oçib olişda. Masalan, terminal buyruqlarini qayta işlovçi kiçik dastur:

Python
def bajar(buyruq: str) -> str:
    match buyruq.split():
        case ["salom"]:
            return "Salom! Qalaysiz?"
        case ["qöş", a, b]:
            return f"Yiğindi: {int(a) + int(b)}"
        case ["kurs", valyuta] if valyuta in ("usd", "eur"):
            return f"{valyuta.upper()} kursini sörayapsiz"
        case ["çiqiş" | "exit"]:
            return "Xayr!"
        case _:
            return "Noma'lum buyruq"

print(bajar("salom"))
print(bajar("qöş 12 30"))
print(bajar("kurs usd"))
print(bajar("kurs rub"))
print(bajar("exit"))

Natija:

Natija
Salom! Qalaysiz?
Yiğindi: 42
USD kursini sörayapsiz
Noma'lum buyruq
Xayr!

Bu yerda case ["qöş", a, b] röyxat aynan uçta elementdan iborat va birinçisi "qöş" bölsa mos keladi, qolgan ikkitasi avtomatik ravişda a va b özgaruvçilariga yoziladi. if valyuta in ... qismi esa qöriqçi (guard) deyiladi — namuna mos kelgandan keyin qöşimça şart tekşiriladi. Funksiyalar (def) haqida 11-bobda batafsil gaplaşamiz.

Amaliyot: baho hisoblagiç

Talabaning ballini (0–100) baholaş tizimiga ötkazamiz:

Python
ball = 78

if not 0 <= ball <= 100:
    baho = "Xato ball"
elif ball >= 86:
    baho = "5 (a'lo)"
elif ball >= 71:
    baho = "4 (yaxşi)"
elif ball >= 56:
    baho = "3 (qoniqarli)"
else:
    baho = "2 (qoniqarsiz)"

print(f"{ball} ball -> {baho}")

Natija:

Natija
78 ball -> 4 (yaxşi)

Eʼtibor bering: avval notöğri qiymatlarni tekşirib oldik, keyin eng yuqori çegaradan pastga qarab bordik. elif tufayli har bir şartda pastki çegarani yoziş kifoya.

Amaliyot: oddiy kalkulyator

match bilan tört amalni bajaruvçi kalkulyator:

Python
a = 84
b = 0
amal = "/"

match amal:
    case "+":
        print(a + b)
    case "-":
        print(a - b)
    case "*":
        print(a * b)
    case "/" if b == 0:
        print("Nolga böliş mumkin emas!")
    case "/":
        print(a / b)
    case _:
        print(f"'{amal}' amali qöllab-quvvatlanmaydi")

Natija:

Natija
Nolga böliş mumkin emas!

b ni 0 dan boşqa songa özgartirib, natijani tekşirib köring.

Amaliyot: login tekşiruvi

Foydalanuvçi nomi va parolni tekşiruvçi oddiy misol. Haqiqiy tizimlarda parollar heç qaçon oçiq matn sifatida saqlanmaydi — bu faqat öquv misoli.

Python
TOGRI_LOGIN = "dilnoza"
TOGRI_PAROL = "olma2024"

login = "dilnoza"
parol = "olma2023"
urinishlar_qoldi = 2

if not login or not parol:
    print("Login va parolni kiriting")
elif login != TOGRI_LOGIN:
    print("Bunday foydalanuvçi topilmadi")
elif parol == TOGRI_PAROL:
    print(f"Xuş kelibsiz, {login.title()}!")
elif urinishlar_qoldi > 0:
    print(f"Parol notöğri. Yana {urinishlar_qoldi} ta uriniş qoldi.")
else:
    print("Hisob vaqtinça bloklandi")

Natija:

Natija
Parol notöğri. Yana 2 ta uriniş qoldi.

Agar qiymatlarni foydalanuvçidan söramoqçi bölsangiz, login = input("Login: ") deb yozişingiz mumkin.

Xulosa

  • Dastur odatda yuqoridan pastga işlaydi, şartlar esa qaysi qatorlar bajarilişini tanlaş imkonini beradi.
  • bool turi ikki qiymatga ega: True va False. Taqqoslaş operatorlari (==, !=, <, >, <=, >=) aynan şularni qaytaradi.
  • 0, "", [], None kabi "böş" qiymatlar yolğon, qolganlari rost hisoblanadi.
  • and, or, not şartlarni birlaştiradi; qisqa tutaşuv keraksiz hisob-kitobni oldini oladi.
  • Bir-birini istisno qiluvçi variantlar uçun if-elif-else, mustaqil tekşiruvlar uçun alohida if işlating.
  • x if shart else y — qisqa tanlov, match/case — qiymat va tuzilmalarni namunalar bilan soliştiriş.

Maşqlar

  1. yil özgaruvçisi kabisa yilimi yoki yöqmi, aniqlang. Qoida: 4 ga bölinadi, lekin 100 ga bölinmaydi; yoki 400 ga bölinadi. 2024, 1900, 2000 uçun sinab köring.
Yeçim
Python
yil = 1900   # 2024 va 2000 ni ham sinab köring

kabisa = (yil % 4 == 0 and yil % 100 != 0) or yil % 400 == 0
print(yil, "kabisa" if kabisa else "kabisa emas")
  1. Uçta son (a, b, c) berilgan. max() funksiyasidan foydalanmasdan eng kattasini toping.
Yeçim
Python
a, b, c = 14, 72, 39

if a >= b and a >= c:
    eng_katta = a
elif b >= c:
    eng_katta = b
else:
    eng_katta = c

print(f"Eng katta son: {eng_katta}")
  1. Taksi narxini hisoblang: birinçi 3 km uçun 12 000 söm, keyingi har bir km uçun 2 500 söm. Tungi vaqtda (soat 22 dan katta yoki 6 dan kiçik) narx 20% qimmatroq.
Yeçim
Python
masofa = 8   # km
soat = 23

if masofa <= 3:
    narx = 12000
else:
    narx = 12000 + (masofa - 3) * 2500

if soat >= 22 or soat < 6:
    narx *= 1.2

print(f"Tölov: {narx:,.0f} söm")
  1. match yordamida oy raqamiga (1–12) qarab fasl nomini çiqaring.
Yeçim
Python
oy = 4

match oy:
    case 12 | 1 | 2:
        fasl = "qiş"
    case 3 | 4 | 5:
        fasl = "bahor"
    case 6 | 7 | 8:
        fasl = "yoz"
    case 9 | 10 | 11:
        fasl = "kuz"
    case _:
        fasl = "notöğri oy"

print(f"{oy}-oy: {fasl}")