Mundarija (23)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Sintaksis
- 2.2. Nima uchun bunday tartib
- 2.3. Prioritet — eng past
- 2.4. Qachon ishlatish
- 2.5. Zanjirlash
- 2.6. Muqobillar
- 2.7. Ro'yxat generatorlarida
- 2.8. Uchlik operator va tur ishoralari
- 2.9. Yon ta'sirlar va dangasa hisoblash
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Asoslar va prioritet
- Misol 2 — Muqobillar
- Misol 3 — Ro'yxat generatorlarida
- Misol 4 — Qachon ishlatmaslik
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
5.4-dars: Uchlik operator
5-QISM — BOSHQARUV OQIMI · 4-dars
1. Kirish va motivatsiya
Ba'zan shart shunchalik sodda-ki, to'liq if/else bloki ortiqcha tuyuladi:
if yosh >= 18:
holat = "voyaga yetgan"
else:
holat = "voyaga yetmagan"To'rt qator — bitta o'zlashtirish uchun. Python qisqaroq yo'l beradi:
holat = "voyaga yetgan" if yosh >= 18 else "voyaga yetmagan"Bu — uchlik operator (ternary operator), yoki Python atamasi bilan shartli ifoda (conditional expression).
Lekin u bilan ehtiyot bo'lish kerak:
# ⚠️ O'qish qiyin
baho = "A" if b >= 90 else "B" if b >= 80 else "C" if b >= 70 else "D"
# ❌ Prioritet tuzog'i
matn = "Natija: " + "ha" if shart else "yo'q"
# ❌ Yon ta'sir
x = ishla() if shart else boshqa_ishla() # ikkalasi ham funksiya chaqiruviBu darsda:
- Sintaksis va nima uchun bunday tartib
- Qachon ishlatish, qachon ishlatmaslik
- Prioritet va qavs muammosi
- Zanjirlash va uning chegaralari
- Muqobillar:
or, lug'at,min/max
2. Nazariya — chuqur tushuntirish
2.1. Sintaksis
<qiymat_rost> if <shart> else <qiymat_yolg'on>yosh = 25
holat = "katta" if yosh >= 18 else "kichik"
print(holat) # 'katta'Bajarilish tartibi:
1. <shart> hisoblanadi
2. Rost bo'lsa → <qiymat_rost> hisoblanadi va qaytariladi
3. Yolg'on bo'lsa → <qiymat_yolg'on> hisoblanadi va qaytariladiFaqat bittasi hisoblanadi — bu qisqa tutashuvga o'xshash (3.5-dars):
def a():
print(" a chaqirildi")
return 1
def b():
print(" b chaqirildi")
return 2
print("shart rost:")
x = a() if True else b()
print(f" natija: {x}")
print("shart yolg'on:")
x = a() if False else b()
print(f" natija: {x}")shart rost:
a chaqirildi
natija: 1
shart yolg'on:
b chaqirildi
natija: 22.2. Nima uchun bunday tartib
Ko'p tilda uchlik operator boshqacha:
C, Java, JS: shart ? rost : yolg'on
Python: rost if shart else yolg'onNega Python boshqacha?
Guido van Rossum tushuntirishicha (PEP 308):
- Odatiy holat oldinda. Ko'p holatda
shart— istisno,rost— asosiy qiymat:
qiymat = malumot["kalit"] if "kalit" in malumot else sukut
# ^^^^^^^^^^^^^^^^ — asosiy narsa, oldindaIngliz tiliga yaqin: "X if Y else Z" — tabiiy o'qiladi.
?va:band.:— bloklar, kesimlar va lug'atlarda ishlatiladi.
Boshqa tildan kelganlar uchun chalkash:
# JavaScript odati
# x = shart ? a : b
# Python
x = a if shart else bBa'zan miya avtomatik shart ni oldinda kutadi. Bir necha haftada o'tib ketadi.
2.3. Prioritet — eng past
3.12-darsda ko'rgandik: shartli ifoda — eng past prioritetli operatorlardan biri (lambda va := dan tashqari).
shart = True
# ⚠️ Kutilmagan natija
matn = "Natija: " + "ha" if shart else "yo'q"
print(matn) # 'Natija: ha'
# = ("Natija: " + "ha") if shart else "yo'q"
# ✅ Aniq
matn = "Natija: " + ("ha" if shart else "yo'q")
print(matn) # 'Natija: ha'Birinchi holatda natija tasodifan to'g'ri ko'rinadi. Lekin shart = False bo'lsa:
shart = False
matn = "Natija: " + "ha" if shart else "yo'q"
print(matn) # 'yo'q' ← "Natija: " yo'qoldi!Qoida:
Uchlik operatorni boshqa ifoda ichida ishlatganda doim qavs qo'ying.
Arifmetika bilan:
x = 5
print(1 + 2 if x > 3 else 10) # 3 = (1+2) if ... else 10
print(1 + (2 if x > 3 else 10)) # 3 ✅ aniq
print((1 + 2) if x > 3 else 10) # 3 ✅ aniqf-satr ichida:
soni = 1
print(f"{soni} ta {'element' if soni == 1 else 'elementlar'}")f-satr ichida qavs shart emas, chunki {} allaqachon chegaralaydi.
Ro'yxat va funksiya argumentlarida:
royxat = [1 if a else 2, 3 if b else 4] # ✅ vergul chegaralaydi
f(1 if a else 2) # ✅
f(x, 1 if a else 2, y) # ✅2.4. Qachon ishlatish
Yaxshi holatlar:
1. Sodda o'zlashtirish:
holat = "faol" if user.faol else "nofaol"
belgi = "✅" if muvaffaqiyat else "❌"2. Formatlashda:
print(f"{soni} ta {'fayl' if soni == 1 else 'fayllar'}")
print(f"{summa:,} {'soʻm' if valyuta == 'UZS' else valyuta}")3. Funksiya argumenti:
saqla(malumot, format="json" if json_kerak else "csv")4. Ro'yxat generatorida (6-qism):
natija = [x if x > 0 else 0 for x in sonlar]5. Sukut qiymat (None bilan):
soni = kirish if kirish is not None else 106. return da:
def belgi(x):
return "musbat" if x > 0 else "manfiy" if x < 0 else "nol"Yomon holatlar:
1. Uzun ifodalar:
# ❌
natija = hisobla_murakkab(a, b, c) if tekshir(x, y) and boshqa(z) else sukut_qiymat(d, e)
# ✅
if tekshir(x, y) and boshqa(z):
natija = hisobla_murakkab(a, b, c)
else:
natija = sukut_qiymat(d, e)2. Yon ta'sirlar:
# ❌ Ifoda yon ta'sir uchun ishlatilyapti
saqla() if shart else ochir()
# ✅ Buyruq
if shart:
saqla()
else:
ochir()3. Chuqur zanjirlash:
# ❌ O'qish qiyin
baho = "A" if b >= 90 else "B" if b >= 80 else "C" if b >= 70 else "D"
# ✅ if/elif
if b >= 90: baho = "A"
elif b >= 80: baho = "B"
...4. Ikkala tarmoqda ham murakkab mantiq:
# ❌
x = [i * 2 for i in a if i > 0] if shart else {k: v for k, v in b.items()}
# ✅ Alohida
if shart:
x = [i * 2 for i in a if i > 0]
else:
x = {k: v for k, v in b.items()}Amaliy chegara:
Bir qatorga sig'sa va bir qarashda tushunarli bo'lsa — uchlik operator. Aks holda —
if/else.
2.5. Zanjirlash
Uchlik operator o'ngdan chapga guruhlanadi:
a if p else b if q else c
# = a if p else (b if q else c)ball = 85
baho = ("A" if ball >= 90 else
"B" if ball >= 80 else
"C" if ball >= 70 else
"D")
print(baho) # 'B'Ko'p qatorli formatlash o'qishni yaxshilaydi, lekin uch bosqichdan ko'pi — if/elif yoki lug'at yaxshiroq.
Solishtiring:
# Uchlik zanjiri — 4 qator
baho = ("A" if ball >= 90 else
"B" if ball >= 80 else
"C" if ball >= 70 else "D")
# if/elif — 8 qator, lekin o'qish oson
if ball >= 90:
baho = "A"
elif ball >= 80:
baho = "B"
elif ball >= 70:
baho = "C"
else:
baho = "D"
# Funksiya — qayta ishlatiladigan
def baho_aniqla(ball: int) -> str:
if ball >= 90: return "A"
if ball >= 80: return "B"
if ball >= 70: return "C"
return "D"
# Jadval — sozlanadigan
CHEGARALAR = [(90, "A"), (80, "B"), (70, "C"), (0, "D")]
def baho_aniqla(ball: int) -> str:
return next(b for ch, b in CHEGARALAR if ball >= ch)next() bilan — 10-qismda o'rganamiz.
2.6. Muqobillar
1. or — sukut qiymat uchun (3.5-dars):
# Uchlik
ism = kirish if kirish else "Mehmon"
# or — qisqaroq
ism = kirish or "Mehmon" Lekin 0 va "" uchun farq qiladi:
soni = kirish or 10 # 0 → 10 ❌
soni = kirish if kirish is not None else 10 # 0 → 0 ✅2. Lug'at — ko'p variant uchun:
# ❌ Uzun zanjir
rang = ("qizil" if holat == "xato"
else "sariq" if holat == "ogoh"
else "yashil" if holat == "ok"
else "kulrang")
# ✅ Lug'at
RANGLAR = {"xato": "qizil", "ogoh": "sariq", "ok": "yashil"}
rang = RANGLAR.get(holat, "kulrang")3. min / max — chegaralash:
# ❌
x = 100 if qiymat > 100 else qiymat
x = 0 if qiymat < 0 else qiymat
# ✅
x = min(qiymat, 100)
x = max(qiymat, 0)
x = max(0, min(qiymat, 100)) # 0..100 oralig'igaChegaralash funksiyasi:
def chegarala(qiymat, past, yuqori):
return max(past, min(qiymat, yuqori))4. abs, bool va boshqa ichki funksiyalar:
# ❌
x = -a if a < 0 else a
b = True if x else False
# ✅
x = abs(a)
b = bool(x)5. Mantiqiy natija — to'g'ridan-to'g'ri:
# ❌
katta = True if x > 5 else False
# ✅
katta = x > 5Ruff: SIM210, SIM211.
6. getattr / .get — atribut yoki kalit:
# ❌
qiymat = obyekt.atribut if hasattr(obyekt, "atribut") else sukut
# ✅
qiymat = getattr(obyekt, "atribut", sukut)# ❌
qiymat = lugat["kalit"] if "kalit" in lugat else sukut
# ✅
qiymat = lugat.get("kalit", sukut)2.7. Ro'yxat generatorlarida
Bu — uchlik operatorning eng foydali qo'llanishlaridan biri (6-qism):
sonlar = [-3, 5, -1, 8, 0]
# Har element uchun qiymat tanlash
natija = [x if x > 0 else 0 for x in sonlar]
print(natija) # [0, 5, 0, 8, 0] if ning ikki xil o'rni — farqi:
sonlar = [-3, 5, -1, 8, 0]
# 1. Uchlik operator — QIYMATNI tanlaydi (for dan OLDIN)
print([x if x > 0 else 0 for x in sonlar]) # [0, 5, 0, 8, 0]
# 2. Filtr — ELEMENTNI tanlaydi (for dan KEYIN)
print([x for x in sonlar if x > 0]) # [5, 8]
# 3. Ikkalasi
print([x * 2 if x > 0 else 0 for x in sonlar if x != 0]) # [0, 10, 0, 16]| Joylashuv | Vazifasi | Natija uzunligi |
|---|---|---|
for dan oldin |
Qiymatni o'zgartirish | O'zgarmaydi |
for dan keyin |
Elementni filtrlash | Kamayishi mumkin |
else siz filtr for dan oldin bo'la olmaydi:
# [x if x > 0 for x in sonlar] # ❌ SyntaxError
[x for x in sonlar if x > 0] # ✅ filtr
[x if x > 0 else 0 for x in sonlar] # ✅ uchlikAmaliy misollar:
# Matnni tozalash
qatorlar = [" a ", "", "b", " "]
print([q.strip() or "(bo'sh)" for q in qatorlar])
# ['a', "(bo'sh)", 'b', "(bo'sh)"]
# Turlarni normallashtirish
xom = ["1", "abc", "3", None, "5"]
print([int(x) if x and x.isdecimal() else 0 for x in xom])
# [1, 0, 3, 0, 5]
# Belgilar
holatlar = [True, False, True, True]
print(["✅" if h else "❌" for h in holatlar])
# ['✅', '❌', '✅', '✅']2.8. Uchlik operator va tur ishoralari
def formatla(qiymat: int | None) -> str:
return str(qiymat) if qiymat is not None else "—"Pylance tur toraytirish qiladi (3.6-dars):
def uzunlik(matn: str | None) -> int:
return len(matn) if matn is not None else 0
# ^^^^^^^^^^ — Pylance biladi: matn bu yerda strTurlar mos kelmasa — birlashma turi:
qiymat = 42 if shart else "matn" # int | strBu — yaroqli, lekin keyingi kodda ehtiyot bo'lish kerak:
qiymat = 42 if shart else "matn"
# qiymat + 1 # ❌ str bo'lsa xatoYaxshiroq — bir xil tur:
qiymat: int = 42 if shart else 0 # ✅
matn: str = "ha" if shart else "yo'q" # ✅13-qismda batafsil.
2.9. Yon ta'sirlar va dangasa hisoblash
Faqat bir tarmoq hisoblanadi — bu muhim xususiyat:
# ✅ Xavfsiz — nolga bo'lish yo'q
ortacha = jami / soni if soni else 0
# ✅ Xavfsiz — bo'sh ro'yxat
birinchi = royxat[0] if royxat else None
# ✅ Xavfsiz — None tekshiruvi
uzunlik = len(matn) if matn is not None else 0Qimmat amallar:
# ✅ Faqat kerak bo'lsa hisoblanadi
natija = keshdan_ol(k) if keshda_bor(k) else bazadan_ol(k)Lekin yon ta'sir uchun ishlatmang:
# ❌ Ifoda buyruq sifatida
log("ok") if muvaffaqiyat else log("xato")
# ✅ Buyruq
if muvaffaqiyat:
log("ok")
else:
log("xato")
# ✅ Yoki
log("ok" if muvaffaqiyat else "xato")Ruff bunday naqshni topmaydi, lekin bu — noidiomatik uslub.
Morj operatori bilan (3.12-dars):
natija = n * 2 if (n := hisobla()) > 0 else 0Bu — ishlaydi, lekin o'qish qiyin. Ehtiyot bo'ling.
3. Tez ma'lumotnoma
Sintaksis
<rost_qiymat> if <shart> else <yolgon_qiymat>
x = "katta" if a > b else "kichik"Prioritet — eng past
"a: " + "x" if c else "y" ❌ ("a: " + "x") if c else "y"
"a: " + ("x" if c else "y") ✅Zanjirlash (o'ngdan chapga)
a if p else b if q else c
= a if p else (b if q else c)
⚠️ Uch bosqichdan ko'pi → if/elif yoki lug'atMuqobillar
x if x else sukut → x or sukut (⚠️ 0, "" bilan)
x if c else y → LUG'AT (ko'p variant)
100 if x > 100 else x → min(x, 100)
0 if x < 0 else x → max(x, 0)
True if c else False → c (SIM210)
d[k] if k in d else s → d.get(k, s)
o.a if hasattr(o,"a") else s → getattr(o, "a", s)Ro'yxat generatorida
[x if c else y for x in y] QIYMAT tanlash (for dan OLDIN)
[x for x in y if c] FILTR (for dan KEYIN)
[x if c else y for x in y if z] ikkalasiQachon ishlatish
✅ Bir qatorga sig'sa va bir qarashda tushunarli bo'lsa
✅ Formatlashda, funksiya argumentida, generatorda
❌ Uzun ifodalar, yon ta'sirlar, chuqur zanjirlash4. Batafsil misollar
Misol 1 — Asoslar va prioritet
"""Uchlik operator — sintaksis va tuzoqlar."""
print("=== 1. Faqat bir tarmoq hisoblanadi ===")
chaqiruvlar = []
def a():
chaqiruvlar.append("a")
return 1
def b():
chaqiruvlar.append("b")
return 2
for shart in [True, False]:
chaqiruvlar.clear()
natija = a() if shart else b()
print(f" shart={shart!s:<6} natija={natija} chaqirilgan: {chaqiruvlar}")
print("\n\n=== 2. ⚠️ Prioritet tuzog'i ===")
for shart in [True, False]:
qavssiz = "Natija: " + "ha" if shart else "yo'q"
qavs = "Natija: " + ("ha" if shart else "yo'q")
belgi = " ⚠️" if qavssiz != qavs else ""
print(f" shart={shart!s:<6}")
print(f" Qavssiz: {qavssiz!r}")
print(f" Qavs bilan: {qavs!r}{belgi}")
print("\n\n=== 3. Arifmetika bilan ===")
x = 5
misollar = [
("1 + 2 if x > 3 else 10", 1 + 2 if x > 3 else 10),
("1 + (2 if x > 3 else 10)", 1 + (2 if x > 3 else 10)),
("(1 + 2) if x > 3 else 10", (1 + 2) if x > 3 else 10),
("1 + 2 if x > 10 else 100", 1 + 2 if x > 10 else 100),
("1 + (2 if x > 10 else 100)", 1 + (2 if x > 10 else 100)),
]
for kod, natija in misollar:
print(f" {kod:<30} → {natija}")
print("\n\n=== 4. Qavs kerak bo'lmagan joylar ===")
a_val, b_val = True, False
print(f" f-satr: {f'{1 if a_val else 2}'}")
print(f" ro'yxat: {[1 if a_val else 2, 3 if b_val else 4]}")
print(f" argument: {max(1 if a_val else 2, 5)}")
print(f" lug'at: {dict(k=1 if a_val else 2)}")
print("\n Bu joylarda chegaralar aniq — qavs shart emas.")
print("\n\n=== 5. Zanjirlash ===")
BALLAR = [95, 85, 75, 65, 45]
def baho_uchlik(b: int) -> str:
return ("A" if b >= 90 else
"B" if b >= 80 else
"C" if b >= 70 else
"D" if b >= 60 else "F")
def baho_if(b: int) -> str:
if b >= 90: return "A"
if b >= 80: return "B"
if b >= 70: return "C"
if b >= 60: return "D"
return "F"
CHEGARALAR = [(90, "A"), (80, "B"), (70, "C"), (60, "D"), (0, "F")]
def baho_jadval(b: int) -> str:
return next(baho for chegara, baho in CHEGARALAR if b >= chegara)
print(f" {'Ball':>6} {'Uchlik':>8} {'if':>8} {'Jadval':>8}")
print(" " + "─" * 34)
for b in BALLAR:
u, i, j = baho_uchlik(b), baho_if(b), baho_jadval(b)
assert u == i == j
print(f" {b:>6} {u:>8} {i:>8} {j:>8}")
print("\n\n=== 6. O'ngdan chapga guruhlash ===")
print("""
a if p else b if q else c
= a if p else (b if q else c) ← o'ngdan chapga
Tekshirish:""")
p, q = False, True
natija1 = "a" if p else "b" if q else "c"
natija2 = "a" if p else ("b" if q else "c")
natija3 = ("a" if p else "b") if q else "c"
print(f" p={p}, q={q}")
print(f" a if p else b if q else c → {natija1!r}")
print(f" a if p else (b if q else c) → {natija2!r} ← bir xil")
print(f" (a if p else b) if q else c → {natija3!r} ← boshqa!")=== 1. Faqat bir tarmoq hisoblanadi ===
shart=True natija=1 chaqirilgan: ['a']
shart=False natija=2 chaqirilgan: ['b']
=== 2. ⚠️ Prioritet tuzog'i ===
shart=True
Qavssiz: 'Natija: ha'
Qavs bilan: 'Natija: ha'
shart=False
Qavssiz: "yo'q"
Qavs bilan: "Natija: yo'q" ⚠️
=== 3. Arifmetika bilan ===
1 + 2 if x > 3 else 10 → 3
1 + (2 if x > 3 else 10) → 3
(1 + 2) if x > 3 else 10 → 3
1 + 2 if x > 10 else 100 → 100
1 + (2 if x > 10 else 100) → 101
=== 6. O'ngdan chapga guruhlash ===
p=False, q=True
a if p else b if q else c → 'b'
a if p else (b if q else c) → 'b' ← bir xil
(a if p else b) if q else c → 'b' ← boshqa!Nima ko'rsatdi: 2.1, 2.3, 2.5-bo'limlar.
Misol 2 — Muqobillar
"""Uchlik operator o'rniga nima ishlatish mumkin."""
from dataclasses import dataclass
print("=== 1. `or` — sukut qiymat ===")
kirishlar = ["Ali", "", None, 0, "0", []]
print(f" {'Kirish':<10} {'Uchlik':<12} {'or bilan':<12} {'is None':<12} Farq")
print(" " + "─" * 58)
for k in kirishlar:
uchlik = k if k else "Mehmon"
or_bilan = k or "Mehmon"
is_none = k if k is not None else "Mehmon"
farq = "⚠️" if uchlik != is_none else ""
print(f" {k!r:<10} {uchlik!r:<12} {or_bilan!r:<12} {is_none!r:<12} {farq}")
print("\n ⚠️ `or` va uchlik `if x` bir xil — ikkalasi ham 0 va \"\" ni ushlaydi")
print(" ✅ Faqat None ni tekshirish uchun `is None` kerak")
print("\n\n=== 2. min / max — chegaralash ===")
qiymatlar = [-50, 0, 50, 100, 150]
print(f" {'Qiymat':>8} {'Uchlik':>10} {'min/max':>10} {'0..100':>10}")
print(" " + "─" * 42)
for q in qiymatlar:
uchlik_yuqori = 100 if q > 100 else q
minmax_yuqori = min(q, 100)
chegaralangan = max(0, min(q, 100))
print(f" {q:>8} {uchlik_yuqori:>10} {minmax_yuqori:>10} {chegaralangan:>10}")
def chegarala(qiymat: float, past: float, yuqori: float) -> float:
"""Qiymatni oraliqqa chegaralaydi."""
return max(past, min(qiymat, yuqori))
print(f"\n chegarala(150, 0, 100) = {chegarala(150, 0, 100)}")
print(f" chegarala(-50, 0, 100) = {chegarala(-50, 0, 100)}")
print("\n\n=== 3. Lug'at — ko'p variant ===")
HOLATLAR = ["xato", "ogoh", "ok", "kutish", "nomalum"]
def rang_uchlik(holat: str) -> str:
return ("qizil" if holat == "xato"
else "sariq" if holat == "ogoh"
else "yashil" if holat == "ok"
else "kulrang")
RANGLAR = {"xato": "qizil", "ogoh": "sariq", "ok": "yashil"}
def rang_lugat(holat: str) -> str:
return RANGLAR.get(holat, "kulrang")
print(f" {'Holat':<12} {'Uchlik':<10} {'Lugʻat':<10}")
print(" " + "─" * 34)
for h in HOLATLAR:
u, l = rang_uchlik(h), rang_lugat(h)
assert u == l
print(f" {h:<12} {u:<10} {l:<10}")
print("\n\n=== 4. Ichki funksiyalar ===")
almashtirishlar = [
("-a if a < 0 else a", "abs(a)"),
("True if x else False", "bool(x)"),
("True if x > 5 else False", "x > 5"),
("d[k] if k in d else s", "d.get(k, s)"),
("o.a if hasattr(o, 'a') else s", "getattr(o, 'a', s)"),
("x[0] if x else None", "next(iter(x), None)"),
("len(x) if x else 0", "len(x or [])"),
]
print(f" {'❌ Uchlik':<36} {'✅ Yaxshiroq'}")
print(" " + "─" * 66)
for uchlik, yaxshi in almashtirishlar:
print(f" {uchlik:<36} {yaxshi}")
print("\n\n=== 5. Ruff SIM qoidalari ===")
print("""
SIM210: True if x else False → bool(x)
SIM211: False if x else True → not x
SIM212: b if not a else a → a if a else b
SIM108: if/else o'zlashtirish → uchlik operator
SIM401: d[k] if k in d else s → d.get(k, s)
""")
print("=== 6. Amaliy solishtirish ===")
@dataclass
class Sozlama:
port: int | None = None
host: str = ""
debug: bool | None = None
def sozla_yomon(s: Sozlama) -> dict:
return {
"port": s.port if s.port is not None else 8000,
"host": s.host if s.host else "localhost",
"debug": s.debug if s.debug is not None else False,
}
def sozla_yaxshi(s: Sozlama) -> dict:
return {
"port": s.port if s.port is not None else 8000, # 0 yaroqli emas, lekin aniq
"host": s.host or "localhost", # "" → sukut, to'g'ri
"debug": bool(s.debug), # None → False
}
SOZLAMALAR = [
Sozlama(),
Sozlama(port=3000, host="example.com", debug=True),
Sozlama(port=0, host="", debug=False),
]
for s in SOZLAMALAR:
y = sozla_yomon(s)
x = sozla_yaxshi(s)
print(f"\n Kirish: {s}")
print(f" Yomon: {y}")
print(f" Yaxshi: {x}")
if y != x:
print(f" ⚠️ FARQ BOR")Natijaning muhim qismi:
=== 1. `or` — sukut qiymat ===
Kirish Uchlik or bilan is None Farq
──────────────────────────────────────────────────────────
'Ali' 'Ali' 'Ali' 'Ali'
'' 'Mehmon' 'Mehmon' '' ⚠️
None 'Mehmon' 'Mehmon' 'Mehmon'
0 'Mehmon' 'Mehmon' 0 ⚠️
'0' '0' '0' '0'
[] 'Mehmon' 'Mehmon' [] ⚠️
=== 4. Ichki funksiyalar ===
❌ Uchlik ✅ Yaxshiroq
──────────────────────────────────────────────────────────────────
-a if a < 0 else a abs(a)
True if x else False bool(x)
True if x > 5 else False x > 5
d[k] if k in d else s d.get(k, s)
o.a if hasattr(o, 'a') else s getattr(o, 'a', s)Nima ko'rsatdi: 2.6-bo'lim.
Misol 3 — Ro'yxat generatorlarida
"""Uchlik operatorning eng foydali qo'llanishi."""
print("=== 1. ⭐ `if` ning ikki xil o'rni ===")
sonlar = [-3, 5, -1, 8, 0, 12, -7]
print(f" Manba: {sonlar}\n")
variantlar = [
("[x if x > 0 else 0 for x in sonlar]",
[x if x > 0 else 0 for x in sonlar],
"QIYMAT tanlash — uzunlik o'zgarmaydi"),
("[x for x in sonlar if x > 0]",
[x for x in sonlar if x > 0],
"FILTR — uzunlik kamayadi"),
("[x * 2 if x > 0 else 0 for x in sonlar if x != 0]",
[x * 2 if x > 0 else 0 for x in sonlar if x != 0],
"ikkalasi"),
]
for kod, natija, izoh in variantlar:
print(f" {kod}")
print(f" → {natija}")
print(f" ({len(natija)} element — {izoh})\n")
print(" ⚠️ [x if x > 0 for x in sonlar] → SyntaxError")
print(" else siz uchlik operator bo'lmaydi")
print("\n=== 2. Matnni tozalash ===")
qatorlar = [" Ali ", "", " ", "Vali", "\t\n", "Guli "]
print(f" {'Manba':<14} {'strip()':<14} {'or bilan':<14} {'uchlik':<14}")
print(" " + "─" * 60)
for q in qatorlar:
a = q.strip()
b = q.strip() or "(bo'sh)"
c = q.strip() if q.strip() else "(bo'sh)"
print(f" {q!r:<14} {a!r:<14} {b!r:<14} {c!r:<14}")
print("\n=== 3. Turlarni normallashtirish ===")
xom = ["1", "abc", "3", None, "5", "", "-7", "3.14"]
def songa(x) -> int:
if x is None:
return 0
if not isinstance(x, str):
return 0
x = x.strip()
if not x:
return 0
if x.lstrip("-").isdecimal():
return int(x)
return 0
print(f" Manba: {xom}")
print(f" Uchlik: {[int(x) if x and x.lstrip('-').isdecimal() else 0 for x in xom]}")
print(f" Funksiya: {[songa(x) for x in xom]}")
print("\n=== 4. Belgilar va formatlash ===")
natijalar = [
("Test 1", True, 0.95),
("Test 2", False, 0.42),
("Test 3", True, 1.00),
("Test 4", False, 0.00),
]
print(f" {'Test':<10} {'Holat':<8} {'Ball':>8} {'Baho':>8}")
print(" " + "─" * 38)
for nom, otdi, ball in natijalar:
belgi = "✅" if otdi else "❌"
baho = ("A'lo" if ball >= 0.9
else "Yaxshi" if ball >= 0.7
else "Past")
print(f" {nom:<10} {belgi:<8} {ball:>7.0%} {baho:>8}")
print("\n=== 5. Ko'plik shakllari ===")
def kop_shakl(soni: int, birlik: str, koplik: str | None = None) -> str:
"""O'zbekchada ko'plik odatda o'zgarmaydi, lekin ba'zan kerak."""
shakl = birlik if soni == 1 else (koplik or birlik)
return f"{soni} ta {shakl}"
def kop_shakl_ru(soni: int, bir: str, ikki: str, kop: str) -> str:
"""Rus tilida uch shakl."""
n = abs(soni) % 100
if 11 <= n <= 14:
shakl = kop
else:
n %= 10
shakl = bir if n == 1 else ikki if 2 <= n <= 4 else kop
return f"{soni} {shakl}"
print(" O'zbekcha:")
for n in [0, 1, 2, 5, 11, 21, 100]:
print(f" {kop_shakl(n, 'fayl')}")
print("\n Ruscha (uch shakl):")
for n in [0, 1, 2, 5, 11, 21, 22, 25, 101]:
print(f" {kop_shakl_ru(n, 'файл', 'файла', 'файлов')}")
print("\n=== 6. Lug'at generatorida ===")
malumot = {"a": 1, "b": -2, "c": 3, "d": -4}
print(f" Manba: {malumot}")
print(f" Musbat qilish: {{k: (v if v > 0 else 0) for k, v in malumot.items()}}")
print(f" → {{k: (v if v > 0 else 0) for k, v in malumot.items()}}")
print(f" Faqat musbat: {{k: v for k, v in malumot.items() if v > 0}}")
print(f" → {dict((k, v) for k, v in malumot.items() if v > 0)}")
print("\n=== 7. Ichma-ich generatorda ===")
jadval = [[1, -2, 3], [-4, 5, -6], [7, -8, 9]]
print(f" Manba: {jadval}")
musbat = [[x if x > 0 else 0 for x in qator] for qator in jadval]
print(f" Musbat: {musbat}")=== 1. ⭐ `if` ning ikki xil o'rni ===
Manba: [-3, 5, -1, 8, 0, 12, -7]
[x if x > 0 else 0 for x in sonlar]
→ [0, 5, 0, 8, 0, 12, 0]
(7 element — QIYMAT tanlash — uzunlik o'zgarmaydi)
[x for x in sonlar if x > 0]
→ [5, 8, 12]
(3 element — FILTR — uzunlik kamayadi)
[x * 2 if x > 0 else 0 for x in sonlar if x != 0]
→ [0, 10, 0, 16, 24, 0]
(6 element — ikkalasi)
=== 5. Ko'plik shakllari ===
Ruscha (uch shakl):
0 файлов
1 файл
2 файла
5 файлов
11 файлов
21 файл
22 файла
25 файлов
101 файлNima ko'rsatdi: 2.7-bo'lim.
Misol 4 — Qachon ishlatmaslik
"""Uchlik operatorning chegaralari."""
from dataclasses import dataclass
from decimal import Decimal
print("=== 1. ❌ Juda uzun ===")
print("""
❌ Bir qatorga sig'maydi:
natija = hisobla_murakkab(a, b, c) if tekshir(x, y) and boshqa(z) else sukut(d, e)
✅ if/else:
if tekshir(x, y) and boshqa(z):
natija = hisobla_murakkab(a, b, c)
else:
natija = sukut(d, e)
""")
print("=== 2. ❌ Yon ta'sirlar ===")
print("""
❌ Ifoda buyruq sifatida:
saqla() if shart else ochir()
log("ok") if ok else log("xato")
✅ Buyruq:
if shart:
saqla()
else:
ochir()
✅ Yoki qiymatni uchlikda:
log("ok" if ok else "xato")
""")
print("=== 3. ❌ Chuqur zanjirlash ===")
BALLAR = [95, 85, 75, 65, 55, 45]
# Zanjir — 5 bosqich
def baho_zanjir(b):
return ("A+" if b >= 95 else "A" if b >= 90 else "B" if b >= 80
else "C" if b >= 70 else "D" if b >= 60 else "F")
# Jadval
CHEGARALAR = [(95, "A+"), (90, "A"), (80, "B"), (70, "C"), (60, "D"), (0, "F")]
def baho_jadval(b):
return next(baho for ch, baho in CHEGARALAR if b >= ch)
print(f" {'Ball':>6} {'Zanjir':>8} {'Jadval':>8}")
print(" " + "─" * 26)
for b in BALLAR:
z, j = baho_zanjir(b), baho_jadval(b)
assert z == j
print(f" {b:>6} {z:>8} {j:>8}")
print("\n Zanjir 5 bosqichda o'qish qiyin. Jadval — sozlanadigan.")
print("\n\n=== 4. ❌ Ikkala tarmoqda murakkab mantiq ===")
print("""
❌ O'qib bo'lmaydi:
x = ([i * 2 for i in a if i > 0] if shart
else {k: v.upper() for k, v in b.items() if v})
✅ Alohida:
if shart:
x = [i * 2 for i in a if i > 0]
else:
x = {k: v.upper() for k, v in b.items() if v}
""")
print("=== 5. ✅ To'g'ri qo'llanishlar ===")
@dataclass
class Mahsulot:
nom: str
narx: Decimal
qoldiq: int
chegirma: Decimal | None = None
MAHSULOTLAR = [
Mahsulot("Klaviatura", Decimal("250000"), 5),
Mahsulot("Sichqoncha", Decimal("120000"), 0),
Mahsulot("Monitor", Decimal("2500000"), 2, Decimal("0.10")),
Mahsulot("Kabel", Decimal("45000"), 100, Decimal("0.05")),
]
print(f" {'Mahsulot':<14} {'Narx':>12} {'Chegirma':>10} "
f"{'Yakuniy':>12} {'Holat':>10}")
print(" " + "─" * 62)
for m in MAHSULOTLAR:
# ✅ Sodda o'zlashtirish
holat = "Mavjud" if m.qoldiq > 0 else "Tugagan"
# ✅ None tekshiruvi
chegirma = m.chegirma if m.chegirma is not None else Decimal("0")
# ✅ Hisob
yakuniy = m.narx * (1 - chegirma)
# ✅ Formatlashda
ch_matn = f"{chegirma:.0%}" if chegirma else "—"
print(f" {m.nom:<14} {m.narx:>12,} {ch_matn:>10} "
f"{yakuniy:>12,.0f} {holat:>10}")
# ✅ Ro'yxat generatorida
narxlar = [m.narx * (1 - (m.chegirma or 0)) for m in MAHSULOTLAR]
print(f"\n Jami: {sum(narxlar):,.0f}")
# ✅ Funksiya argumentida
mavjudlar = [m for m in MAHSULOTLAR if m.qoldiq > 0]
print(f" Mavjud: {len(mavjudlar)} ta "
f"{'mahsulot' if len(mavjudlar) == 1 else 'mahsulot'}")
# ✅ f-satr ichida
soni = len(mavjudlar)
print(f" Omborda {soni} ta {'tur' if soni == 1 else 'tur'} mahsulot bor")
print("\n\n=== 6. Qaror daraxti ===")
print("""
Uchlik operator ishlatilsinmi?
┌─ Bir qatorga sig'adimi?
│ Yo'q → if/else
│ Ha ↓
├─ Bir qarashda tushunarlimi?
│ Yo'q → if/else
│ Ha ↓
├─ Yon ta'sir bormi?
│ Ha → if/else
│ Yo'q ↓
├─ Uch bosqichdan ko'pmi?
│ Ha → if/elif yoki lug'at
│ Yo'q ↓
└─ ✅ Uchlik operator
""")Nima ko'rsatdi: 2.4-bo'lim.
5. To'g'ri va noto'g'ri tushunishlar
| Noto'g'ri fikr | To'g'risi |
|---|---|
| "Uchlik operator har doim qisqaroq" | Uzun ifodalarda if/else o'qish oson |
"shart ? a : b Pythonda ham ishlaydi" |
Yo'q — a if shart else b |
| "Ikkala tarmoq ham hisoblanadi" | Faqat bittasi — qisqa tutashuvga o'xshash |
| "Qavs kerak emas" | Boshqa ifoda ichida — doim kerak |
| "Zanjirlash chapdan o'ngga" | O'ngdan chapga |
"x if x else y va x or y bir xil" |
Ha, bir xil. Lekin is None boshqa |
"Generatorda if bir xil ishlaydi" |
for dan oldin — qiymat, keyin — filtr |
| "Yon ta'sir uchun ishlatsa bo'ladi" | Texnik jihatdan ha, lekin noidiomatik |
6. Keng tarqalgan xatolar va yechimlari
1. Prioritet
matn = "a: " + "x" if c else "y" # ❌
matn = "a: " + ("x" if c else "y") # ✅2. Boshqa til tartibi
x = shart ? a : b # ❌ SyntaxError
x = a if shart else b # ✅3. else ni unutish
x = a if shart # ❌ SyntaxError
x = a if shart else b # ✅Uchlik operatorda else — majburiy.
4. Generatorda else siz
[x if x > 0 for x in y] # ❌ SyntaxError
[x for x in y if x > 0] # ✅ filtr
[x if x > 0 else 0 for x in y] # ✅ uchlik5. 0 va "" bilan sukut qiymat
soni = kirish if kirish else 10 # ❌ 0 → 10
soni = kirish if kirish is not None else 10 # ✅ 0 → 06. Ortiqcha True/False
katta = True if x > 5 else False # ❌ SIM210
katta = x > 5 # ✅7. Chuqur zanjirlash
b = "A" if x>90 else "B" if x>80 else "C" if x>70 else "D" # ⚠️
# → if/elif yoki jadval8. Yon ta'sir
saqla() if shart else ochir() # ❌
if shart: saqla() # ✅
else: ochir()7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 3.12-dars (o'tilgan): operatorlar prioriteti
- 5.1-dars (o'tilgan):
if/elif/else - 5.3-dars (o'tilgan): shartlarni birlashtirish
- 6-qism: ro'yxat, lug'at, to'plam generatorlari
- 7-qism:
lambdaichida uchlik operator - 10-qism: generator ifodalari,
next() - 4-qism: f-satr shablonlari
- Kundalik kodda: eng ko'p ishlatiladigan qisqartmalardan biri
8. Eng yaxshi amaliyotlar
Bir qatorga sig'sa va bir qarashda tushunarli bo'lsa ishlating. Aks holda
if/else.Boshqa ifoda ichida qavs qo'ying. Prioritet eng past — bu tuzoq manbai.
Uch bosqichdan ko'p zanjirlamang.
if/elifyoki lug'at yaxshiroq.Yon ta'sir uchun ishlatmang. Ifoda — qiymat uchun, buyruq — amal uchun.
Ichki funksiyalarni afzal ko'ring.
abs(),min(),max(),.get(),getattr().0va""yaroqli qiymat bo'lsais Noneishlating.orvaif xularni ushlaydi.Generatorlarda
ifo'rnini eslang.fordan oldin — qiymat, keyin — filtr.Ruff
SIMqoidalarini yoqing.SIM108,SIM210,SIM211,SIM401.
9. Amaliy topshiriq
Vazifa 1: Natijani bashorat qiling
x = 5
c = True
1. "a" if x > 3 else "b"
2. "pre" + "a" if c else "b"
3. "pre" + ("a" if c else "b")
4. 1 + 2 if x > 10 else 100
5. 1 + (2 if x > 10 else 100)
6. "a" if False else "b" if True else "c"
7. [i if i > 2 else 0 for i in range(5)]
8. [i for i in range(5) if i > 2]Javoblar
'a''prea'—("pre" + "a") if c else "b"'prea'100—(1 + 2) if x > 10 else 100101'b'[0, 0, 0, 3, 4][3, 4]
Vazifa 2: Uchlikka o'tkazing
1. if x > 0:
belgi = "+"
else:
belgi = "-"
2. if royxat:
birinchi = royxat[0]
else:
birinchi = None
3. if kalit in lugat:
qiymat = lugat[kalit]
else:
qiymat = 0Javoblar
1. belgi = "+" if x > 0 else "-"
2. birinchi = royxat[0] if royxat else None
3. qiymat = lugat.get(kalit, 0) # ✅ uchlikdan ham yaxshiroqVazifa 3: Uchlikdan qutuling
1. x = True if a > b else False
2. y = -n if n < 0 else n
3. z = 100 if v > 100 else v
4. w = o.atr if hasattr(o, "atr") else None
5. q = s if s else "sukut"Javoblar
1. x = a > b
2. y = abs(n)
3. z = min(v, 100)
4. w = getattr(o, "atr", None)
5. q = s or "sukut"Vazifa 4: Generator mashqi
sonlar = [-5, 3, 0, -1, 8, 12, -3] uchun yozing:
- Manfiylarni
0ga almashtiring - Faqat musbatlarni oling
- Musbatlarni ikkilantiring, manfiylarni
0qiling - Nolni tashlab, qolganini absolyut qiymatga aylantiring
- Har birini
"musbat"/"manfiy"/"nol"deb belgilang
Javoblar
sonlar = [-5, 3, 0, -1, 8, 12, -3]
1. [x if x > 0 else 0 for x in sonlar]
2. [x for x in sonlar if x > 0]
3. [x * 2 if x > 0 else 0 for x in sonlar]
4. [abs(x) for x in sonlar if x != 0]
5. ["musbat" if x > 0 else "manfiy" if x < 0 else "nol" for x in sonlar]Vazifa 5: Ko'plik funksiyasi
Uch tilda ko'plik shaklini qaytaruvchi funksiya yozing:
koplik("uz", 5, "fayl") # "5 ta fayl"
koplik("ru", 5, "файл", "файла", "файлов") # "5 файлов"
koplik("en", 5, "file", "files") # "5 files"Vazifa 6: Chegaralash kutubxonasi
Funksiyalar yozing (uchlik operatorsiz, ichki funksiyalar bilan):
chegarala(x, past, yuqori)normallashtir(x, min_q, max_q)— 0..1 oralig'igabelgi(x)—-1,0yoki1xavfsiz_bol(a, b, sukut=0)
Vazifa 7: O'ylash
Nega Python shart ? a : b o'rniga a if shart else b ni tanladi?
Javob
PEP 308 da uch sabab keltirilgan:
1. ? va : band.
: Pythonda allaqachon ko'p joyda ishlatiladi:
if x: # blok
royxat[1:5] # kesim
{"kalit": qiymat} # lug'at
def f(x: int): # tur ishorasi
lambda x: x + 1 # lambda? ni qo'shish yangi belgi kiritish bo'lardi — Python bunday narsadan qochadi.
2. Odatiy holat oldinda.
Ko'p holatda shart — istisno, asosiy qiymat esa muhimroq:
qiymat = malumot[k] if k in malumot else sukut
# ^^^^^^^^^^ — asosiy narsaKod o'qiyotgan odam avval "nima qaytadi" ni ko'radi, keyin "qachon".
3. Ingliz tiliga yaqin.
"X if Y else Z" — deyarli oddiy gap. Y ? X : Z esa maxsus sintaksis.
Tarixiy fakt: Python 2.5 gacha uchlik operator umuman yo'q edi. Dasturchilar hiyla ishlatardi:
x = (b, a)[shart] # ❌ ikkalasi hisoblanadi
x = shart and a or b # ❌ a falsy bo'lsa buziladiIkkinchisi — mashhur, lekin xato:
shart = True
a, b = 0, 5
print(shart and a or b) # 5 — noto'g'ri! a=0 falsyAynan shu muammo PEP 308 ni kiritishga sabab bo'ldi.
Nimani mustahkamlaydi: 2.1, 2.3, 2.4, 2.6, 2.7-bo'limlar.
Xulosa
Bu darsda uchlik operatorni o'rgandik.
Eng muhim uch fikr:
a if shart else b— faqat bir tarmoq hisoblanadi. Bu qisqa tutashuvga o'xshaydi va nolga bo'lish,Nonetekshiruvi kabi holatlarda xavfsizlik beradi.Prioritet eng past — qavs qo'ying.
"a: " + "x" if c else "y"—("a: " + "x") if c else "y". Boshqa ifoda ichida ishlatganda qavs majburiy.Uzun yoki chuqur bo'lsa — ishlatmang. Bir qatorga sig'sa va bir qarashda tushunarli bo'lsa — uchlik; aks holda
if/else, lug'at yoki jadval.
Keyingi darsda while siklini o'rganamiz: cheksiz sikl, shart bilan chiqish, else bloki va eng ko'p uchraydigan tuzoqlar.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!