Mundarija (23)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. bool — int ning bolasi
- 2.2. Rostlik (truthiness) — bool() nima qaytaradi
- 2.3. and, or, not
- 2.4. and va or qiymat qaytaradi
- 2.5. Qisqa tutashuv (short-circuit)
- 2.6. Amaliy naqshlar
- 2.7. if x is True — nega yozmaslik kerak
- 2.8. Taqqoslashlarni zanjirlash
- 2.9. all() va any()
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Rostlik jadvalini yaratish
- Misol 2 — and/or qiymat qaytarishi
- Misol 3 — Qisqa tutashuvning amaliy foydasi
- Misol 4 — Parol kuchini tekshirish
- 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
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:
if []:
print("ishlaydi") # ishlamaydi — bo'sh ro'yxat Falseif [0]:
print("ishlaydi") # ISHLAYDI — bo'sh emas ro'yxat Trueprint(0 == False) # True
print("" == False) # False ← nega?!
print(bool("") == False) # TrueVa yana:
print(1 and 2) # 2 ← True emas!
print(0 or "salom") # 'salom'
print(not 5) # Falseand va or mantiqiy qiymat qaytarmaydi — ular operandlardan birini qaytaradi. Bu — Pythondagi eng foydali va eng chalkashtiradigan xususiyatlardan biri.
Bu darsda:
True/Falsevaintbilan bog'liqligi- Rostlik (truthiness) — nima
True, nimaFalsedeb hisoblanadi and,or,notva qisqa tutashuv (short-circuit)and/orning 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:
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:
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) # TrueBu — 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:
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:
javoblar = ["Noto'g'ri", "To'g'ri"]
natija = 5 > 3
print(javoblar[natija]) # 'To'g'ri' — chunki True == 1Chiroyli, lekin o'qish qiyin. Odatiy
ifyaxshiroq.
True va False — yagona obyektlar:
a = True
b = True
print(a is b) # True — bitta obyekt
print(id(True)) # doim bir xilShuning 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:
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 baytlarQolgan hamma narsa True:
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 nolUmumiy qoida:
"Bo'sh" yoki "nol" bo'lgan narsa —
False. Qolgani —True.
Eng ko'p tuzoq beradigan uchlik:
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 belgiBu qanday ishlaydi? Obyekt __bool__() yoki __len__() metodini beradi (8-qism):
class BoshQuti:
def __len__(self):
return 0
print(bool(BoshQuti())) # False — chunki uzunligi 0Agar ikkalasi ham bo'lmasa, obyekt doim True.
2.3. and, or, not
print(True and False) # False
print(True or False) # True
print(not True) # FalseHaqiqat 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:
Python: and or not
C/Java/JS: && || !&, |, ^ Pythonda ham bor, lekin ular — bit amallari (3.3-dars). Ularni mantiq uchun ishlatmang:
print(True & False) # False — ishlaydi, lekin
print(5 & 3) # 1 — bu bit amali!
print(5 and 3) # 3 — bu mantiq2.4. and va or qiymat qaytaradi
Bu — Pythondagi eng muhim va eng ko'p chalkashtiradigan xususiyat.
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 oxirgisinior— birinchi truthy ni qaytaradi, yoki oxirgisini
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, oxirgisinot esa doim bool qaytaradi:
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.
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() # chaqiriladi1. False and ...
2. True and ...
qimmat amal bajarildi
3. True or ...
4. False or ...
qimmat amal bajarildiBu — juda foydali:
# ❌ 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":# Nolga bo'lishdan himoya
if soni != 0 and jami / soni > 100:
print("O'rtacha yuqori")# Lug'at kalitini xavfsiz tekshirish
if "ism" in foydalanuvchi and foydalanuvchi["ism"].strip():
print("Ism bor")Tartib muhim:
# ❌ 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)
ism = kiritilgan_ism or "Mehmon"
port = sozlama.get("port") or 8080
royxat = berilgan or [] Tuzoq: 0, "", [] ham falsy!
soni = kiritilgan or 10
# Agar kiritilgan == 0 bo'lsa, soni = 10 bo'ladi — ehtimol noto'g'ri!To'g'ri usul:
soni = kiritilgan if kiritilgan is not None else 102. Xavfsiz zanjir (and)
uzunlik = matn and len(matn) # matn None bo'lsa None qaytadiZamonaviy usul (3.8+):
uzunlik = len(matn) if matn else 03. Bo'shlikni tekshirish
# ❌ Ortiqcha
if len(royxat) > 0:
if royxat != []:
if bool(royxat) == True:
# ✅ Pythonda idiomatik
if royxat:
if not royxat:4. None ni tekshirish
# ❌ Chalkashtiradi
if qiymat: # 0, "", [] ham False beradi!
# ✅ Aniq
if qiymat is not None:Bu farq juda muhim:
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()) # 20def 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
# ❌ Ortiqcha va xavfli
if faolmi == True:
if faolmi is True:
# ✅ To'g'ri
if faolmi:Nega is True xavfli?
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 ishlaydiis True faqat aynan True obyekti bilan mos keladi. Truthy qiymatlar bilan ishlamaydi.
Inkor uchun ham:
# ❌
if faolmi == False:
if not faolmi == True:
# ✅
if not faolmi:2.8. Taqqoslashlarni zanjirlash
Python matematikaga o'xshash yozuvga ruxsat beradi:
yosh = 25
print(18 <= yosh <= 65) # True
# Bu quyidagiga teng:
print(18 <= yosh and yosh <= 65) # TrueBoshqa ko'p tilda bu ishlamaydi:
C tilida: 18 <= 25 <= 65
→ (18 <= 25) <= 65
→ 1 <= 65
→ 1 (True) — tasodifan to'g'ri, lekin sabab noto'g'riZanjir uzunligi cheklanmagan:
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:
def qiymat():
print(" chaqirildi")
return 5
print(1 < qiymat() < 10) chaqirildi
TrueBir marta chaqirildi — 1 < qiymat() and qiymat() < 10 bo'lsa ikki marta bo'lardi.
Ehtiyot bo'ling — chalkash zanjirlar:
print(1 == 1 == True) # True — mantiqli
print(False == False in [False]) # True — g'alati!
# Bu: (False == False) and (False in [False]) → True and TrueBunday yozuvdan qoching.
2.9. all() va any()
Ko'p shartni tekshirish uchun:
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:
print(all([])) # True! — "hamma" element to'g'ri (birortasi ham yo'q)
print(any([])) # False — birortasi ham truthy emasall([]) True — bu matematik kelishuv ("bo'shliqqa nisbatan rost"). Buni eslab qoling, aks holda kutilmagan xato bo'ladi.
Amaliy foydalanish:
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)
False None 0 0.0 0j
"" [] () {} set() range(0) b""Qolgan hamma narsa — truthy.
Mantiqiy operatorlar
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 hisoblanmaydiIdiomatik yozuv
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
all(shartlar) hammasi rostmi
any(shartlar) kamida bittasi rostmi
all([]) → True ← eslab qoling
any([]) → Falsebool — int
True + True → 2
sum(x > 5 for x in sonlar) shartga mos elementlarni sanash4. Batafsil misollar
Misol 1 — Rostlik jadvalini yaratish
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}")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
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}")=== 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: 0Nima 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
"""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}")=== ✅ 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:
foydalanuvchi—Noneemasmi.get("ism")— kalit bor vaNoneemasmi.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
"""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)┌─ 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 harfnot any(h.isspace() ...)— hech qanday bo'sh joy yo'qsum(natijalar.values())—boollarni 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
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'ri2. and/or natijasini bool deb o'ylash
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'lsa3. Noto'g'ri tartib — qisqa tutashuvni buzish
if royxat[0] > 5 and royxat: # ❌ IndexError
if royxat and royxat[0] > 5: # ✅4. is ni bool bilan noto'g'ri ishlatish
qiymat = 1
if qiymat is True: # ❌ False! (1 is not True)
if qiymat: # ✅ True5. &&, ||, ! yozish
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
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([])) # False7. Ortiqcha bool() chaqirish
if bool(royxat) == True: # ❌ uch marta ortiqcha
if royxat: # ✅8. not prioriteti
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 xohlagansiznot == 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
boolqaytaradi - 3.12-dars: operatorlar prioriteti —
not,and,ortartibi - 5-qism:
if,while— mantiqiy shartlarning asosiy joyi - 6-qism: ro'yxat va lug'atlarni bo'shligini tekshirish
- 7-qism: funksiyalarda sukut argumentlar (
Nonenaqshi) - 6, 7-qismlar: generator ifodalari,
filter() - 8-qism:
__bool__va__len__— o'z sinflaringiz uchun rostlik
8. Eng yaxshi amaliyotlar
if royxat:yozing,if len(royxat) > 0:emas. Bu — Python idiomasi.== Truevais Trueyozmang.if faolmi:yetarli va aniqroq.Noneniis Nonebilan tekshiring.not qiymat0va""ni ham ushlaydi.Qisqa tutashuvni himoya uchun ishlating.
if x and x.metod():— juda foydali naqsh.Arzon va himoyalovchi shartni chapga qo'ying. Tartib faqat uslub emas, to'g'rilik masalasi.
orbilan sukut qiymat berishda ehtiyot bo'ling.0va""yaroqli qiymat bo'lishi mumkin.all()/any()ni ko'p shart uchun ishlating. O'qish oson va qisqa tutashuv qiladi.all([])Trueekanini eslang. Bo'sh to'plamni alohida tekshiring.
9. Amaliy topshiriq
Vazifa 1: Rostlikni bashorat qilish
Har biri True yoki False?
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):
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
100510'sukut''oxirgi'0— birinchi falsy''— hammasi falsy, oxirgisiTrueFalse
Vazifa 3: Qisqa tutashuvni tuzatish
Har bir kodda xato bor. Toping va tuzating:
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
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 ortiqchaHar birida himoyalovchi shart chapda bo'lishi kerak.
Vazifa 4: Sukut qiymat tuzog'i
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"))- Ikkinchi chaqiruvda nima chiqadi?
- Bu to'g'rimi?
- Tuzating.
Javob
Chiqadi: Soni: 1, Izoh: Izoh yo'q — lekin foydalanuvchi ataylab 0 va "" bergan.
Tuzatish:
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:
sonlar = [12, 5, 8, 21, 16]Yozing:
- Hammasi musbatmi?
- Kamida bittasi 20 dan kattami?
- Hammasi juftmi?
- Birortasi 3 ga bo'linadimi?
- Hammasi 1 dan 100 orasidami? (zanjirli taqqoslash bilan)
Javoblar
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)) # TrueVazifa 6: Sanash
Talabalar ballari berilgan:
ballar = [85, 42, 91, 55, 78, 63, 38, 95, 71]bool → int xususiyatidan foydalanib hisoblang (if ishlatmasdan):
- Nechtasi 60 dan yuqori
- Nechtasi 90 dan yuqori
- O'tganlar foizi
- Nechtasi 40 dan past
Javoblar
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)) # 1Vazifa 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
Nonebo'lgan ro'yxat →True - Qolgani →
False
Yechim
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:
Rostlik
True/Falsedan kengroq. Bo'sh narsalar (0,"",[],{},None) — falsy. Qolgan hamma narsa truthy."0"va[0]— truthy, chunki ular bo'sh emas.and/ormantiqiy qiymat emas, operandni qaytaradi.1 and 2→2. Bu — sukut qiymat berish va xavfsiz zanjir uchun juda foydali naqsh.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.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!