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.
print("1. Uyğondim")
print("2. Nonuşta qildim")
print("3. Işga ketdim")
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.
yomgir_yogyapti = True
quyosh_bor = False
print(yomgir_yogyapti)
print(type(quyosh_bor))
Natija:
True
<class 'bool'>
Taqqoslaş operatorlari
Odatda True yoki False qiymatini qölda yozmaymiz, ular taqqoslaş natijasida paydo böladi.
| Operator | Maʼnosi | Misol | Natija |
|---|---|---|---|
== | teng | 5 == 5 | True |
!= | teng emas | 5 != 3 | True |
< | kiçik | 2 < 1 | False |
> | katta | 10 > 3 | True |
<= | kiçik yoki teng | 4 <= 4 | True |
>= | katta yoki teng | 7 >= 9 | False |
narx = 12000
byudjet = 10000
print(narx > byudjet)
print(narx == 12000)
print("olma" == "Olma")
print("anor" < "behi")
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:
harorat = 23
print(18 <= harorat <= 26) # xona uçun qulay haroratmi?
print(1 < harorat < 10)
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:
FalsevaNone- nol:
0,0.0 - böş töplamlar:
"",[],(),{},set()
Qolgan hamma narsa "rost" hisoblanadi. Buni bool() funksiyasi bilan tekşiriş mumkin:
print(bool(0), bool(42))
print(bool(""), bool("salom"))
print(bool([]), bool([1, 2]))
print(bool(None))
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.
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:
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:
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:
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:
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.
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:
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:
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:
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:
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:
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:
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:
Ç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:
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:
ö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:
kun = "şanba"
match kun:
case "şanba" | "yakşanba":
print("Dam oliş kuni")
case "juma":
print("Qisqa iş kuni")
case _:
print("Oddiy iş kuni")
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:
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:
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:
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:
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:
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:
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.
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:
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.
boolturi ikki qiymatga ega:TruevaFalse. Taqqoslaş operatorlari (==,!=,<,>,<=,>=) aynan şularni qaytaradi.0,"",[],Nonekabi "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 alohidaifişlating. x if shart else y— qisqa tanlov,match/case— qiymat va tuzilmalarni namunalar bilan soliştiriş.
Maşqlar
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,2000uçun sinab köring.
Yeçim
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")
- Uçta son (
a,b,c) berilgan.max()funksiyasidan foydalanmasdan eng kattasini toping.
Yeçim
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}")
- 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 (
soat22 dan katta yoki 6 dan kiçik) narx 20% qimmatroq.
Yeçim
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")
matchyordamida oy raqamiga (1–12) qarab fasl nomini çiqaring.
Yeçim
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}")