IlmHamroh
Python kursi/Boshqaruv oqimi4/12-dars31 daqiqa
Mundarija (23)

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:

python
if yosh >= 18:
    holat = "voyaga yetgan"
else:
    holat = "voyaga yetmagan"

To'rt qator — bitta o'zlashtirish uchun. Python qisqaroq yo'l beradi:

python
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:

python
# ⚠️ 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 chaqiruvi

Bu 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

python
<qiymat_rost> if <shart> else <qiymat_yolg'on>
python
yosh = 25
holat = "katta" if yosh >= 18 else "kichik"
print(holat)                    # 'katta'

Bajarilish tartibi:

text
1. <shart> hisoblanadi
2. Rost bo'lsa  → <qiymat_rost> hisoblanadi va qaytariladi
3. Yolg'on bo'lsa → <qiymat_yolg'on> hisoblanadi va qaytariladi

Faqat bittasi hisoblanadi — bu qisqa tutashuvga o'xshash (3.5-dars):

python
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}")
text
shart rost:
  a chaqirildi
  natija: 1
shart yolg'on:
  b chaqirildi
  natija: 2

2.2. Nima uchun bunday tartib

Ko'p tilda uchlik operator boshqacha:

text
C, Java, JS:   shart ? rost : yolg'on
Python:        rost if shart else yolg'on

Nega Python boshqacha?

Guido van Rossum tushuntirishicha (PEP 308):

  1. Odatiy holat oldinda. Ko'p holatda shart — istisno, rost — asosiy qiymat:
python
qiymat = malumot["kalit"] if "kalit" in malumot else sukut
#        ^^^^^^^^^^^^^^^^ — asosiy narsa, oldinda
  1. Ingliz tiliga yaqin: "X if Y else Z" — tabiiy o'qiladi.

  2. ? va : band. : — bloklar, kesimlar va lug'atlarda ishlatiladi.

Boshqa tildan kelganlar uchun chalkash:

python
# JavaScript odati
# x = shart ? a : b

# Python
x = a if shart else b

Ba'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).

python
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:

python
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:

python
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   ✅ aniq

f-satr ichida:

python
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:

python
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:

python
holat = "faol" if user.faol else "nofaol"
belgi = "✅" if muvaffaqiyat else "❌"

2. Formatlashda:

python
print(f"{soni} ta {'fayl' if soni == 1 else 'fayllar'}")
print(f"{summa:,} {'soʻm' if valyuta == 'UZS' else valyuta}")

3. Funksiya argumenti:

python
saqla(malumot, format="json" if json_kerak else "csv")

4. Ro'yxat generatorida (6-qism):

python
natija = [x if x > 0 else 0 for x in sonlar]

5. Sukut qiymat (None bilan):

python
soni = kirish if kirish is not None else 10

6. return da:

python
def belgi(x):
    return "musbat" if x > 0 else "manfiy" if x < 0 else "nol"

Yomon holatlar:

1. Uzun ifodalar:

python
# ❌
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:

python
# ❌ Ifoda yon ta'sir uchun ishlatilyapti
saqla() if shart else ochir()

# ✅ Buyruq
if shart:
    saqla()
else:
    ochir()

3. Chuqur zanjirlash:

python
# ❌ 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:

python
# ❌
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:

python
a if p else b if q else c
# = a if p else (b if q else c)
python
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:

python
# 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):

python
# Uchlik
ism = kirish if kirish else "Mehmon"

# or — qisqaroq
ism = kirish or "Mehmon"

Lekin 0 va "" uchun farq qiladi:

python
soni = kirish or 10                             # 0 → 10 ❌
soni = kirish if kirish is not None else 10     # 0 → 0  ✅

2. Lug'at — ko'p variant uchun:

python
# ❌ 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:

python
# ❌
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'iga

Chegaralash funksiyasi:

python
def chegarala(qiymat, past, yuqori):
    return max(past, min(qiymat, yuqori))

4. abs, bool va boshqa ichki funksiyalar:

python
# ❌
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:

python
# ❌
katta = True if x > 5 else False

# ✅
katta = x > 5

Ruff: SIM210, SIM211.

6. getattr / .get — atribut yoki kalit:

python
# ❌
qiymat = obyekt.atribut if hasattr(obyekt, "atribut") else sukut

# ✅
qiymat = getattr(obyekt, "atribut", sukut)
python
# ❌
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):

python
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:

python
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:

python
# [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]     # ✅ uchlik

Amaliy misollar:

python
# 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

python
def formatla(qiymat: int | None) -> str:
    return str(qiymat) if qiymat is not None else "—"

Pylance tur toraytirish qiladi (3.6-dars):

python
def uzunlik(matn: str | None) -> int:
    return len(matn) if matn is not None else 0
    #      ^^^^^^^^^^ — Pylance biladi: matn bu yerda str

Turlar mos kelmasa — birlashma turi:

python
qiymat = 42 if shart else "matn"        # int | str

Bu — yaroqli, lekin keyingi kodda ehtiyot bo'lish kerak:

python
qiymat = 42 if shart else "matn"
# qiymat + 1                            # ❌ str bo'lsa xato

Yaxshiroq — bir xil tur:

python
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:

python
# ✅ 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 0

Qimmat amallar:

python
# ✅ Faqat kerak bo'lsa hisoblanadi
natija = keshdan_ol(k) if keshda_bor(k) else bazadan_ol(k)

Lekin yon ta'sir uchun ishlatmang:

python
# ❌ 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):

python
natija = n * 2 if (n := hisobla()) > 0 else 0

Bu — ishlaydi, lekin o'qish qiyin. Ehtiyot bo'ling.


3. Tez ma'lumotnoma

Sintaksis

python
<rost_qiymat> if <shart> else <yolgon_qiymat>

x = "katta" if a > b else "kichik"

Prioritet — eng past

python
"a: " + "x" if c else "y"       ❌ ("a: " + "x") if c else "y"
"a: " + ("x" if c else "y")     ✅

Zanjirlash (o'ngdan chapga)

python
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'at

Muqobillar

python
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

python
[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] ikkalasi

Qachon ishlatish

text
✅ Bir qatorga sig'sa va bir qarashda tushunarli bo'lsa
✅ Formatlashda, funksiya argumentida, generatorda
❌ Uzun ifodalar, yon ta'sirlar, chuqur zanjirlash

4. Batafsil misollar

Misol 1 — Asoslar va prioritet

python
"""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!")
text
=== 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

python
"""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:

text
=== 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

python
"""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}")
text
=== 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

python
"""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

python
matn = "a: " + "x" if c else "y"        # ❌
matn = "a: " + ("x" if c else "y")      # ✅

2. Boshqa til tartibi

python
x = shart ? a : b                       # ❌ SyntaxError
x = a if shart else b                   # ✅

3. else ni unutish

python
x = a if shart                          # ❌ SyntaxError
x = a if shart else b                   # ✅

Uchlik operatorda else — majburiy.

4. Generatorda else siz

python
[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]          # ✅ uchlik

5. 0 va "" bilan sukut qiymat

python
soni = kirish if kirish else 10                 # ❌ 0 → 10
soni = kirish if kirish is not None else 10     # ✅ 0 → 0

6. Ortiqcha True/False

python
katta = True if x > 5 else False        # ❌ SIM210
katta = x > 5                           # ✅

7. Chuqur zanjirlash

python
b = "A" if x>90 else "B" if x>80 else "C" if x>70 else "D"   # ⚠️
# → if/elif yoki jadval

8. Yon ta'sir

python
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: lambda ichida uchlik operator
  • 10-qism: generator ifodalari, next()
  • 4-qism: f-satr shablonlari
  • Kundalik kodda: eng ko'p ishlatiladigan qisqartmalardan biri

8. Eng yaxshi amaliyotlar

  1. Bir qatorga sig'sa va bir qarashda tushunarli bo'lsa ishlating. Aks holda if/else.

  2. Boshqa ifoda ichida qavs qo'ying. Prioritet eng past — bu tuzoq manbai.

  3. Uch bosqichdan ko'p zanjirlamang. if/elif yoki lug'at yaxshiroq.

  4. Yon ta'sir uchun ishlatmang. Ifoda — qiymat uchun, buyruq — amal uchun.

  5. Ichki funksiyalarni afzal ko'ring. abs(), min(), max(), .get(), getattr().

  6. 0 va "" yaroqli qiymat bo'lsa is None ishlating. or va if x ularni ushlaydi.

  7. Generatorlarda if o'rnini eslang. for dan oldin — qiymat, keyin — filtr.

  8. Ruff SIM qoidalarini yoqing. SIM108, SIM210, SIM211, SIM401.


9. Amaliy topshiriq

Vazifa 1: Natijani bashorat qiling

python
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
  1. 'a'
  2. 'prea' — ("pre" + "a") if c else "b"
  3. 'prea'
  4. 100 — (1 + 2) if x > 10 else 100
  5. 101
  6. 'b'
  7. [0, 0, 0, 3, 4]
  8. [3, 4]

Vazifa 2: Uchlikka o'tkazing

python
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 = 0
Javoblar
python
1.  belgi = "+" if x > 0 else "-"
2.  birinchi = royxat[0] if royxat else None
3.  qiymat = lugat.get(kalit, 0)      # ✅ uchlikdan ham yaxshiroq

Vazifa 3: Uchlikdan qutuling

python
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
python
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:

  1. Manfiylarni 0 ga almashtiring
  2. Faqat musbatlarni oling
  3. Musbatlarni ikkilantiring, manfiylarni 0 qiling
  4. Nolni tashlab, qolganini absolyut qiymatga aylantiring
  5. Har birini "musbat"/"manfiy"/"nol" deb belgilang
Javoblar
python
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:

python
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):

  1. chegarala(x, past, yuqori)
  2. normallashtir(x, min_q, max_q) — 0..1 oralig'iga
  3. belgi(x) — -1, 0 yoki 1
  4. xavfsiz_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:

python
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:

python
qiymat = malumot[k] if k in malumot else sukut
#        ^^^^^^^^^^ — asosiy narsa

Kod 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:

python
x = (b, a)[shart]                       # ❌ ikkalasi hisoblanadi
x = shart and a or b                    # ❌ a falsy bo'lsa buziladi

Ikkinchisi — mashhur, lekin xato:

python
shart = True
a, b = 0, 5
print(shart and a or b)                 # 5 — noto'g'ri! a=0 falsy

Aynan 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:

  1. a if shart else b — faqat bir tarmoq hisoblanadi. Bu qisqa tutashuvga o'xshaydi va nolga bo'lish, None tekshiruvi kabi holatlarda xavfsizlik beradi.

  2. Prioritet eng past — qavs qo'ying. "a: " + "x" if c else "y" — ("a: " + "x") if c else "y". Boshqa ifoda ichida ishlatganda qavs majburiy.

  3. 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.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
5.4-dars: Uchlik operator — IlmHamroh