Misingi

Mizunguko na masharti katika Python: for, while, range, enumerate, break, if/elif na match/case

Imesasishwa: · Skillaria.Top

Mizunguko katika Python hurudia kitendo: for hupitia kila kipengele cha mkusanyiko au range(), while hufanya kazi mradi sharti ni kweli. Mzunguko unasitishwa kwa break, kipengele kinaruka kwa continue, na namba ya kipengele hupatikana kwa enumerate(). Maamuzi hufanywa na masharti if/elif/else, na kuchambua data kwa umbo lake kwa match/case (tangu Python 3.10).

Mizunguko katika Python hutumika kurudia kitendo: kupitia orodha ya manunuzi, kushughulikia kila mstari wa faili, au kumuuliza mtumiaji hadi aweke namba sahihi. Lugha ina mizunguko miwili — for na while — na ndani yake maamuzi hufanywa kwa masharti if/elif/else na kwa kauli match/case. Hebu tuchambue kila zana kwa mifano ya vitendo.

Masharti: if, elif, else

Kauli ya masharti hutekeleza kizuizi cha msimbo tu ikiwa usemi ni kweli. Kizuizi kinatambuliwa kwa ujongezaji wa nafasi 4 — Python haina mabano ya mikunjo, na ujongezaji usio sahihi unatoa IndentationError mara moja.

spent = 4200
limit = 5000

if spent > limit:
    print("Kikomo kimezidi")
elif spent > limit * 0.8:
    print("Imebaki chini ya 20% ya bajeti")
else:
    print("Kila kitu kiko sawa")

Matawi ya elif hukaguliwa kutoka juu kwenda chini, na ni tawi la kwanza linalofaa tu ndilo linalotekelezwa. Kwa hiyo weka masharti makali zaidi juu: kama ukaguzi wa spent > limit * 0.8 ungekuwa wa kwanza, ujumbe wa kuzidi kikomo usingeonekana kamwe.

Kipi kinachukuliwa kuwa kweli

Katika sharti si lazima kuandika ulinganisho. Thamani zisizo kweli ni False, None, sifuri (0, 0.0) na mkusanyiko mtupu: "", [], {}. Kila kitu kingine ni kweli. Kwa hiyo ukaguzi wa "orodha si tupu" huandikwa kwa ufupi:

expenses = []
if not expenses:
    print("Bado hakuna matumizi")

Masharti huunganishwa kwa and, or, not, na safu ya namba hukaguliwa kwa mnyororo wa ulinganisho: if 0 < amount <= 100_000:. Kwa uchaguzi mfupi wa thamani kuna opereta ya masharti: status = "juu" if spent > limit else "kawaida".

Mzunguko wa for katika Python: sintaksia na mifano

Mzunguko for katika Python si kaunta kama katika C, bali ni kupitia vipengele. Huchukua kila kipengele cha kitu kinachoweza kupitiwa: orodha, mfuatano, kamusi, faili au range. Kile ambacho lugha nyingine huita foreach ndicho for ya kawaida hapa.

expenses = [350, 1200, 89, 4500]
total = 0
for amount in expenses:
    total += amount
print(total)  # 6139

Sintaksia ya for: for kigezo in mkusanyiko:, kisha kizuizi kilichojongezwa. Kigezo kinabaki na thamani ya mwisho baada ya mzunguko — wakati mwingine ni muhimu, lakini kukitegemea kwenye programu kubwa si wazo zuri.

Mzunguko kwenye mfuatano, orodha na kamusi

Mfuatano hupitiwa herufi kwa herufi, orodha kwa vipengele. Mzunguko kwenye kamusi kwa kawaida hupita kwenye funguo; ili kupata ufunguo na thamani pamoja tumia .items():

by_category = {"chakula": 3200, "usafiri": 900, "sinema": 600}

for category, amount in by_category.items():
    print(f"{category}: {amount} TSh")

Kwa thamani pekee kuna .values(). Huwezi kubadilisha ukubwa wa kamusi wakati wa kuipitia — utapata RuntimeError: dictionary changed size during iteration. Ukihitaji kufuta vipengele, pitia nakala: for key in list(d):.

Kazi ya range: mzunguko juu ya namba

Pale unapohitaji kupitia namba, range() ndiyo msaada. Haitengenezi orodha kwenye kumbukumbu, bali hutoa namba moja moja, kwa hiyo range(10**9) hufanya kazi papo hapo.

MwitoNamba
range(5)0, 1, 2, 3, 4
range(2, 6)2, 3, 4, 5
range(0, 10, 3)0, 3, 6, 9
range(5, 0, -1)5, 4, 3, 2, 1

Kanuni kuu: mpaka wa kulia hauingii kwenye safu. range(1, 10) itaishia kwenye 9 — hili ni chanzo cha kawaida cha kosa la "moja zaidi au moja pungufu". Hatua inaweza kuwa hasi, lakini haiwezi kuwa sifuri.

for i in range(1, 4):
    print(f"Siku {i}")
# Siku 1
# Siku 2
# Siku 3

enumerate: kaunta katika mzunguko

Wanaoanza mara nyingi huandika for i in range(len(items)) ili kujua namba ya kipengele. Hufanya kazi, lakini husomeka vibaya. Kazi enumerate() hutoa jozi "namba, kipengele", na kigezo start kinaonyesha tangu namba gani kuhesabu:

items = ["kahawa", "teksi", "chakula"]
for n, item in enumerate(items, start=1):
    print(n, item)
# 1 kahawa
# 2 teksi
# 3 chakula

Kwa kupitia orodha mbili kwa wakati mmoja kuna zip(): for name, price in zip(names, prices):. Huacha kwenye orodha fupi kabisa; tangu Python 3.10 unaweza kutoa strict=True, na hapo urefu tofauti utasababisha kosa.

Mzunguko wa while katika Python

Mzunguko while hurudia kizuizi mradi sharti ni kweli. Huchaguliwa pale idadi ya marudio isipojulikana mapema: tunangojea uingizaji sahihi, tunasoma data hadi mwisho, au tunarudia ombi hadi lifanikiwe.

balance = 10_000
month = 0
while balance > 0:
    balance -= 2_700
    month += 1
print(f"Pesa itatosha kwa miezi {month}")  # 4

Hatari kubwa ni kusahau kubadilisha kigezo kilicho kwenye sharti. Kisha mzunguko hautaisha kamwe. Programu ikiwa "imeganda", bonyeza Ctrl+C: Python itasimamisha utekelezaji kwa KeyboardInterrupt.

Mzunguko usio na mwisho na do while

Wakati mwingine mzunguko usio na mwisho huandikwa kwa makusudi: while True: yenye kutoka kwa break. Hivyo hivyo hufanywa mzunguko wenye sharti mwishoni — Python haina kauli ya do while, na mbinu hii inaichukua nafasi: kizuizi hutekelezwa angalau mara moja, na ukaguzi uko mwishoni.

while True:
    raw = input("Kiasi: ")
    if raw.isdigit():
        amount = int(raw)
        break
    print("Tafadhali weka namba nzima")

Mzunguko wa for usio na mwisho ni nadra — hutokea tu ukipitia jenereta isiyo na mwisho, kwa mfano itertools.count().

break na continue: kutoka kwenye mzunguko na kuruka mzunguko

break huvunja mzunguko mara moja, na utekelezaji unaendelea kwenye msimbo unaofuata. continue huruka mabaki ya mzunguko wa sasa na kwenda kwenye unaofuata.

expenses = [350, -10, 1200, 0, 99_999, 89]

for amount in expenses:
    if amount <= 0:
        continue          # ruka mzunguko huu
    if amount > 50_000:
        print("Kiasi cha kutiliwa shaka, simama")
        break             # toka kwenye mzunguko
    print(amount)

Itachapisha 350 na 1200, kisha ujumbe — mzunguko haufiki 89. Kauli zote mbili zinaathiri mzunguko wa karibu zaidi ulio nao.

else ya mzunguko

for na while zina tawi la else lisilo la kawaida: hutekelezwa iwapo mzunguko umemalizika wenyewe, bila break. Ni rahisi kwa kutafuta:

for amount in expenses:
    if amount > 50_000:
        print("Tumepata matumizi makubwa")
        break
else:
    print("Hakuna matumizi makubwa")

Mizunguko iliyoingiana

Mzunguko ndani ya mzunguko: kwa kila hatua ya mzunguko wa nje, mzunguko wa ndani hukamilika wote. Hivyo hupitiwa jedwali, matrix, au jozi za vitu.

for row in range(1, 4):
    for col in range(1, 4):
        print(row * col, end="\t")
    print()

Zingatia mambo mawili. Kwanza, ugumu wa kazi hukua haraka: mizunguko miwili iliyoingiana ya vipengele 10 000 kila moja ni shughuli milioni 100. Pili, break hutoka kwenye mzunguko wa ndani tu. Ili kusimamisha yote mawili, weka mizunguko kwenye kazi na tumia return — ni safi zaidi kuliko bendera.

Kauli ya match/case

Mnyororo mrefu wa if cmd == ... elif ... tangu Python 3.10 unaweza kubadilishwa na kauli ya match (PEP 634). Si switch tu: inalinganisha thamani na mfano kwa umbo la data, na mara moja inagawanya sehemu zake kwenye vigezo.

def parse(text):
    match text.split():
        case ["add", item, amount]:
            return f"Ongeza {item}: {amount}"
        case ["list"] | ["ls"]:
            return "Onyesha matumizi"
        case ["quit"]:
            return "Toka"
        case _:
            return "Amri isiyojulikana"

print(parse("add Kahawa 250"))  # Ongeza Kahawa: 250
print(parse("add Kahawa"))      # Amri isiyojulikana

Mfano wa orodha ["add", item, amount] utalingana tu na orodha yenye vipengele vitatu hasa, cha kwanza kikiwa "add". Kwa hiyo amri bila kiasi inaenda kwenye tawi la _, linalonasa kila kitu kingine. Alama | huunganisha chaguo.

Kamusi, aina na sharti la ulinzi

Mfano wa kamusi hukagua funguo zilizotajwa tu; funguo za ziada hupuuzwa. Andiko int(a) hukagua aina na kunasa thamani, na if baada ya mfano huongeza sharti la ziada (guard):

match event:
    case {"type": "expense", "amount": int(a)} if a > 10_000:
        print("Matumizi makubwa", a)
    case {"type": "expense", "amount": int(a)}:
        print("Matumizi", a)

Mtego mkuu wa match

Jina pekee katika case ni kunasa, si ulinganisho na kigezo. case limit: italingana na thamani yoyote na kuiandika kwenye limit. Ili kulinganisha na thamani zisizobadilika, tumia jina lenye nukta, kwa mfano case Color.RED:, au literal.

Sintaksia ya match tangu 3.10 haijabadilika sana. Katika Python 3.15 ilirekebishwa kasoro ndogo ya ulinganifu: awali katika mifano ya literal ruhusa ilikuwa ya alama ya minus tu mbele ya namba, sasa unaweza pia kuandika case +1:. Kwenye matoleo ya zamani msimbo kama huo utatoa kosa la sintaksia.

Makosa ya kawaida katika mizunguko

  • Kubadilisha orodha wakati wa kuipitia. Kufuta vipengele ndani ya for kunaruka vilivyo jirani. Ni bora kujenga orodha mpya: clean = [x for x in items if x > 0].
  • Mpaka wa range. range(1, n) haijumuishi n.
  • Kusahau kubadilisha sharti katika while — mzunguko usio na mwisho.
  • Kuunganisha mifuatano kwa += ndani ya mzunguko kwa data nyingi ni polepole kuliko "".join(parts).
  • Mgawo badala ya ulinganisho: if x = 5 ni kosa la sintaksia; ulinganisho huandikwa ==.

Kazi za mizunguko kwa mazoezi

  1. Hesabu jumla na wastani wa orodha ya matumizi, ukiruka thamani hasi.
  2. Chapisha jedwali la kuzidisha 1–9 kwa mizunguko iliyoingiana.
  3. Uliza mtumiaji namba hadi aandike mstari tupu, kisha chapisha kubwa zaidi.
  4. Tafuta namba ya kwanza kubwa kuliko 1000 kwenye orodha, na ujulishe kama haipo (kwa for ... else).
  5. Chambua amri add, del, list kwa match.

Hitimisho

Mizunguko ya Python inakuja kwa miundo miwili: for hupitia vipengele vya mkusanyiko au range(), while hufanya kazi mradi sharti ni kweli. break na continue huongoza mwenendo wa mzunguko, enumerate() na zip() huondoa kaunta za mkono, na if/elif/else pamoja na match/case hushughulikia maamuzi. Zana hizi zote zimefafanuliwa kwa vitendo kwa mfano wa kifuatiliaji cha matumizi katika somo la kozi ya Python.

Maswali ya mara kwa mara

For inatofautianaje na while katika Python?

For hupitia mfuatano uliopo na yenyewe hujua wakati wa kusimama, wakati while hurudia mradi sharti ni kweli. Ikiwa idadi ya marudio inajulikana au una mkusanyiko, tumia for; ikiwa unangoja tukio, tumia while.

Ninawezaje kupitia mzunguko kwa mpangilio wa nyuma?

Tumia reversed(items) kwa mkusanyiko au range(n - 1, -1, -1) kwa namba. Kazi ya reversed haitengenezi nakala ya orodha, bali inapita kutoka mwisho.

Je, Python ina switch?

Hakuna switch tofauti; nafasi yake inachukuliwa na mnyororo wa if/elif na kauli ya match/case iliyoletwa katika Python 3.10. match inaweza zaidi: inachambua orodha na kamusi kwa umbo na kunasa thamani.

Kipi ni cha haraka zaidi — mzunguko au generator ya orodha?

Generator ya orodha kama [x * 2 for x in items] kwa kawaida ni kidogo haraka kuliko mzunguko sawa na append, na ni mfupi. Kwa mantiki tata yenye sharti kadhaa, mzunguko wa kawaida husomeka vizuri zaidi.

Ninawezaje kutoka mara moja kwenye mizunguko miwili iliyoingiana?

break hutoka kwenye mzunguko wa ndani tu. Njia rahisi ni kuweka mizunguko kwenye kazi na kutoka kwa return.

Jifunze mada hii kwa video

Mada hii inafundishwa kwa kina pamoja na mazoezi katika kozi “Python 3.15: от новичка до профи”.

Nenda kwenye kozi