IlmHamroh
Python kursi/Asoslar5/14-dars23 daqiqa
Mundarija (23)

3.5-dars: bool va mantiq

3-QISM — ASOSLAR · 5-dars


1. Kirish va motivatsiya

bool — eng oddiy tur. Ikkita qiymat: True va False. Nima o'rganish kerak?

Aslida — Pythondagi eng qiziqarli mavzulardan biri. Chunki Pythonda "haqiqat" tushunchasi ancha kengroq:

python
if []:
    print("ishlaydi")       # ishlamaydi — bo'sh ro'yxat False
python
if [0]:
    print("ishlaydi")       # ISHLAYDI — bo'sh emas ro'yxat True
python
print(0 == False)           # True
print("" == False)          # False   ← nega?!
print(bool("") == False)    # True

Va yana:

python
print(1 and 2)              # 2      ← True emas!
print(0 or "salom")         # 'salom'
print(not 5)                # False

and va or mantiqiy qiymat qaytarmaydi — ular operandlardan birini qaytaradi. Bu — Pythondagi eng foydali va eng chalkashtiradigan xususiyatlardan biri.

Bu darsda:

  • True/False va int bilan bog'liqligi
  • Rostlik (truthiness) — nima True, nima False deb hisoblanadi
  • and, or, not va qisqa tutashuv (short-circuit)
  • and/or ning qiymat qaytarishi va uning amaliy foydasi
  • Mantiqiy amallarni to'g'ri yozish uslubi

2. Nazariya — chuqur tushuntirish

2.1. bool — int ning bolasi

3.3-darsda tegib o'tgandik, endi to'liq:

python
print(type(True))               # <class 'bool'>
print(isinstance(True, int))    # True
print(bool.__mro__)             # (<class 'bool'>, <class 'int'>, <class 'object'>)

bool — int dan meros olgan sinf (8-qism). Ya'ni True va False — bu maxsus butun sonlar:

python
print(int(True))            # 1
print(int(False))           # 0
print(True + True)          # 2
print(True * 5)             # 5
print(False - 1)            # -1
print(True == 1)            # True
print(False == 0)           # True

Bu — tarixiy sabab. Python 2.3 gacha bool umuman yo'q edi — 1 va 0 ishlatilardi. Moslikni saqlash uchun bool int dan meros qildirildi.

Amaliy foyda — sanash:

python
ballar = [85, 42, 91, 55, 78, 63]
OTISH = 60

otganlar = sum(ball >= OTISH for ball in ballar)
print(f"O'tganlar: {otganlar} / {len(ballar)}")     # 4 / 6

foiz = otganlar / len(ballar) * 100
print(f"Foiz: {foiz:.0f}%")                         # 67%

Har bir taqqoslash True/False beradi, sum esa ularni 1/0 deb qo'shadi. Bu — juda idiomatik Python.

Yana bir foyda — indeks sifatida:

python
javoblar = ["Noto'g'ri", "To'g'ri"]
natija = 5 > 3
print(javoblar[natija])         # 'To'g'ri' — chunki True == 1

Chiroyli, lekin o'qish qiyin. Odatiy if yaxshiroq.

True va False — yagona obyektlar:

python
a = True
b = True
print(a is b)               # True — bitta obyekt
print(id(True))             # doim bir xil

Shuning uchun is True ishlaydi (lekin baribir kerak emas — 2.7-bo'lim).

2.2. Rostlik (truthiness) — bool() nima qaytaradi

Pythonda har qanday obyekt mantiqiy kontekstda ishlatilishi mumkin. if x: yozganingizda Python bool(x) ni chaqiradi.

False deb hisoblanadigan qiymatlar (falsy) — ro'yxat qisqa:

python
print(bool(False))          # False
print(bool(None))           # False
print(bool(0))              # False
print(bool(0.0))            # False
print(bool(0j))             # False — kompleks nol
print(bool(""))             # False — bo'sh satr
print(bool([]))             # False — bo'sh ro'yxat
print(bool(()))             # False — bo'sh juftlik
print(bool({}))             # False — bo'sh lug'at
print(bool(set()))          # False — bo'sh to'plam
print(bool(range(0)))       # False — bo'sh diapazon
print(bool(b""))            # False — bo'sh baytlar

Qolgan hamma narsa True:

python
print(bool(1))              # True
print(bool(-1))             # True  ← manfiy ham True
print(bool(0.0001))         # True
print(bool("0"))            # True  ← "0" SATR, bo'sh emas
print(bool("False"))        # True  ← satr, bo'sh emas
print(bool([0]))            # True  ← bo'sh emas ro'yxat
print(bool([[]]))           # True  ← ichida bo'sh ro'yxat bor, lekin o'zi bo'sh emas
print(bool({0: 0}))         # True
print(bool(-0.0))           # False ← manfiy nol ham nol

Umumiy qoida:

"Bo'sh" yoki "nol" bo'lgan narsa — False. Qolgani — True.

Eng ko'p tuzoq beradigan uchlik:

python
bool("0")           # True  — bu satr, nol emas
bool("False")       # True  — bu ham satr
bool([0])           # True  — ro'yxat bo'sh emas
bool(" ")           # True  — bo'sh joy ham belgi

Bu qanday ishlaydi? Obyekt __bool__() yoki __len__() metodini beradi (8-qism):

python
class BoshQuti:
    def __len__(self):
        return 0

print(bool(BoshQuti()))     # False — chunki uzunligi 0

Agar ikkalasi ham bo'lmasa, obyekt doim True.

2.3. and, or, not

python
print(True and False)       # False
print(True or False)        # True
print(not True)             # False

Haqiqat jadvallari:

a b a and b a or b
True True True True
True False False True
False True False True
False False False False

Pythonda so'zlar ishlatiladi, belgilar emas:

text
Python:      and    or    not
C/Java/JS:    &&    ||     !

&, |, ^ Pythonda ham bor, lekin ular — bit amallari (3.3-dars). Ularni mantiq uchun ishlatmang:

python
print(True & False)         # False — ishlaydi, lekin
print(5 & 3)                # 1     — bu bit amali!
print(5 and 3)              # 3     — bu mantiq

2.4. and va or qiymat qaytaradi

Bu — Pythondagi eng muhim va eng ko'p chalkashtiradigan xususiyat.

python
print(1 and 2)              # 2      ← True emas!
print(0 and 2)              # 0
print(1 or 2)               # 1
print(0 or 2)               # 2
print("" or "sukut")        # 'sukut'
print("bor" or "sukut")     # 'bor'

Qoidalar:

Ifoda Nima qaytaradi
a and b a falsy bo'lsa → a, aks holda → b
a or b a truthy bo'lsa → a, aks holda → b

Boshqacha aytganda:

  • and — birinchi falsy ni qaytaradi, yoki oxirgisini
  • or — birinchi truthy ni qaytaradi, yoki oxirgisini
python
print(0 and 1 and 2)            # 0   — birinchi falsy
print(1 and 2 and 3)            # 3   — hammasi truthy, oxirgisi
print(0 or "" or None or 5)     # 5   — birinchi truthy
print(0 or "" or None)          # None— hammasi falsy, oxirgisi

not esa doim bool qaytaradi:

python
print(not 5)                # False
print(not 0)                # True
print(not "salom")          # False
print(type(not 5))          # <class 'bool'>

2.5. Qisqa tutashuv (short-circuit)

and va or dangasa — kerak bo'lmasa o'ng tomonni umuman hisoblamaydi.

python
def qimmat_amal():
    print("  qimmat amal bajarildi")
    return True


print("1. False and ...")
natija = False and qimmat_amal()        # qimmat_amal CHAQIRILMAYDI

print("2. True and ...")
natija = True and qimmat_amal()         # chaqiriladi

print("3. True or ...")
natija = True or qimmat_amal()          # CHAQIRILMAYDI

print("4. False or ...")
natija = False or qimmat_amal()         # chaqiriladi
text
1. False and ...
2. True and ...
  qimmat amal bajarildi
3. True or ...
4. False or ...
  qimmat amal bajarildi

Bu — juda foydali:

python
# ❌ Xato beradi
if len(matn) > 0 and matn[0] == "A":    # matn None bo'lsa xato

# ✅ Xavfsiz — chap tomon False bo'lsa, o'ng tekshirilmaydi
if matn and matn[0] == "A":
python
# Nolga bo'lishdan himoya
if soni != 0 and jami / soni > 100:
    print("O'rtacha yuqori")
python
# Lug'at kalitini xavfsiz tekshirish
if "ism" in foydalanuvchi and foydalanuvchi["ism"].strip():
    print("Ism bor")

Tartib muhim:

python
# ❌ Xato bo'lishi mumkin
if malumot[0] == "x" and malumot:

# ✅ To'g'ri tartib
if malumot and malumot[0] == "x":

Har doim arzon va himoyalovchi shartni chapga qo'ying.

2.6. Amaliy naqshlar

1. Sukut qiymat berish (or)

python
ism = kiritilgan_ism or "Mehmon"
port = sozlama.get("port") or 8080
royxat = berilgan or []

Tuzoq: 0, "", [] ham falsy!

python
soni = kiritilgan or 10
# Agar kiritilgan == 0 bo'lsa, soni = 10 bo'ladi — ehtimol noto'g'ri!

To'g'ri usul:

python
soni = kiritilgan if kiritilgan is not None else 10

2. Xavfsiz zanjir (and)

python
uzunlik = matn and len(matn)        # matn None bo'lsa None qaytadi

Zamonaviy usul (3.8+):

python
uzunlik = len(matn) if matn else 0

3. Bo'shlikni tekshirish

python
# ❌ Ortiqcha
if len(royxat) > 0:
if royxat != []:
if bool(royxat) == True:

# ✅ Pythonda idiomatik
if royxat:
if not royxat:

4. None ni tekshirish

python
# ❌ Chalkashtiradi
if qiymat:              # 0, "", [] ham False beradi!

# ✅ Aniq
if qiymat is not None:

Bu farq juda muhim:

python
def hisobla(qiymat=None):
    if qiymat is None:      # ✅ faqat None ni tekshiradi
        qiymat = 10
    return qiymat * 2

print(hisobla(0))           # 0  — to'g'ri
print(hisobla())            # 20
python
def hisobla_xato(qiymat=None):
    if not qiymat:          # ❌ 0 ni ham ushlaydi
        qiymat = 10
    return qiymat * 2

print(hisobla_xato(0))      # 20 — NOTO'G'RI!

2.7. if x is True — nega yozmaslik kerak

python
# ❌ Ortiqcha va xavfli
if faolmi == True:
if faolmi is True:

# ✅ To'g'ri
if faolmi:

Nega is True xavfli?

python
qiymat = 1
print(qiymat == True)       # True  — chunki 1 == True
print(qiymat is True)       # False — 1 va True turli obyekt!

if qiymat:                  # True  — to'g'ri ishlaydi

is True faqat aynan True obyekti bilan mos keladi. Truthy qiymatlar bilan ishlamaydi.

Inkor uchun ham:

python
# ❌
if faolmi == False:
if not faolmi == True:

# ✅
if not faolmi:

2.8. Taqqoslashlarni zanjirlash

Python matematikaga o'xshash yozuvga ruxsat beradi:

python
yosh = 25

print(18 <= yosh <= 65)             # True
# Bu quyidagiga teng:
print(18 <= yosh and yosh <= 65)    # True

Boshqa ko'p tilda bu ishlamaydi:

text
C tilida: 18 <= 25 <= 65
          → (18 <= 25) <= 65
          → 1 <= 65
          → 1 (True)  — tasodifan to'g'ri, lekin sabab noto'g'ri

Zanjir uzunligi cheklanmagan:

python
a, b, c, d = 1, 2, 3, 4
print(a < b < c < d)        # True
print(a < b > c)            # False (1 < 2 va 2 > 3 — ikkinchisi noto'g'ri)

Muhim: o'rtadagi ifoda bir marta hisoblanadi:

python
def qiymat():
    print("  chaqirildi")
    return 5

print(1 < qiymat() < 10)
text
  chaqirildi
True

Bir marta chaqirildi — 1 < qiymat() and qiymat() < 10 bo'lsa ikki marta bo'lardi.

Ehtiyot bo'ling — chalkash zanjirlar:

python
print(1 == 1 == True)       # True   — mantiqli
print(False == False in [False])    # True — g'alati!
# Bu: (False == False) and (False in [False]) → True and True

Bunday yozuvdan qoching.

2.9. all() va any()

Ko'p shartni tekshirish uchun:

python
sonlar = [2, 4, 6, 8]

print(all(s % 2 == 0 for s in sonlar))      # True  — hammasi juft
print(any(s > 7 for s in sonlar))           # True  — kamida bittasi > 7
print(all(s > 5 for s in sonlar))           # False
print(any(s > 100 for s in sonlar))         # False
Funksiya Qachon True
all(iterable) Hamma element truthy (yoki bo'sh)
any(iterable) Kamida bittasi truthy

Bo'sh to'plamda kutilmagan natija:

python
print(all([]))              # True!   — "hamma" element to'g'ri (birortasi ham yo'q)
print(any([]))              # False   — birortasi ham truthy emas

all([]) True — bu matematik kelishuv ("bo'shliqqa nisbatan rost"). Buni eslab qoling, aks holda kutilmagan xato bo'ladi.

Amaliy foydalanish:

python
parol = "Salom123!"

talablar = [
    len(parol) >= 8,
    any(h.isupper() for h in parol),
    any(h.islower() for h in parol),
    any(h.isdigit() for h in parol),
]

if all(talablar):
    print("Parol kuchli")
else:
    print("Parol zaif")

all() va any() ham qisqa tutashuv qiladi — birinchi mos kelmagan elementda to'xtaydi.


3. Tez ma'lumotnoma

Falsy qiymatlar (hammasi)

text
False   None   0   0.0   0j
""   []   ()   {}   set()   range(0)   b""

Qolgan hamma narsa — truthy.

Mantiqiy operatorlar

python
a and b     a falsy → a, aks holda b
a or b      a truthy → a, aks holda b
not a       doim bool qaytaradi

qisqa tutashuv: kerak bo'lmasa o'ng tomon hisoblanmaydi

Idiomatik yozuv

python
if royxat:                  ✅   if len(royxat) > 0:      ❌
if not royxat:              ✅   if royxat == []:         ❌
if faolmi:                  ✅   if faolmi == True:       ❌
if qiymat is None:          ✅   if not qiymat:           ⚠️ (0, "" ni ham ushlaydi)
if 18 <= yosh <= 65:        ✅   if yosh >= 18 and ...:   ⚠️

all / any

python
all(shartlar)       hammasi rostmi
any(shartlar)       kamida bittasi rostmi
all([]) → True      ← eslab qoling
any([]) → False

bool — int

python
True + True → 2
sum(x > 5 for x in sonlar)      shartga mos elementlarni sanash

4. Batafsil misollar

Misol 1 — Rostlik jadvalini yaratish

python
qiymatlar = [
    False, True, None,
    0, 1, -1, 0.0, 0.0001,
    "", " ", "0", "False",
    [], [0], [[]],
    (), (0,),
    {}, {0: 0},
    set(), {0},
    range(0), range(1),
]

print(f"{'Qiymat':<12} {'Turi':<10} {'bool()':<7}")
print("-" * 32)

for q in qiymatlar:
    belgi = "✅" if bool(q) else "❌"
    print(f"{repr(q):<12} {type(q).__name__:<10} {str(bool(q)):<7} {belgi}")
text
Qiymat       Turi       bool()
--------------------------------
False        bool       False   ❌
True         bool       True    ✅
None         NoneType   False   ❌
0            int        False   ❌
1            int        True    ✅
-1           int        True    ✅
0.0          float      False   ❌
0.0001       float      True    ✅
''           str        False   ❌
' '          str        True    ✅
'0'          str        True    ✅
'False'      str        True    ✅
[]           list       False   ❌
[0]          list       True    ✅
[[]]         list       True    ✅
()           tuple      False   ❌
(0,)         tuple      True    ✅
{}           dict       False   ❌
{0: 0}       dict       True    ✅
set()        set        False   ❌
{0}          set        True    ✅
range(0, 0)  range      False   ❌
range(0, 1)  range      True    ✅

Eng muhim qatorlar:

  • ' ' (bo'sh joy) → True — belgi bor
  • '0' → True — bu satr, nol emas
  • 'False' → True — bu ham satr
  • [0] → True — ro'yxat bo'sh emas
  • [[]] → True — ichida bo'sh ro'yxat bor, lekin o'zi bo'sh emas

Nima ko'rsatdi: 2.2-bo'lim. Bu jadvalni bir marta ko'rish — ko'p kelajakdagi chalkashlikni oldini oladi.

Misol 2 — and/or qiymat qaytarishi

python
print("=== and — birinchi falsy yoki oxirgisi ===")
print(f"1 and 2        = {1 and 2!r}")
print(f"0 and 2        = {0 and 2!r}")
print(f"'a' and 'b'    = {'a' and 'b'!r}")
print(f"'' and 'b'     = {'' and 'b'!r}")
print(f"1 and 2 and 3  = {1 and 2 and 3!r}")
print(f"1 and 0 and 3  = {1 and 0 and 3!r}")

print("\n=== or — birinchi truthy yoki oxirgisi ===")
print(f"1 or 2         = {1 or 2!r}")
print(f"0 or 2         = {0 or 2!r}")
print(f"'' or 'sukut'  = {'' or 'sukut'!r}")
print(f"None or [] or 0= {None or [] or 0!r}")

print("\n=== not — doim bool ===")
print(f"not 5          = {not 5!r}")
print(f"not ''         = {not ''!r}")
print(f"not [1,2]      = {not [1, 2]!r}")

print("\n=== Amaliy: sukut qiymatlar ===")
foydalanuvchi = {"ism": "", "yosh": 0, "shahar": "Toshkent"}

print(f"ism:    {foydalanuvchi['ism'] or 'Kiritilmagan'!r}")
print(f"shahar: {foydalanuvchi['shahar'] or 'Kiritilmagan'!r}")

print("\n=== ⚠️ Tuzoq: 0 ham falsy ===")
yosh_or = foydalanuvchi["yosh"] or 18
yosh_togri = foydalanuvchi["yosh"] if foydalanuvchi["yosh"] is not None else 18
print(f"or bilan:     {yosh_or}     ← 0 yo'qoldi!")
print(f"to'g'ri usul: {yosh_togri}")
text
=== and — birinchi falsy yoki oxirgisi ===
1 and 2        = 2
0 and 2        = 0
'a' and 'b'    = 'b'
'' and 'b'     = ''
1 and 2 and 3  = 3
1 and 0 and 3  = 0

=== or — birinchi truthy yoki oxirgisi ===
1 or 2         = 1
0 or 2         = 2
'' or 'sukut'  = 'sukut'
None or [] or 0= 0

=== not — doim bool ===
not 5          = False
not ''         = True
not [1,2]      = False

=== Amaliy: sukut qiymatlar ===
ism:    'Kiritilmagan'
shahar: 'Toshkent'

=== ⚠️ Tuzoq: 0 ham falsy ===
or bilan:     18     ← 0 yo'qoldi!
to'g'ri usul: 0

Nima ko'rsatdi: 2.4 va 2.6-bo'limlar. or bilan sukut qiymat berish qulay, lekin 0 va "" ni ehtiyot qiling.

Misol 3 — Qisqa tutashuvning amaliy foydasi

python
"""Foydalanuvchi ma'lumotlarini xavfsiz tekshirish."""


def tekshir_xavfsiz(foydalanuvchi: dict | None) -> str:
    """Qisqa tutashuv bilan xavfsiz tekshiruv."""
    if foydalanuvchi and foydalanuvchi.get("ism") and foydalanuvchi["ism"].strip():
        return f"Salom, {foydalanuvchi['ism'].strip()}!"
    return "Noma'lum foydalanuvchi"


def tekshir_xavfli(foydalanuvchi: dict | None) -> str:
    """Qisqa tutashuvsiz — xato beradi."""
    if foydalanuvchi["ism"].strip():
        return f"Salom, {foydalanuvchi['ism'].strip()}!"
    return "Noma'lum"


sinovlar = [
    None,
    {},
    {"ism": None},
    {"ism": ""},
    {"ism": "   "},
    {"ism": "  Ali  "},
]

print("=== ✅ Xavfsiz versiya ===")
for f in sinovlar:
    print(f"  {str(f):<20} → {tekshir_xavfsiz(f)}")

print("\n=== ❌ Xavfli versiya ===")
for f in sinovlar:
    try:
        natija = tekshir_xavfli(f)
    except (TypeError, KeyError, AttributeError) as xato:
        natija = f"XATO: {type(xato).__name__}"
    print(f"  {str(f):<20} → {natija}")
text
=== ✅ Xavfsiz versiya ===
  None                 → Noma'lum foydalanuvchi
  {}                   → Noma'lum foydalanuvchi
  {'ism': None}        → Noma'lum foydalanuvchi
  {'ism': ''}          → Noma'lum foydalanuvchi
  {'ism': '   '}       → Noma'lum foydalanuvchi
  {'ism': '  Ali  '}   → Salom, Ali!

=== ❌ Xavfli versiya ===
  None                 → XATO: TypeError
  {}                   → XATO: KeyError
  {'ism': None}        → XATO: AttributeError
  {'ism': ''}          → Noma'lum
  {'ism': '   '}       → Noma'lum
  {'ism': '  Ali  '}   → Salom, Ali!

Xavfsiz versiya uchta himoya qatlamini ketma-ket qo'ydi:

  1. foydalanuvchi — None emasmi
  2. .get("ism") — kalit bor va None emasmi
  3. .strip() — faqat bo'sh joy emasmi

Har biri oldingisi rost bo'lgandagina tekshiriladi. Bu — qisqa tutashuvning asosiy amaliy qiymati.

Nima ko'rsatdi: 2.5-bo'lim.

Misol 4 — Parol kuchini tekshirish

python
"""Parol kuchini tekshiradigan dastur."""

MIN_UZUNLIK = 8
MAXSUS_BELGILAR = "!@#$%^&*()_+-=[]{}|;:,.<>?"


def parol_tahlili(parol: str) -> dict[str, bool]:
    """Har bir talab bo'yicha natija qaytaradi."""
    return {
        f"Kamida {MIN_UZUNLIK} belgi": len(parol) >= MIN_UZUNLIK,
        "Katta harf bor": any(h.isupper() for h in parol),
        "Kichik harf bor": any(h.islower() for h in parol),
        "Raqam bor": any(h.isdigit() for h in parol),
        "Maxsus belgi bor": any(h in MAXSUS_BELGILAR for h in parol),
        "Bo'sh joy yo'q": not any(h.isspace() for h in parol),
    }


def kuchini_baho(parol: str) -> str:
    natijalar = parol_tahlili(parol)
    bajarilgan = sum(natijalar.values())      # bool → int (2.1-bo'lim)

    if bajarilgan == len(natijalar):
        return "Juda kuchli"
    if bajarilgan >= 5:
        return "Kuchli"
    if bajarilgan >= 3:
        return "O'rtacha"
    return "Zaif"


def hisobot(parol: str) -> None:
    print(f"\n┌─ Parol: {parol!r}")
    for talab, bajarildi in parol_tahlili(parol).items():
        belgi = "✅" if bajarildi else "❌"
        print(f"│  {belgi} {talab}")
    print(f"│")
    print(f"│  Baho: {kuchini_baho(parol)}")
    print(f"└─")


for parol in ["123", "salom123", "Salom123", "Salom123!", "Salom 123!"]:
    hisobot(parol)
text
┌─ Parol: '123'
│  ❌ Kamida 8 belgi
│  ❌ Katta harf bor
│  ❌ Kichik harf bor
│  ✅ Raqam bor
│  ❌ Maxsus belgi bor
│  ✅ Bo'sh joy yo'q
│
│  Baho: Zaif
└─

┌─ Parol: 'salom123'
│  ✅ Kamida 8 belgi
│  ❌ Katta harf bor
│  ✅ Kichik harf bor
│  ✅ Raqam bor
│  ❌ Maxsus belgi bor
│  ✅ Bo'sh joy yo'q
│
│  Baho: O'rtacha
└─

┌─ Parol: 'Salom123!'
│  ✅ Kamida 8 belgi
│  ✅ Katta harf bor
│  ✅ Kichik harf bor
│  ✅ Raqam bor
│  ✅ Maxsus belgi bor
│  ✅ Bo'sh joy yo'q
│
│  Baho: Juda kuchli
└─

Kodda ko'rish kerak:

  • any(h.isupper() for h in parol) — kamida bitta katta harf
  • not any(h.isspace() ...) — hech qanday bo'sh joy yo'q
  • sum(natijalar.values()) — bool larni sanash (2.1-bo'lim)
  • any() qisqa tutashuv qiladi — birinchi mos kelganda to'xtaydi

Nima ko'rsatdi: 2.1, 2.9-bo'limlar.


5. To'g'ri va noto'g'ri tushunishlar

Noto'g'ri fikr To'g'risi
"and/or True/False qaytaradi" Yo'q — operandlardan birini qaytaradi
"bool — alohida tur" U int dan meros. True + True == 2
""0" falsy" Yo'q — bu satr, bo'sh emas → True
"[0] falsy" Yo'q — ro'yxat bo'sh emas → True
"if x == True: to'g'ri" Ortiqcha. if x: yozing
"if x is True: xavfsizroq" Xavfliroq — truthy qiymatlarni ushlamaydi
"all([]) → False" True! Bo'sh to'plamga nisbatan "hammasi" rost
"& va and bir xil" & — bit amali, and — mantiq
"or bilan sukut qiymat berish xavfsiz" 0, "", [] ham falsy — ehtiyot bo'ling
"Zanjirli taqqoslash sekin" Aksincha — o'rtadagi ifoda bir marta hisoblanadi

6. Keng tarqalgan xatolar va yechimlari

1. 0 yoki "" ni "yo'q" deb hisoblash

python
def hisobla(chegirma=None):
    if not chegirma:            # ❌ 0 ni ham ushlaydi
        chegirma = 10
    return chegirma

print(hisobla(0))               # 10 — NOTO'G'RI

def hisobla_togri(chegirma=None):
    if chegirma is None:        # ✅
        chegirma = 10
    return chegirma

print(hisobla_togri(0))         # 0 — to'g'ri

2. and/or natijasini bool deb o'ylash

python
natija = matn and len(matn)
print(type(natija))             # matn bo'sh bo'lsa str, aks holda int!

natija = bool(matn and len(matn))   # ✅ agar bool kerak bo'lsa

3. Noto'g'ri tartib — qisqa tutashuvni buzish

python
if royxat[0] > 5 and royxat:    # ❌ IndexError
if royxat and royxat[0] > 5:    # ✅

4. is ni bool bilan noto'g'ri ishlatish

python
qiymat = 1
if qiymat is True:              # ❌ False! (1 is not True)
if qiymat:                      # ✅ True

5. &&, ||, ! yozish

python
if a && b:                      # ❌ SyntaxError
if a and b:                     # ✅

JavaScript yoki C dan kelganlar uchun klassik xato.

6. all() ni bo'sh to'plamda kutilmagan ishlatish

python
def hammasi_musbatmi(sonlar):
    return all(s > 0 for s in sonlar)

print(hammasi_musbatmi([]))     # True — kutilmagan bo'lishi mumkin

def hammasi_musbatmi_togri(sonlar):
    return bool(sonlar) and all(s > 0 for s in sonlar)

print(hammasi_musbatmi_togri([]))   # False

7. Ortiqcha bool() chaqirish

python
if bool(royxat) == True:        # ❌ uch marta ortiqcha
if royxat:                      # ✅

8. not prioriteti

python
print(not True == False)        # True  — (not True) == False
print(not (True == False))      # True  — bir xil, lekin aniqroq
print(not a == b)               # (not a) == b — ehtimol xohlagan emas!
print(a != b)                   # ✅ shuni xohlagansiz

not == dan yuqori prioritetga ega. 3.12-darsda batafsil.


7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 3.6-dars: None — eng muhim falsy qiymat
  • 3.11-dars: taqqoslash operatorlari — ular bool qaytaradi
  • 3.12-dars: operatorlar prioriteti — not, and, or tartibi
  • 5-qism: if, while — mantiqiy shartlarning asosiy joyi
  • 6-qism: ro'yxat va lug'atlarni bo'shligini tekshirish
  • 7-qism: funksiyalarda sukut argumentlar (None naqshi)
  • 6, 7-qismlar: generator ifodalari, filter()
  • 8-qism: __bool__ va __len__ — o'z sinflaringiz uchun rostlik

8. Eng yaxshi amaliyotlar

  1. if royxat: yozing, if len(royxat) > 0: emas. Bu — Python idiomasi.

  2. == True va is True yozmang. if faolmi: yetarli va aniqroq.

  3. None ni is None bilan tekshiring. not qiymat 0 va "" ni ham ushlaydi.

  4. Qisqa tutashuvni himoya uchun ishlating. if x and x.metod(): — juda foydali naqsh.

  5. Arzon va himoyalovchi shartni chapga qo'ying. Tartib faqat uslub emas, to'g'rilik masalasi.

  6. or bilan sukut qiymat berishda ehtiyot bo'ling. 0 va "" yaroqli qiymat bo'lishi mumkin.

  7. all()/any() ni ko'p shart uchun ishlating. O'qish oson va qisqa tutashuv qiladi.

  8. all([]) True ekanini eslang. Bo'sh to'plamni alohida tekshiring.


9. Amaliy topshiriq

Vazifa 1: Rostlikni bashorat qilish

Har biri True yoki False?

python
1.  bool(0)
2.  bool("0")
3.  bool([])
4.  bool([[]])
5.  bool(" ")
6.  bool(0.0)
7.  bool(-1)
8.  bool({})
9.  bool({0: 0})
10. bool(None)
11. bool("False")
12. bool(range(0))
Javoblar

False: 1, 3, 6, 8, 10, 12 True: 2, 4, 5, 7, 9, 11

Eng tuzoqli: "0" (satr), [[]] (bo'sh emas), " " (bo'sh joy ham belgi), "False" (satr).

Vazifa 2: and/or natijalari

Har birining aniq qiymatini yozing (True/False emas, haqiqiy qiymat):

python
1.  5 and 10
2.  0 and 10
3.  5 or 10
4.  0 or 10
5.  "" or "sukut"
6.  [] or {} or "oxirgi"
7.  1 and 2 and 0 and 3
8.  None or 0 or ""
9.  not 0
10. not "salom"
Javoblar
  1. 10
  2. 0
  3. 5
  4. 10
  5. 'sukut'
  6. 'oxirgi'
  7. 0 — birinchi falsy
  8. '' — hammasi falsy, oxirgisi
  9. True
  10. False

Vazifa 3: Qisqa tutashuvni tuzatish

Har bir kodda xato bor. Toping va tuzating:

python
1.  if matn[0] == "A" and matn:
2.  if jami / soni > 100 and soni != 0:
3.  if lugat["kalit"] and "kalit" in lugat:
4.  if len(royxat) > 0 and royxat[0]:
Javoblar
python
1.  if matn and matn[0] == "A":
2.  if soni != 0 and jami / soni > 100:
3.  if "kalit" in lugat and lugat["kalit"]:
4.  if royxat and royxat[0]:        # len() ham ortiqcha

Har birida himoyalovchi shart chapda bo'lishi kerak.

Vazifa 4: Sukut qiymat tuzog'i

python
def buyurtma(soni=None, izoh=None):
    soni = soni or 1
    izoh = izoh or "Izoh yo'q"
    return f"Soni: {soni}, Izoh: {izoh}"

print(buyurtma())
print(buyurtma(0, ""))
print(buyurtma(5, "Tez yetkazish"))
  1. Ikkinchi chaqiruvda nima chiqadi?
  2. Bu to'g'rimi?
  3. Tuzating.
Javob

Chiqadi: Soni: 1, Izoh: Izoh yo'q — lekin foydalanuvchi ataylab 0 va "" bergan.

Tuzatish:

python
def buyurtma(soni=None, izoh=None):
    soni = 1 if soni is None else soni
    izoh = "Izoh yo'q" if izoh is None else izoh
    return f"Soni: {soni}, Izoh: {izoh}"

Vazifa 5: all va any

Ro'yxat berilgan:

python
sonlar = [12, 5, 8, 21, 16]

Yozing:

  1. Hammasi musbatmi?
  2. Kamida bittasi 20 dan kattami?
  3. Hammasi juftmi?
  4. Birortasi 3 ga bo'linadimi?
  5. Hammasi 1 dan 100 orasidami? (zanjirli taqqoslash bilan)
Javoblar
python
print(all(s > 0 for s in sonlar))               # True
print(any(s > 20 for s in sonlar))              # True
print(all(s % 2 == 0 for s in sonlar))          # False
print(any(s % 3 == 0 for s in sonlar))          # True
print(all(1 <= s <= 100 for s in sonlar))       # True

Vazifa 6: Sanash

Talabalar ballari berilgan:

python
ballar = [85, 42, 91, 55, 78, 63, 38, 95, 71]

bool → int xususiyatidan foydalanib hisoblang (if ishlatmasdan):

  1. Nechtasi 60 dan yuqori
  2. Nechtasi 90 dan yuqori
  3. O'tganlar foizi
  4. Nechtasi 40 dan past
Javoblar
python
print(sum(b >= 60 for b in ballar))                     # 6
print(sum(b >= 90 for b in ballar))                     # 2
print(f"{sum(b >= 60 for b in ballar) / len(ballar):.0%}")  # 67%
print(sum(b < 40 for b in ballar))                      # 1

Vazifa 7: O'z rostlik funksiyangiz

royxat_bosh_mi(qiymat) funksiyasini yozing:

  • None → True
  • Bo'sh ro'yxat/satr/lug'at → True
  • Faqat bo'sh joydan iborat satr → True
  • Ichida faqat None bo'lgan ro'yxat → True
  • Qolgani → False
Yechim
python
def royxat_bosh_mi(qiymat) -> bool:
    if qiymat is None:
        return True
    if isinstance(qiymat, str):
        return not qiymat.strip()
    if isinstance(qiymat, (list, tuple, set)):
        return all(e is None for e in qiymat)
    if isinstance(qiymat, dict):
        return not qiymat
    return not qiymat


sinovlar = [None, "", "   ", "matn", [], [None, None], [1], {}, {"a": 1}, 0, 5]
for s in sinovlar:
    print(f"{repr(s):<16} → {royxat_bosh_mi(s)}")

Diqqat: all(...) bo'sh ro'yxatda True beradi — bu bizga kerak (2.9-bo'lim).

Nimani mustahkamlaydi: 2.1, 2.2, 2.4, 2.5, 2.6, 2.9-bo'limlar.


Xulosa

Bu darsda bool va Pythonning mantiq tizimini o'rgandik.

Eng muhim uch fikr:

  1. Rostlik True/False dan kengroq. Bo'sh narsalar (0, "", [], {}, None) — falsy. Qolgan hamma narsa truthy. "0" va [0] — truthy, chunki ular bo'sh emas.

  2. and/or mantiqiy qiymat emas, operandni qaytaradi. 1 and 2 → 2. Bu — sukut qiymat berish va xavfsiz zanjir uchun juda foydali naqsh.

  3. Qisqa tutashuv — himoya vositasi. if x and x.metod(): — chap tomon falsy bo'lsa, o'ng umuman hisoblanmaydi. Himoyalovchi shartni doim chapga qo'ying.

Keyingi darsda None ni o'rganamiz — "hech narsa" ni ifodalovchi maxsus qiymat. U eng ko'p ishlatiladigan, eng ko'p xato keltiradigan va eng ko'p noto'g'ri tushuniladigan qiymat.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
3.5-dars: bool va mantiq — IlmHamroh