IlmHamroh
Python kursi/Boshqaruv oqimi10/12-dars28 daqiqa
Mundarija (23)

5.10-dars: break, continue, sikl else

5-QISM — BOSHQARUV OQIMI · 10-dars


1. Kirish va motivatsiya

Sikl har doim boshidan oxirigacha ishlashi shart emas. Ba'zan:

  • Erta chiqish kerak — kerakli narsa topildi
  • Elementni o'tkazib yuborish kerak — u mos emas
  • Sikl to'liq tugadimi yoki uzildimi — bilish kerak

Bu uch ehtiyoj uchun uch vosita bor:

python
break               # sikldan butunlay chiqish
continue            # keyingi iteratsiyaga o'tish
else                # sikl BREAK SIZ tugaganda

Ular oldingi darslarda tegib o'tildi. Bu darsda to'liq ko'ramiz — chunki ular bilan bir necha nozik jihat bor:

python
for i in range(3):
    for j in range(3):
        if shart:
            break               # ← qaysi sikldan chiqadi?
python
while i < 10:
    if shart:
        continue                # ← i oshmadi → cheksiz sikl
    i += 1
python
for x in royxat:
    ...
else:
    print("...")                # ← qachon bajariladi?

2. Nazariya — chuqur tushuntirish

2.1. break — sikldan chiqish

python
for x in [1, 2, 3, 4, 5]:
    if x > 3:
        break
    print(x)
text
1
2
3

break — eng yaqin siklni to'xtatadi:

python
for i in range(3):
    for j in range(3):
        if j == 1:
            break               # faqat ICHKI sikldan
        print(i, j)
text
0 0
1 0
2 0

Pythonda break label yo'q. Ba'zi tillarda (Java, JavaScript) tashqi sikldan chiqish uchun yorliq bor:

java
tashqi:
for (...) {
    for (...) {
        break tashqi;   // Java
    }
}

Pythonda — yo'q. Yechimlar 11-darsda.

break qayerda ishlaydi:

python
for ...: break                  # ✅
while ...: break                # ✅

if shart: break                 # ❌ SyntaxError — sikldan tashqarida
def f(): break                  # ❌ SyntaxError

try/finally bilan:

python
for x in royxat:
    try:
        if shart(x):
            break               # finally BARIBIR bajariladi
    finally:
        tozalash()

9-qismda batafsil.

2.2. continue — keyingi iteratsiya

python
for x in [1, 2, 3, 4, 5]:
    if x % 2 == 0:
        continue                # juftlarni o'tkazib yuborish
    print(x)
text
1
3
5

continue — sikl tanasining qolgan qismini o'tkazib yuboradi:

python
for x in range(5):
    print(f"  boshi: {x}")
    if x == 2:
        continue
    print(f"  oxiri: {x}")
text
  boshi: 0
  oxiri: 0
  boshi: 1
  oxiri: 1
  boshi: 2         ← "oxiri: 2" YO'Q
  boshi: 3
  oxiri: 3
  boshi: 4
  oxiri: 4

while da tuzoq (5-dars):

python
i = 0
while i < 5:
    if i == 2:
        continue                # ❌ i o'zgarmadi → CHEKSIZ
    print(i)
    i += 1

Yechim — o'zgarishni continue dan oldin:

python
i = 0
while i < 5:
    i += 1                      # ✅
    if i == 3:
        continue
    print(i)

for da bunday muammo yo'q — iterator o'zi keyingi elementga o'tadi.

continue — qo'riqchi shart siklda (2-dars):

python
# ❌ Chuqur ichma-ich
for qator in qatorlar:
    if qator.strip():
        if not qator.startswith("#"):
            if "=" in qator:
                ishla(qator)

# ✅ continue bilan
for qator in qatorlar:
    if not qator.strip():
        continue
    if qator.startswith("#"):
        continue
    if "=" not in qator:
        continue
    ishla(qator)

Chekinish bir daraja — o'qish ancha oson.

2.3. Sikl else

5-darsda while/else ni ko'rdik. for/else ham bir xil ishlaydi:

python
for x in royxat:
    if shart(x):
        break
else:
    # break BO'LMASA bajariladi
    print("Topilmadi")

Uch holat:

python
# 1. break bilan — else BAJARILMAYDI
for x in [1, 2, 3]:
    if x == 2:
        break
else:
    print("else")               # ← bajarilmaydi

# 2. break siz — else BAJARILADI
for x in [1, 2, 3]:
    pass
else:
    print("else")               # ← bajariladi ✅

# 3. Bo'sh to'plam — else BAJARILADI
for x in []:
    pass
else:
    print("else")               # ← bajariladi ✅

return bilan ham else bajarilmaydi:

python
def f(royxat):
    for x in royxat:
        if shart(x):
            return x
    else:
        print("else")           # ← return bo'lsa bajarilmaydi
    return None

Aslida return funksiyadan chiqadi, shuning uchun else ga yetib bo'lmaydi. Bunday holatda else ortiqcha:

python
def f(royxat):
    for x in royxat:
        if shart(x):
            return x
    return None                 # ✅ else kerak emas

Nom chalkash. Guido van Rossum: "nobreak deb nomlash kerak edi".

Uni tushunish uchun izoh yozing:

python
for x in royxat:
    if shart(x):
        break
else:
    # Sikl break siz tugadi — element topilmadi
    ...

Qachon foydali:

python
# ❌ Bayroq bilan
topildi = False
for x in royxat:
    if shart(x):
        topildi = True
        break

if not topildi:
    xato()

# ✅ else bilan
for x in royxat:
    if shart(x):
        break
else:
    xato()

Klassik misol — tub sonlar:

python
for n in range(2, 20):
    for d in range(2, int(n ** 0.5) + 1):
        if n % d == 0:
            break
    else:
        print(n, end=" ")       # tub son
text
2 3 5 7 11 13 17 19

Bu — Pythonning rasmiy hujjatidagi klassik misol.

2.4. break va continue — qachon

break — natija topilganda:

python
# Birinchi mos elementni topish
for x in royxat:
    if shart(x):
        natija = x
        break

Lekin ko'p holatda yaxshiroq usul bor:

python
# ✅ Generator bilan (10-qism)
natija = next((x for x in royxat if shart(x)), None)

# ✅ Funksiyada return
def topish(royxat):
    for x in royxat:
        if shart(x):
            return x
    return None

continue — filtrlash:

python
for x in royxat:
    if not shart(x):
        continue
    ishla(x)

Lekin ko'p holatda yaxshiroq:

python
# ✅ Generator ifodasi
for x in (y for y in royxat if shart(y)):
    ishla(x)

# ✅ filter
for x in filter(shart, royxat):
    ishla(x)

# ✅ Ro'yxat generatori
for x in [y for y in royxat if shart(y)]:
    ishla(x)

Qachon continue afzal:

python
# Bir necha tekshiruv — har birining sababi bilan
for qator in fayl:
    if not qator.strip():
        continue                        # bo'sh qator
    if qator.startswith("#"):
        continue                        # izoh
    if len(qator) > MAX:
        log(f"Juda uzun: {qator[:50]}")
        continue                        # xato, lekin davom etamiz

    ishla(qator)

Bu yerda har bir continue — alohida sabab va ba'zilari qo'shimcha ish qiladi. Generator bilan buni ifodalash qiyin.

2.5. break va else — qidiruv naqshlari

1. Birinchi mos element:

python
# else bilan
for x in royxat:
    if shart(x):
        natija = x
        break
else:
    natija = None

# ✅ Generator bilan — qisqaroq
natija = next((x for x in royxat if shart(x)), None)

2. Barcha element mos keladimi:

python
# else bilan
for x in royxat:
    if not shart(x):
        hammasi_mos = False
        break
else:
    hammasi_mos = True

# ✅ all() bilan (3.5-dars)
hammasi_mos = all(shart(x) for x in royxat)

3. Kamida bittasi mos keladimi:

python
# ✅ any() bilan
kamida_bittasi = any(shart(x) for x in royxat)

4. Indeks topish:

python
# else bilan
for i, x in enumerate(royxat):
    if x == qidiruv:
        break
else:
    i = -1

# ✅ Generator bilan
i = next((i for i, x in enumerate(royxat) if x == qidiruv), -1)

Xulosa: for/else kam kerak — any, all, next ko'pincha aniqroq.

else haqiqatan foydali holatlar:

python
# 1. Sikl ichida murakkab ish bo'lsa
for urinish in range(3):
    try:
        natija = sorov()
        break
    except TimeoutError:
        time.sleep(2 ** urinish)
else:
    raise RuntimeError("Barcha urinish muvaffaqiyatsiz")

# 2. Ichma-ich sikl (11-dars)
for i in range(n):
    for j in range(m):
        if jadval[i][j] == qidiruv:
            break
    else:
        continue
    break
else:
    print("Topilmadi")

Ikkinchisi — chalkash, funksiyaga o'rash yaxshiroq.

2.6. break/continue va resurs tozalash

break resursni oqizishi mumkin:

python
# ❌ Fayl yopilmadi
for yol in yollar:
    f = open(yol)
    if shart:
        break                   # f.close() chaqirilmadi
    f.close()

# ✅ with bilan
for yol in yollar:
    with open(yol) as f:
        if shart:
            break               # ✅ with fayl yopadi

try/finally bilan:

python
for x in royxat:
    resurs = ol()
    try:
        if shart(x):
            break
        ishla(resurs)
    finally:
        ozod(resurs)            # ✅ break bo'lsa ham bajariladi

10 va 9-qismlarda batafsil.

2.7. break generatorlarda

Generator bilan break — maxsus holat:

python
def generator():
    for i in range(5):
        print(f"  yield {i}")
        yield i
    print("  generator tugadi")


for x in generator():
    if x == 2:
        break
text
  yield 0
  yield 1
  yield 2

break bo'lganda generator to'xtatiladi — qolgan kod bajarilmaydi.

Tozalash kerak bo'lsa try/finally:

python
def generator():
    try:
        for i in range(5):
            yield i
    finally:
        print("  tozalash")     # ✅ break bo'lsa ham bajariladi


for x in generator():
    if x == 2:
        break
text
  tozalash

10-qismda batafsil.

2.8. Alternativalar

break o'rniga:

python
# 1. Funksiyada return
def topish(royxat):
    for x in royxat:
        if shart(x):
            return x
    return None

# 2. next() bilan
natija = next((x for x in royxat if shart(x)), None)

# 3. itertools.takewhile
from itertools import takewhile
for x in takewhile(lambda y: y < 10, royxat):
    ...

# 4. Shart bilan while
while shart():
    ...

continue o'rniga:

python
# 1. Generator ifodasi
for x in (y for y in royxat if shart(y)):
    ...

# 2. filter
for x in filter(shart, royxat):
    ...

# 3. itertools.dropwhile / filterfalse
from itertools import filterfalse
for x in filterfalse(shart, royxat):
    ...

# 4. Ro'yxat generatori
for x in [y for y in royxat if shart(y)]:
    ...

for/else o'rniga:

python
# 1. any() / all()
if any(shart(x) for x in royxat): ...
if all(shart(x) for x in royxat): ...

# 2. next() sukut bilan
natija = next((x for x in royxat if shart(x)), None)
if natija is None: ...

# 3. Funksiyada return
def topish(royxat):
    for x in royxat:
        if shart(x):
            return x
    return None                 # "else" o'rniga

Qaror:

Vaziyat Yechim
Birinchi mos elementni topish next(gen, None)
Barcha mos keladimi all(...)
Kamida bittasi any(...)
Filtrlash Generator yoki filter
Murakkab tekshiruvlar zanjiri continue
Sikl ichida qayta urinish break + else
Ichma-ich sikldan chiqish Funksiya + return

2.9. Tezlik

python
import time

N = 1_000_000
royxat = list(range(N))
qidiruv = N - 1

# break bilan
boshlandi = time.perf_counter()
for x in royxat:
    if x == qidiruv:
        natija1 = x
        break
vaqt_break = time.perf_counter() - boshlandi

# next() bilan
boshlandi = time.perf_counter()
natija2 = next((x for x in royxat if x == qidiruv), None)
vaqt_next = time.perf_counter() - boshlandi

# in bilan
boshlandi = time.perf_counter()
natija3 = qidiruv if qidiruv in royxat else None
vaqt_in = time.perf_counter() - boshlandi

# index bilan
boshlandi = time.perf_counter()
natija4 = royxat[royxat.index(qidiruv)]
vaqt_index = time.perf_counter() - boshlandi

in va .index() — C darajasida, shuning uchun tezroq.

continue tezligi:

python
# continue bilan
for x in royxat:
    if x % 2:
        continue
    jami += x

# Generator bilan
jami = sum(x for x in royxat if x % 2 == 0)

Generator odatda tezroq — chunki sikl C darajasida.


3. Tez ma'lumotnoma

Uch vosita

python
break       sikldan butunlay chiqish (ENG YAQIN sikldan)
continue    keyingi iteratsiyaga o'tish
else        sikl BREAK SIZ tugaganda

Tuzoqlar

python
while i < n:
    if shart: continue          ❌ i o'zgarmadi → cheksiz
    i += 1

while i < n:
    i += 1                      ✅ continue dan OLDIN
    if shart: continue

for i in ...:
    for j in ...:
        break                   ← faqat ICHKI sikldan

else — "nobreak"

python
for x in royxat:
    if shart(x): break
else:
    # break BO'LMASA
    ...

break bilan     → else YO'Q
break siz       → else BAJARILADI
bo'sh to'plam   → else BAJARILADI
return bilan    → else ga yetib bo'lmaydi

Alternativalar

python
break + else    → next((x for x in y if c), None)
                → any(...) / all(...)
                → funksiyada return
continue        → (x for x in y if c)
                → filter(c, y)
ichma-ich break → funksiya + return

Resurs

python
for x in y:
    with open(...) as f:        ✅ break xavfsiz
        if c: break

4. Batafsil misollar

Misol 1 — break va continue asoslari

python
"""Sikl oqimini boshqarish."""

print("=== 1. break — sikldan chiqish ===")

for x in [1, 2, 3, 4, 5]:
    if x > 3:
        print(f"    break at {x}")
        break
    print(f"    {x}")


print("\n\n=== 2. continue — keyingi iteratsiya ===")

for x in range(5):
    print(f"    boshi: {x}", end="")
    if x == 2:
        print("  → continue")
        continue
    print(f"  oxiri: {x}")


print("\n\n=== 3. ⚠️ while + continue tuzog'i ===")

print("  ❌ Cheksiz sikl (namoyish uchun cheklovli):")
i = 0
iteratsiya = 0
while i < 5 and iteratsiya < 10:
    iteratsiya += 1
    if i == 2:
        continue                # ❌ i o'zgarmaydi
    print(f"    i={i}", end="")
    i += 1
print(f"\n    ← {iteratsiya} iteratsiyada to'xtatildi (cheklov bilan)")

print("\n  ✅ To'g'ri — o'zgarish continue dan OLDIN:")
i = 0
while i < 5:
    i += 1
    if i == 3:
        continue
    print(f"    i={i}", end="")
print()


print("\n\n=== 4. break — faqat ichki sikldan ===")

for i in range(3):
    for j in range(3):
        if j == 1:
            break               # faqat ichki
        print(f"    ({i}, {j})", end="")
print()
print("  ← Tashqi sikl davom etdi (3 marta)")


print("\n\n=== 5. continue bilan qo'riqchi shart ===")

QATORLAR = [
    "host = localhost",
    "",
    "# Bu izoh",
    "port = 8000",
    "   ",
    "notogri qator",
    "debug = true",
]

print("  ❌ Ichma-ich if:")
print("""    for qator in qatorlar:
        if qator.strip():
            if not qator.startswith("#"):
                if "=" in qator:
                    ishla(qator)""")

print("\n  ✅ continue bilan:")
for qator in QATORLAR:
    if not qator.strip():
        continue
    if qator.strip().startswith("#"):
        continue
    if "=" not in qator:
        print(f"    ⚠️ Noto'g'ri: {qator!r}")
        continue

    kalit, _, qiymat = qator.partition("=")
    print(f"    ✅ {kalit.strip():<8} = {qiymat.strip()!r}")


print("\n\n=== 6. break va resurs ===")

import io

FAYLLAR = {
    "a.txt": "birinchi\nkerakli\n",
    "b.txt": "ikkinchi\n",
}


def soxta_open(nom):
    return io.StringIO(FAYLLAR[nom])


print("  ✅ with bilan — break xavfsiz:")
for nom in FAYLLAR:
    with soxta_open(nom) as f:
        for qator in f:
            if "kerakli" in qator:
                print(f"    {nom} da topildi: {qator.strip()!r}")
                break
    # with fayl yopdi — break bo'lsa ham
print("    ← Barcha fayl to'g'ri yopildi")

Natijaning muhim qismi:

text
=== 3. ⚠️ while + continue tuzog'i ===
  ❌ Cheksiz sikl (namoyish uchun cheklovli):
    i=0    i=1
    ← 10 iteratsiyada to'xtatildi (cheklov bilan)

  ✅ To'g'ri — o'zgarish continue dan OLDIN:
    i=1    i=2    i=4    i=5

=== 5. continue bilan qo'riqchi shart ===
  ✅ continue bilan:
    ✅ host     = 'localhost'
    ✅ port     = '8000'
    ⚠️ Noto'g'ri: 'notogri qator'
    ✅ debug    = 'true'

Nima ko'rsatdi: 2.1, 2.2, 2.6-bo'limlar.

Misol 2 — Sikl else

python
"""for/else va while/else."""

print("=== 1. Uch holat ===")

print("  break BILAN:")
for x in [1, 2, 3]:
    if x == 2:
        print(f"    break at {x}")
        break
else:
    print("    else — BAJARILMAYDI")

print("\n  break SIZ:")
for x in [1, 2, 3]:
    pass
else:
    print("    else — bajarildi ✅")

print("\n  Bo'sh to'plam:")
for x in []:
    print("    bajarilmaydi")
else:
    print("    else — bajarildi ✅")

print("\n  return bilan (funksiya ichida):")


def f():
    for x in [1, 2, 3]:
        if x == 2:
            return "return"
    else:
        return "else"
    return "oxiri"


print(f"    f() = {f()!r}")


print("\n\n=== 2. Qidiruv naqshi ===")

ROYXAT = [3, 7, 12, 5, 9]

for qidiruv in [12, 100]:
    print(f"\n  Qidiruv: {qidiruv}")

    # ❌ Bayroq bilan
    topildi = False
    for i, x in enumerate(ROYXAT):
        if x == qidiruv:
            topildi = True
            break

    if topildi:
        print(f"    Bayroq bilan: topildi (indeks {i})")
    else:
        print(f"    Bayroq bilan: topilmadi")

    # ✅ else bilan
    for i, x in enumerate(ROYXAT):
        if x == qidiruv:
            print(f"    else bilan:   topildi (indeks {i})")
            break
    else:
        print(f"    else bilan:   topilmadi")

    # ✅✅ next bilan — eng qisqa
    indeks = next((i for i, x in enumerate(ROYXAT) if x == qidiruv), -1)
    natija = f"topildi (indeks {indeks})" if indeks >= 0 else "topilmadi"
    print(f"    next bilan:   {natija}")


print("\n\n=== 3. Klassik misol: tub sonlar ===")

print("  2 dan 30 gacha tub sonlar:")
tublar = []
for n in range(2, 31):
    for d in range(2, int(n ** 0.5) + 1):
        if n % d == 0:
            break
    else:
        tublar.append(n)

print(f"    {tublar}")

print("\n  Bu — Pythonning rasmiy hujjatidagi klassik misol")


print("\n\n=== 4. Qayta urinish ===")

import time

urinishlar = [0]


def beqaror():
    urinishlar[0] += 1
    if urinishlar[0] < 3:
        raise TimeoutError(f"Urinish #{urinishlar[0]}")
    return f"✅ Natija (urinish #{urinishlar[0]})"


MAX_URINISH = 5

for urinish in range(1, MAX_URINISH + 1):
    try:
        natija = beqaror()
        print(f"  {natija}")
        break
    except TimeoutError as x:
        print(f"  {x} — qayta urinish...")
        time.sleep(0.05)
else:
    print(f"  ❌ {MAX_URINISH} urinishdan keyin ham muvaffaqiyatsiz")


print("\n\n=== 5. Alternativalar bilan solishtirish ===")

ROYXAT = [3, 7, 12, 5, 9]


def shart(x):
    return x > 10


print(f"  Ro'yxat: {ROYXAT}, shart: x > 10\n")

# 1. Birinchi mos element
print("  Birinchi mos element:")
for x in ROYXAT:
    if shart(x):
        natija = x
        break
else:
    natija = None
print(f"    for/else:  {natija}")
print(f"    next():    {next((x for x in ROYXAT if shart(x)), None)}")

# 2. Barcha mos keladimi
print("\n  Barcha mos keladimi:")
for x in ROYXAT:
    if not shart(x):
        hammasi = False
        break
else:
    hammasi = True
print(f"    for/else:  {hammasi}")
print(f"    all():     {all(shart(x) for x in ROYXAT)}")

# 3. Kamida bittasi
print("\n  Kamida bittasi:")
for x in ROYXAT:
    if shart(x):
        bittasi = True
        break
else:
    bittasi = False
print(f"    for/else:  {bittasi}")
print(f"    any():     {any(shart(x) for x in ROYXAT)}")

print("\n  ⭐ Xulosa: any/all/next ko'pincha ANIQROQ")


print("\n\n=== 6. ⚠️ Nom chalkashligi ===")

print("""
  `else` bu yerda "aks holda" EMAS.
  U "nobreak" — "break bo'lmasa" degani.

  Guido van Rossum: "bu nom xato edi".

  Ko'p dasturchi uni bilmaydi — IZOH yozing:

    for x in royxat:
        if shart(x):
            break
    else:
        # Sikl break siz tugadi — element topilmadi
        ...
""")

Natijaning muhim qismi:

text
=== 1. Uch holat ===
  break BILAN:
    break at 2

  break SIZ:
    else — bajarildi ✅

  Bo'sh to'plam:
    else — bajarildi ✅

  return bilan (funksiya ichida):
    f() = 'return'

=== 3. Klassik misol: tub sonlar ===
  2 dan 30 gacha tub sonlar:
    [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

=== 4. Qayta urinish ===
  Urinish #1 — qayta urinish...
  Urinish #2 — qayta urinish...
  ✅ Natija (urinish #3)

Nima ko'rsatdi: 2.3, 2.5-bo'limlar.

Misol 3 — Alternativalar

python
"""break/continue o'rniga nima ishlatish mumkin."""

import time
from itertools import takewhile, dropwhile, filterfalse

print("=== 1. break o'rniga ===")

ROYXAT = list(range(1, 21))
print(f"  Ro'yxat: {ROYXAT}\n")

# 1. break
natija = []
for x in ROYXAT:
    if x > 10:
        break
    natija.append(x)
print(f"  break bilan:            {natija}")

# 2. takewhile
print(f"  takewhile:              {list(takewhile(lambda x: x <= 10, ROYXAT))}")

# 3. Kesim (bilamiz bo'lsa)
print(f"  Kesim:                  {ROYXAT[:10]}")

# 4. Generator + islice
from itertools import islice
print(f"  islice:                 {list(islice(ROYXAT, 10))}")


print("\n\n=== 2. continue o'rniga ===")

# 1. continue
natija = []
for x in ROYXAT:
    if x % 3 != 0:
        continue
    natija.append(x)
print(f"  continue bilan:         {natija}")

# 2. Generator ifodasi
print(f"  Generator:              {[x for x in ROYXAT if x % 3 == 0]}")

# 3. filter
print(f"  filter:                 {list(filter(lambda x: x % 3 == 0, ROYXAT))}")

# 4. filterfalse (teskarisi)
print(f"  filterfalse:            {list(filterfalse(lambda x: x % 3, ROYXAT))}")


print("\n\n=== 3. Birinchi mos elementni topish ===")


def shart(x):
    return x > 15


usullar = {}

# break bilan
for x in ROYXAT:
    if shart(x):
        usullar["break + else"] = x
        break
else:
    usullar["break + else"] = None

# next bilan
usullar["next()"] = next((x for x in ROYXAT if shart(x)), None)

# filter + next
usullar["filter + next"] = next(filter(shart, ROYXAT), None)

# dropwhile
usullar["dropwhile"] = next(dropwhile(lambda x: not shart(x), ROYXAT), None)

for nom, natija in usullar.items():
    print(f"  {nom:<20} → {natija}")

print("\n  ⭐ next((x for x in y if c), None) — eng idiomatik")


print("\n\n=== 4. Funksiyada return ===")


def topish_break(royxat, shart):
    """break + else bilan."""
    for x in royxat:
        if shart(x):
            return x
    return None


def topish_next(royxat, shart):
    """next bilan."""
    return next((x for x in royxat if shart(x)), None)


print(f"  topish_break: {topish_break(ROYXAT, shart)}")
print(f"  topish_next:  {topish_next(ROYXAT, shart)}")
print("\n  Funksiyada `return` — `break` va `else` ni almashtiradi")


print("\n\n=== 5. Tezlik ===")

N = 2_000_000
katta = list(range(N))
qidiruv = N - 1

usullar = []

# break
boshlandi = time.perf_counter()
for x in katta:
    if x == qidiruv:
        n1 = x
        break
usullar.append(("for + break", time.perf_counter() - boshlandi))

# next + generator
boshlandi = time.perf_counter()
n2 = next((x for x in katta if x == qidiruv), None)
usullar.append(("next + generator", time.perf_counter() - boshlandi))

# in
boshlandi = time.perf_counter()
n3 = qidiruv if qidiruv in katta else None
usullar.append(("in operatori", time.perf_counter() - boshlandi))

# index
boshlandi = time.perf_counter()
n4 = katta[katta.index(qidiruv)]
usullar.append((".index()", time.perf_counter() - boshlandi))

assert n1 == n2 == n3 == n4

eng_tez = min(v for _, v in usullar)
print(f"  {len(katta):,} elementli ro'yxatda oxirgi elementni topish:\n")
print(f"  {'Usul':<20} {'Vaqt':>9} {'Nisbat':>8}")
print("  " + "─" * 40)
for nom, vaqt in sorted(usullar, key=lambda x: x[1]):
    print(f"  {nom:<20} {vaqt * 1000:>6.1f} ms {vaqt / eng_tez:>7.1f}x")

print("\n  ⭐ in va .index() — C darajasida, shuning uchun tezroq")


print("\n\n=== 6. Filtrlash tezligi ===")

boshlandi = time.perf_counter()
jami1 = 0
for x in katta:
    if x % 2:
        continue
    jami1 += x
vaqt_continue = time.perf_counter() - boshlandi

boshlandi = time.perf_counter()
jami2 = sum(x for x in katta if x % 2 == 0)
vaqt_gen = time.perf_counter() - boshlandi

boshlandi = time.perf_counter()
jami3 = sum(filter(lambda x: x % 2 == 0, katta))
vaqt_filter = time.perf_counter() - boshlandi

assert jami1 == jami2 == jami3

print(f"  {'Usul':<24} {'Vaqt':>9}")
print("  " + "─" * 36)
print(f"  {'for + continue':<24} {vaqt_continue * 1000:>6.1f} ms")
print(f"  {'sum(generator)':<24} {vaqt_gen * 1000:>6.1f} ms")
print(f"  {'sum(filter + lambda)':<24} {vaqt_filter * 1000:>6.1f} ms")


print("\n\n=== 7. Qaror jadvali ===")

print(f"""
  {'Vaziyat':<36} {'Yechim'}
  {'─' * 66}
  {'Birinchi mos elementni topish':<36} next((x for x in y if c), None)
  {'Barcha mos keladimi':<36} all(c(x) for x in y)
  {'Kamida bittasi':<36} any(c(x) for x in y)
  {'Filtrlash':<36} [x for x in y if c(x)]
  {'Shartgacha olish':<36} takewhile(c, y)
  {'Shartdan keyin':<36} dropwhile(c, y)
  {'Element bormi':<36} x in y
  {'Indeks topish':<36} y.index(x)
  {'Murakkab tekshiruvlar zanjiri':<36} continue
  {'Qayta urinish':<36} for + break + else
  {'Ichma-ich sikldan chiqish':<36} funksiya + return
""")

Natijaning muhim qismi:

text
=== 5. Tezlik ===
  2,000,000 elementli ro'yxatda oxirgi elementni topish:

  Usul                      Vaqt   Nisbat
  ────────────────────────────────────────
  in operatori              14.2 ms     1.0x
  .index()                  15.8 ms     1.1x
  for + break               58.4 ms     4.1x
  next + generator          72.3 ms     5.1x

  ⭐ in va .index() — C darajasida, shuning uchun tezroq

=== 6. Filtrlash tezligi ===
  Usul                          Vaqt
  ────────────────────────────────────
  for + continue                98.4 ms
  sum(generator)                87.2 ms
  sum(filter + lambda)         134.7 ms

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

Misol 4 — Amaliy: log tahlilchisi

python
"""break, continue va else — real vazifada."""

from dataclasses import dataclass
from datetime import datetime

LOG = """\
2026-09-08 10:00:12 INFO  [api] Server ishga tushdi
2026-09-08 10:00:45 INFO  [db] Ulanish o'rnatildi

# Bu izoh qatori
2026-09-08 10:01:03 WARN  [api] Sekin so'rov: /users (1250ms)
NOTO'G'RI QATOR FORMATI
2026-09-08 10:01:15 ERROR [db] Ulanish uzildi: timeout
2026-09-08 10:01:16 INFO  [db] Qayta ulanmoqda
2026-09-08 10:01:18 INFO  [db] Ulanish tiklandi
2026-09-08 10:02:30 ERROR [api] 500 xatosi: /orders
2026-09-08 10:03:01 WARN  [cache] Kesh to'ldi
2026-09-08 10:05:22 FATAL [api] Kritik xato — to'xtatish
2026-09-08 10:05:23 INFO  [api] Bu qator o'qilmaydi
"""


@dataclass
class Yozuv:
    sana: str
    vaqt: str
    daraja: str
    modul: str
    xabar: str


DARAJALAR = {"DEBUG", "INFO", "WARN", "ERROR", "FATAL"}


def qatorni_tahlil(qator: str) -> Yozuv | None:
    """Log qatorini tahlil qiladi. Noto'g'ri format bo'lsa None."""
    qismlar = qator.split(maxsplit=4)
    if len(qismlar) < 5:
        return None

    sana, vaqt, daraja, modul, xabar = qismlar
    if daraja not in DARAJALAR:
        return None
    if not (modul.startswith("[") and modul.endswith("]")):
        return None

    return Yozuv(sana, vaqt, daraja, modul[1:-1], xabar)


print("=== 1. continue — filtrlash ===")

yozuvlar = []
otkazildi = {"bo'sh": 0, "izoh": 0, "noto'g'ri": 0}

for raqam, qator in enumerate(LOG.splitlines(), 1):
    # Qo'riqchi shartlar — continue bilan
    if not qator.strip():
        otkazildi["bo'sh"] += 1
        continue

    if qator.strip().startswith("#"):
        otkazildi["izoh"] += 1
        continue

    yozuv = qatorni_tahlil(qator)
    if yozuv is None:
        otkazildi["noto'g'ri"] += 1
        print(f"  ⚠️ {raqam}-qator: noto'g'ri format — {qator[:40]!r}")
        continue

    yozuvlar.append(yozuv)

print(f"\n  O'qildi:     {len(yozuvlar)} yozuv")
for sabab, soni in otkazildi.items():
    if soni:
        print(f"  O'tkazildi:  {soni} ta ({sabab})")


print("\n\n=== 2. break — FATAL da to'xtash ===")

ishlangan = 0
for yozuv in yozuvlar:
    if yozuv.daraja == "FATAL":
        print(f"  🔴 {yozuv.vaqt} FATAL — to'xtatildi")
        break
    ishlangan += 1
else:
    print("  ✅ FATAL topilmadi — barcha yozuv ishlandi")

print(f"  Ishlangan: {ishlangan}/{len(yozuvlar)}")


print("\n\n=== 3. else — birinchi xatoni topish ===")

for yozuv in yozuvlar:
    if yozuv.daraja in {"ERROR", "FATAL"}:
        print(f"  Birinchi xato: {yozuv.vaqt} [{yozuv.modul}] {yozuv.xabar}")
        break
else:
    print("  ✅ Hech qanday xato yo'q")


print("\n\n=== 4. next() bilan — alternativa ===")

birinchi_xato = next(
    (y for y in yozuvlar if y.daraja in {"ERROR", "FATAL"}),
    None
)
if birinchi_xato:
    print(f"  next() bilan: {birinchi_xato.vaqt} {birinchi_xato.xabar}")
else:
    print("  ✅ Xato yo'q")


print("\n\n=== 5. Ketma-ket xatolarni topish ===")

MAX_KETMA_KET = 2
ketma_ket = 0
muammoli_modullar = set()

for yozuv in yozuvlar:
    if yozuv.daraja in {"ERROR", "FATAL"}:
        ketma_ket += 1
        muammoli_modullar.add(yozuv.modul)
        if ketma_ket >= MAX_KETMA_KET:
            print(f"  🔴 {MAX_KETMA_KET} ta ketma-ket xato!")
            print(f"     Modullar: {sorted(muammoli_modullar)}")
            break
    else:
        ketma_ket = 0
        muammoli_modullar.clear()
else:
    print(f"  ✅ {MAX_KETMA_KET} ta ketma-ket xato topilmadi")


print("\n\n=== 6. Statistika ===")

from collections import Counter

darajalar = Counter(y.daraja for y in yozuvlar)
modullar = Counter(y.modul for y in yozuvlar)

print("  Darajalar:")
BELGILAR = {"INFO": "ℹ️ ", "WARN": "⚠️ ", "ERROR": "❌", "FATAL": "🔴"}
for daraja in ["INFO", "WARN", "ERROR", "FATAL"]:
    soni = darajalar.get(daraja, 0)
    if soni:
        chiziq = "█" * soni
        print(f"    {BELGILAR[daraja]} {daraja:<6} {soni:>2}  {chiziq}")

print("\n  Modullar:")
for modul, soni in modullar.most_common():
    print(f"    [{modul}]{'':<{8 - len(modul)}} {soni}")


print("\n\n=== 7. Vaqt oralig'ida qidirish ===")

BOSHLANISH = "10:01:00"
TUGASH = "10:02:00"

print(f"  Oraliq: {BOSHLANISH} — {TUGASH}\n")

topilgan = 0
for yozuv in yozuvlar:
    if yozuv.vaqt < BOSHLANISH:
        continue                        # hali erta
    if yozuv.vaqt > TUGASH:
        break                           # oraliqdan chiqdik (log tartiblangan)

    topilgan += 1
    print(f"    {yozuv.vaqt} {yozuv.daraja:<6} [{yozuv.modul}] {yozuv.xabar}")

if not topilgan:
    print("    (oraliqda yozuv yo'q)")

print(f"\n  ⭐ continue — 'hali erta', break — 'kech bo'ldi'")
print("     Log tartiblangan bo'lgani uchun break xavfsiz")

Natijaning muhim qismi:

text
=== 1. continue — filtrlash ===
  ⚠️ 6-qator: noto'g'ri format — "NOTO'G'RI QATOR FORMATI"

  O'qildi:     10 yozuv
  O'tkazildi:  1 ta (bo'sh)
  O'tkazildi:  1 ta (izoh)
  O'tkazildi:  1 ta (noto'g'ri)

=== 2. break — FATAL da to'xtash ===
  🔴 10:05:22 FATAL — to'xtatildi
  Ishlangan: 8/10

=== 5. Ketma-ket xatolarni topish ===
  ✅ 2 ta ketma-ket xato topilmadi

=== 7. Vaqt oralig'ida qidirish ===
  Oraliq: 10:01:00 — 10:02:00

    10:01:03 WARN   [api] Sekin so'rov: /users (1250ms)
    10:01:15 ERROR  [db] Ulanish uzildi: timeout
    10:01:16 INFO   [db] Qayta ulanmoqda
    10:01:18 INFO   [db] Ulanish tiklandi

  ⭐ continue — 'hali erta', break — 'kech bo'ldi'
     Log tartiblangan bo'lgani uchun break xavfsiz

Nima ko'rsatdi: 2.2, 2.3, 2.4-bo'limlar amaliyotda.


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

Noto'g'ri fikr To'g'risi
"break barcha sikldan chiqadi" Faqat eng yaqin sikldan
"Pythonda break label bor" Yo'q. Funksiya + return ishlating
"continue while da xavfsiz" O'zgarishni o'tkazsa — cheksiz sikl
"else — 'aks holda'" "nobreak" — break bo'lmasa
"return bo'lsa else bajariladi" Yo'q — return funksiyadan chiqadi
"for/else ko'p kerak" Kam. any, all, next aniqroq
"break resurs tozalaydi" Yo'q — with yoki finally kerak
"break next() dan tez" Odatda in/.index() eng tez

6. Keng tarqalgan xatolar va yechimlari

1. while + continue — cheksiz sikl

python
while i < n:
    if shart:
        continue                # ❌ i o'zgarmadi
    i += 1

while i < n:
    i += 1                      # ✅ oldin
    if shart:
        continue

2. Ichma-ich break

python
for i in ...:
    for j in ...:
        if shart:
            break               # ⚠️ faqat ichki

# ✅ Funksiya + return
def topish():
    for i in ...:
        for j in ...:
            if shart:
                return i, j
    return None

3. break va resurs

python
for x in y:
    f = open(...)
    if shart:
        break                   # ❌ fayl yopilmadi

for x in y:
    with open(...) as f:        # ✅
        if shart:
            break

4. else ni noto'g'ri tushunish

python
for x in y:
    ...
else:
    # ⚠️ Bu "sikl tugagach" emas
    # Bu "break bo'lmagach"

5. return bilan else

python
def f():
    for x in y:
        if c: return x
    else:                       # ⚠️ ortiqcha
        return None

def f():
    for x in y:
        if c: return x
    return None                 # ✅

6. break o'rniga generator kerak bo'lganda

python
for x in y:                     # ⚠️ uzun
    if c(x):
        natija = x
        break
else:
    natija = None

natija = next((x for x in y if c(x)), None)     # ✅

7. Sikl tanasi bo'sh, faqat continue

python
for x in y:
    if not c(x):
        continue                # ⚠️ ortiqcha
    ishla(x)

for x in filter(c, y):          # ✅
    ishla(x)

8. break generatorda tozalashsiz

python
def gen():
    f = open(...)
    for qator in f:
        yield qator
    f.close()                   # ❌ break bo'lsa bajarilmaydi

def gen():
    with open(...) as f:        # ✅
        for qator in f:
            yield qator

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 5.5, 5.6-darslar (o'tilgan): while va for
  • 5.11-dars: ichma-ich sikllardan chiqish
  • 5.2-dars (o'tilgan): qo'riqchi shart — continue bilan
  • 9-qism: try/finally bilan resurs tozalash
  • 7, 10, 15-qismlar: generatorlar, takewhile, dropwhile, filter
  • 10, 16-qismlar: fayl o'qish, with
  • 31-qism: qidiruv algoritmlari

8. Eng yaxshi amaliyotlar

  1. while da o'zgarishni continue dan oldin qo'ying. Bu — cheksiz siklning eng ko'p sababi.

  2. break o'rniga next() yoki funksiya + return. Qisqaroq va aniqroq.

  3. continue ni qo'riqchi shart sifatida ishlating. Chekinishni tekis saqlaydi.

  4. for/else ga izoh yozing. Ko'p dasturchi uni bilmaydi.

  5. any/all/next ni afzal ko'ring. for/else dan aniqroq.

  6. break bilan resursni with ichida saqlang. Aks holda oqadi.

  7. Ichma-ich sikldan chiqish uchun funksiya ishlating. break faqat bir daraja.

  8. Katta ro'yxatda in/.index() ishlating. Ular C darajasida — tezroq.


9. Amaliy topshiriq

Vazifa 1: Natijani bashorat qiling

python
# a
for x in [1,2,3]:
    if x == 2: break
else:
    print("else")
print("oxiri")

# b
for x in []:
    print(x)
else:
    print("else")

# c
for i in range(2):
    for j in range(2):
        if j == 0: break
        print(i, j)

# d
i = 0
n = 0
while i < 3 and n < 10:
    n += 1
    if i == 1: continue
    i += 1
print(i, n)
Javoblar

a. oxiri — else bajarilmadi (break bor) b. else — bo'sh to'plamda ham bajariladi c. Hech narsa — j == 0 da darhol break d. 1 10 — i == 1 da cheksiz sikl (cheklov bilan to'xtadi)

Vazifa 2: Xatolarni tuzatish

python
1.  i = 0
    while i < 10:
        if i % 2: continue
        print(i)
        i += 1

2.  for x in royxat:
        f = open(x)
        if shart: break
        f.close()

3.  for i in range(3):
        for j in range(3):
            if jadval[i][j] == q:
                break
        # tashqi sikldan ham chiqish kerak

4.  def f(royxat):
        for x in royxat:
            if c(x): return x
        else:
            return None
Javoblar
python
1.  i = 0
    while i < 10:
        i += 1                  # oldin
        if i % 2: continue
        print(i)

2.  for x in royxat:
        with open(x) as f:
            if shart: break

3.  def topish(jadval, q):
        for i in range(3):
            for j in range(3):
                if jadval[i][j] == q:
                    return i, j
        return None

4.  def f(royxat):
        for x in royxat:
            if c(x): return x
        return None

Vazifa 3: for/else ni almashtiring

python
1.  for x in royxat:
        if x > 10: break
    else:
        print("Topilmadi")

2.  for x in royxat:
        if not shart(x):
            hammasi = False
            break
    else:
        hammasi = True

3.  for i, x in enumerate(royxat):
        if x == q: break
    else:
        i = -1
Javoblar
python
1.  if not any(x > 10 for x in royxat): print("Topilmadi")
2.  hammasi = all(shart(x) for x in royxat)
3.  i = next((i for i, x in enumerate(royxat) if x == q), -1)

Vazifa 4: Log tahlilchisi

4-misoldagi dasturni kengaytiring:

  1. Vaqt oralig'ini parametr qiling
  2. Daraja bo'yicha filtrlash
  3. Ketma-ket xatolar chegarasini sozlanadigan qiling
  4. FATAL dan keyin nechta qator o'tkazib yuborilganini hisoblang

Vazifa 5: Qidiruv kutubxonasi

Funksiyalar yozing (har birini ikki usulda — break/else va next/any):

  1. birinchi(royxat, shart) — birinchi mos element
  2. birinchi_indeks(royxat, shart)
  3. oxirgi(royxat, shart)
  4. barchasi_mos(royxat, shart)
  5. nechta(royxat, shart)

Vazifa 6: Menyu tizimi

while True + break bilan menyu yozing:

  1. Ichma-ich menyular (continue bilan orqaga qaytish)
  2. Noto'g'ri tanlovda continue
  3. chiqish da barcha darajadan break
  4. Tasdiqlash so'rovi

Vazifa 7: O'ylash

Nega Pythonda break label (yorliqli break) yo'q?

Javob

Guido van Rossum uni bir necha marta rad etgan (PEP 3136, 2007).

Sabablari:

1. Kam kerak.

Statistika: yorliqli break kerak bo'lgan holatlar juda kam — asosan ikki-uch qavatli ichma-ich sikllarda.

2. Alternativa bor va u yaxshiroq.

python
# Yorliq o'rniga — funksiya
def topish(jadval, q):
    for i, qator in enumerate(jadval):
        for j, x in enumerate(qator):
            if x == q:
                return i, j
    return None

Bu — aniqroq: funksiya nomi maqsadni bildiradi va natija qaytariladi.

3. Sintaksis murakkablashadi.

Yorliq yangi kalit so'z yoki maxsus sintaksis talab qiladi. Python soddalikni afzal ko'radi (1.5-dars).

4. Chuqur ichma-ich — dizayn muammosi belgisi.

Uch qavatli ichma-ich sikl odatda kodni bo'lish kerakligini ko'rsatadi. Yorliqli break bu muammoni yashiradi, hal qilmaydi.

Boshqa tillar:

Til Yorliqli break
Java, JavaScript bor
C, C++ (goto bor)
Go bor
Rust bor ('label: loop)
Python yo'q

Pythondagi yechimlar (11-darsda batafsil):

python
# 1. Funksiya + return          ← eng yaxshi
# 2. Bayroq o'zgaruvchisi
# 3. itertools.product
# 4. Istisno (kam holatda)

Nimani mustahkamlaydi: 2.1, 2.2, 2.3, 2.5, 2.8-bo'limlar.


Xulosa

Bu darsda sikl oqimini boshqarishni o'rgandik.

Eng muhim uch fikr:

  1. while da continue — cheksiz sikl xavfi. O'zgarishni continue dan oldin qo'ying. for da bunday muammo yo'q.

  2. else — "nobreak" degani. U sikl break siz tugaganda bajariladi. Nomi chalkash, shuning uchun izoh yozing — yoki any/all/next ni ishlating, ular ko'pincha aniqroq.

  3. break faqat eng yaqin sikldan chiqadi. Pythonda yorliqli break yo'q — ichma-ich sikldan chiqish uchun funksiya va return ishlating.

Keyingi darsda ichma-ich sikllar va murakkablikni o'rganamiz: qanday qilib ularni tekislash, algoritmik murakkablik va itertools bilan almashtirish.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
5.10-dars: break, continue, sikl else — IlmHamroh