Yaliyomo

Wiki 2: Strings kwa Kina, Maamuzi (if/elif/else) na Loops

Mwezi 1 | Lengo kuu: Mwanafunzi aweze kuchakata maandishi, kufanya maamuzi kwa if, na kurudia kazi kwa while/for — na kujenga mchezo wa "Bahatisha Namba".

Maandalizi ya Mwalimu (soma kabla ya wiki kuanza)

  • Hakuna kitu kipya cha ku-install. Tengeneza folder python_darasa\wiki02.
  • Soma: https://docs.python.org/3/tutorial/introduction.html#text (strings) na https://docs.python.org/3/tutorial/controlflow.html (if, for, range, break, continue).
  • Fanya mazoezi mwenyewe: andika mchezo wa "Bahatisha Namba" (Kipindi 3) peke yako kabla ya Kipindi 3. Ukiweza kuuandika bila kuangalia, utaufundisha kwa ujasiri.
  • Jambo muhimu zaidi wiki hii: INDENTATION. Python inatumia nafasi 4 mwanzoni mwa mstari kuonyesha code iliyo "ndani" ya if, while, for. VS Code inaweka nafasi 4 ukibonyeza Tab. Hakikisha kona ya chini kulia ya VS Code inasema "Spaces: 4".
  • Jua jinsi ya kusimamisha programu iliyokwama (infinite loop): bonyeza Ctrl + C ndani ya terminal. Utaihitaji!

Malengo ya Wiki (mwisho wa wiki mwanafunzi ataweza...)

  1. Kutumia indexing (s[0], s[-1]) na slicing (s[1:4], s[::-1]) kwenye strings.
  2. Kutumia string methods: upper, lower, title, strip, replace, split, find, count, startswith, isdigit, na len(), in.
  3. Kutumia f-strings: f"Habari {jina}", f"{bei:,.2f}".
  4. Kuandika maamuzi kwa if / elif / else na nested conditions.
  5. Kurudia kazi kwa while na for, kutumia range(), break, continue.
  6. Kutumia random.randint() kujenga mchezo wa kubahatisha namba.

Kipindi 1 — Strings kwa Kina: indexing, slicing, methods, f-strings

Mtiririko wa kipindi

  1. Marudio ya kazi ya nyumbani (kibadilishaji.py)
  2. String ni mfuatano wa herufi: len(), indexing, negative index
  3. Slicing [start:stop:step]
  4. Mapumziko
  5. String methods
  6. f-strings na formatting ya namba
  7. Zoezi darasani
  8. Q&A + kazi ya nyumbani

Elezo kwa mwalimu (soma kwanza wewe)

  • String ni mfuatano (sequence) wa herufi. Kila herufi ina namba ya nafasi yake inayoitwa index, na index inaanza 0, si 1.

    text
     T   a   n   z   a   n   i   a
     0   1   2   3   4   5   6   7
    -8  -7  -6  -5  -4  -3  -2  -1
    
  • s[0] → herufi ya kwanza; s[-1] → herufi ya mwisho. len(s) → idadi ya herufi (8). Index kubwa kuliko len(s)-1 → IndexError.

  • Slicing s[start:stop] inachukua kuanzia start hadi kabla ya stop (stop haijumuishwi). s[0:3] → "Tan". Ukiacha start → kuanzia mwanzo; ukiacha stop → hadi mwisho. s[::2] → kila herufi ya pili. s[::-1] → string iliyogeuzwa.
  • Slicing haileti IndexError hata ukizidi: s[0:100] → string yote.
  • Strings hazibadiliki (immutable): s[0] = "t" → TypeError. Methods hazibadilishi string ya asili; zinarudisha string mpya. Ndiyo maana tunaandika jina = jina.upper().
  • Methods muhimu: .upper(), .lower(), .title(), .capitalize(), .strip() (ondoa nafasi pembeni), .replace(a, b), .split() (gawanya kuwa list — tutaiona zaidi Wiki 3), .find(x) (index au -1), .count(x), .startswith(x), .endswith(x), .isdigit(), .isalpha(). "x" in s → True/False.
  • f-string: weka f kabla ya nukuu, kisha weka variables ndani ya {}: f"Jina: {jina}, umri: {umri}". Unaweza kuweka hesabu: f"{a + b}". Formatting: {x:.2f} → desimali 2; {x:,} → koma za maelfu; {x:,.2f} → vyote; {jina:>10} → panga kulia upana 10; {jina:<10} kushoto; {jina:^10} katikati.

Sema hivi kwa mwanafunzi

  • "String ni kama treni yenye mabehewa. Kila behewa lina herufi moja, na mabehewa yamepewa namba kuanzia 0. Behewa la mwisho unaweza kuliita -1."
  • "Slicing ni kama kukata kipande cha mkate: [2:5] maana yake 'anza kukata kwenye alama 2, simama kabla ya alama 5'."
  • "String haiwezi kubadilishwa — ni kama maandishi yaliyochongwa kwenye jiwe. Ukitaka tofauti, unachonga jiwe jipya."
  • "f-string ni kama fomu yenye nafasi tupu {} — Python inajaza nafasi hizo kwa thamani za variables."

Andika code hii live (share screen)

Hatua 1 — strings.py: indexing na len

python
nchi = "Tanzania"
print(len(nchi))      # 8
print(nchi[0])        # T
print(nchi[1])        # a
print(nchi[-1])       # a
print(nchi[-2])       # i
print(nchi[len(nchi) - 1])   # a  (herufi ya mwisho kwa njia ndefu)

Hatua 2 — Slicing

python
nchi = "Tanzania"
print(nchi[0:3])      # Tan
print(nchi[3:])       # zania
print(nchi[:5])       # Tanza
print(nchi[-3:])      # nia
print(nchi[::2])      # Tnai
print(nchi[::-1])     # ainaznaT
print(nchi[0:100])    # Tanzania (hakuna error)

Hatua 3 — Methods

python
ujumbe = "   habari ya asubuhi, mwalimu   "
print(ujumbe.strip())               # habari ya asubuhi, mwalimu
print(ujumbe.strip().upper())       # HABARI YA ASUBUHI, MWALIMU
print(ujumbe.strip().title())       # Habari Ya Asubuhi, Mwalimu
print(ujumbe.replace("asubuhi", "jioni").strip())   # habari ya jioni, mwalimu
print(ujumbe.count("a"))            # 5
print(ujumbe.find("mwalimu"))       # 22
print(ujumbe.find("Dodoma"))        # -1 (haipo)
print("habari" in ujumbe)           # True
print(ujumbe)                       # haijabadilika! bado ina nafasi

Sisitiza mstari wa mwisho: methods hazibadilishi string ya asili.

python
simu = "0712345678"
print(simu.isdigit())          # True
print(simu.startswith("07"))   # True
print("Amina".isalpha())       # True
print("Amina 2".isalpha())     # False (nafasi na namba)

sentensi = "Python ni rahisi sana"
maneno = sentensi.split()
print(maneno)          # ['Python', 'ni', 'rahisi', 'sana']
print(len(maneno))     # 4

Hatua 4 — f-strings

python
jina = "Juma"
umri = 22
bei = 1234567.891

print(f"Jina langu ni {jina} na nina miaka {umri}.")
print(f"Mwaka ujao: {umri + 1}")
print(f"Jina kwa herufi kubwa: {jina.upper()}")
print(f"Bei: {bei:.2f}")
print(f"Bei: {bei:,.2f} TZS")
print(f"[{jina:<10}]")
print(f"[{jina:>10}]")
print(f"[{jina:^10}]")

Matokeo:

text
Jina langu ni Juma na nina miaka 22.
Mwaka ujao: 23
Jina kwa herufi kubwa: JUMA
Bei: 1234567.89
Bei: 1,234,567.89 TZS
[Juma      ]
[      Juma]
[   Juma   ]

Hatua 5 — Mfano halisi: kusafisha jina la mtumiaji

python
jina = input("Andika jina lako: ")
jina_safi = jina.strip().title()
print(f"Karibu {jina_safi}! Jina lako lina herufi {len(jina_safi)}.")
print(f"Herufi ya kwanza: {jina_safi[0]}, ya mwisho: {jina_safi[-1]}")
print(f"Jina lako kinyume: {jina_safi[::-1]}")
text
Andika jina lako:    neema
Karibu Neema! Jina lako lina herufi 5.
Herufi ya kwanza: N, ya mwisho: a
Jina lako kinyume: ameeN

Maswali ya kumuuliza mwanafunzi

  1. "Python"[2]? — Jibu: "t".
  2. "Python"[-1]? — Jibu: "n".
  3. "Python"[1:4]? — Jibu: "yth" (index 1, 2, 3).
  4. Baada ya s = "abc"; s.upper(), s ni nini? — Jibu: bado "abc"; lazima s = s.upper().
  5. Utageuzaje string kinyume? — Jibu: s[::-1].
  6. "ana" in "Tanzania"? — Jibu: False. T-a-n-z-a-n-i-a ina "an" lakini hakuna "a-n-a" mfululizo. "zan" in "Tanzania" ni True. Thibitisheni pamoja kwenye REPL.

Makosa ya kawaida

Kosa Ujumbe wa error Suluhisho
Index nje ya mipaka IndexError: string index out of range Index ya mwisho ni len(s) - 1 au tumia -1.
Kubadilisha herufi moja TypeError: 'str' object does not support item assignment Tengeneza string mpya: s = "t" + s[1:].
Kusahau mabano ya method print(s.upper) → <built-in method upper of str object at 0x...> s.upper()
Kusahau f print("Habari {jina}") → inaonyesha {jina} kama ilivyo print(f"Habari {jina}")
Kufikiri method inabadilisha string String haibadiliki s = s.strip()
Kutumia index ya 1 kwa herufi ya kwanza Unapata herufi ya pili Index inaanza 0.

Zoezi darasani

  1. Uliza jina kamili (mf. "amina juma hassan"). Onyesha: jina kwa title(), initials (A.J.H.), na idadi ya herufi bila nafasi.
  2. Uliza neno; onyesha kama ni palindrome (linasomeka sawa kinyume, mf. "kayak", "ada") — True/False.
  3. Uliza namba ya simu; onyesha True kama ina tarakimu 10 zote ni digits na inaanza na "0".
Jibu
python
# zoezi 1
jina = input("Jina kamili: ").strip()
maneno = jina.title().split()
print("Jina:", jina.title())
initials = maneno[0][0] + "." + maneno[1][0] + "." + maneno[2][0] + "."
print("Initials:", initials)
print("Herufi bila nafasi:", len(jina.replace(" ", "")))
# Kumbuka: hii inafanya kazi kwa majina 3 tu; Wiki 2 Kipindi 3 (for loop) tutaifanya ya jumla.
python
# zoezi 2
neno = input("Neno: ").strip().lower()
print("Ni palindrome?", neno == neno[::-1])
python
# zoezi 3
simu = input("Namba ya simu: ").strip()
sahihi = len(simu) == 10 and simu.isdigit() and simu.startswith("0")
print("Namba sahihi?", sahihi)

Kipindi 2 — Maamuzi: if / elif / else na Nested Conditions

Mtiririko wa kipindi

  1. Marudio ya kazi ya nyumbani
  2. if peke yake, indentation, else
  3. elif — chaguo nyingi (mfano: madaraja ya alama)
  4. Mapumziko
  5. Nested conditions + kuchanganya na and/or
  6. Mfano mkubwa: kikokotoo cha bei ya usafiri / ATM rahisi
  7. Zoezi darasani
  8. Q&A + kazi ya nyumbani

Elezo kwa mwalimu (soma kwanza wewe)

  • if sharti: — kama sharti (condition) ni True, Python inatekeleza mistari iliyo indented chini yake. Kama ni False, inairuka.
  • Muundo:

    python
    if sharti_1:
        # inafanyika kama sharti_1 ni True
    elif sharti_2:
        # inafanyika kama sharti_1 ni False NA sharti_2 ni True
    else:
        # inafanyika kama yote juu ni False
    
  • Mambo muhimu: colon : mwishoni mwa if/elif/else; indentation ya nafasi 4; elif na else si lazima; Python inakagua kutoka juu kwenda chini na inasimama kwenye sharti la kwanza lililo True — kwa hiyo mpangilio ni muhimu (alama ≥ 80 lazima ikaguliwe kabla ya ≥ 60).

  • Nested if = if ndani ya if (indentation mara mbili = nafasi 8).
  • Truthiness: if jina: ni True kama jina si string tupu. if 0: ni False.
  • Kulinganisha strings ni case-sensitive: tumia .lower() kwa input ya mtumiaji: if jibu.lower() == "ndiyo":.
  • Ternary (kwa ufupi, si lazima kufundisha sana): hali = "mtu mzima" if umri >= 18 else "mtoto".

Sema hivi kwa mwanafunzi

  • "if ni kama njia panda. Ukifika, unaangalia kibao: 'kama mvua inanyesha, chukua mwavuli; vinginevyo (else), vaa kofia ya jua'."
  • "elif ni kama mlinzi wa mlango anayeangalia orodha kwa mpangilio: 'Una kadi ya VIP? Ingia mlango A. Hapana? Una tiketi ya kawaida? Mlango B. Hapana? Huwezi kuingia (else).' Akishapata jibu la kwanza, haangalii zingine."
  • "Indentation ni kama aya za ndani kwenye daftari — mistari iliyoingizwa ndani ni 'mali' ya if iliyo juu yake."

Andika code hii live (share screen)

Hatua 1 — if na else (maamuzi.py)

python
umri = int(input("Umri wako: "))

if umri >= 18:
    print("Wewe ni mtu mzima.")
    print("Unaweza kupiga kura.")
else:
    print("Bado wewe ni mtoto.")
    print(f"Subiri miaka {18 - umri} zaidi.")

print("Asante!")    # huu uko nje ya if — unafanyika kila mara

Endesha mara mbili (umri 25, kisha 15):

text
Umri wako: 25
Wewe ni mtu mzima.
Unaweza kupiga kura.
Asante!
text
Umri wako: 15
Bado wewe ni mtoto.
Subiri miaka 3 zaidi.
Asante!

Hatua 2 — elif: madaraja ya alama (mfumo wa NECTA kwa urahisi)

python
alama = int(input("Alama (0-100): "))

if alama < 0 or alama > 100:
    print("Alama si sahihi!")
elif alama >= 75:
    print("Daraja: A")
elif alama >= 65:
    print("Daraja: B")
elif alama >= 45:
    print("Daraja: C")
elif alama >= 30:
    print("Daraja: D")
else:
    print("Daraja: F")

Uliza: "Alama 80 ni >= 65 pia. Kwa nini haionyeshi B?" → Kwa sababu Python inasimama kwenye sharti la kwanza lililo True (>= 75).

Onyesha mpangilio mbaya:

python
alama = 80
if alama >= 30:
    print("D")      # inasimama hapa! si sahihi
elif alama >= 75:
    print("A")

Hatua 3 — Nested if

python
ana_tiketi = input("Una tiketi? (ndiyo/hapana): ").strip().lower()

if ana_tiketi == "ndiyo":
    umri = int(input("Umri: "))
    if umri >= 18:
        print("Karibu kwenye tamasha!")
    else:
        print("Samahani, tamasha ni la watu wazima tu.")
else:
    print("Nunua tiketi kwanza.")

Hatua 4 — Kuchanganya and/or badala ya nesting

python
siku = input("Leo ni siku gani? ").strip().lower()

if siku == "jumamosi" or siku == "jumapili":
    print("Ni wikendi! Pumzika.")
else:
    print("Ni siku ya kazi/shule.")

Hatua 5 — Mfano mkubwa: ATM rahisi (atm.py)

python
salio = 150000
PIN_SAHIHI = "1234"

pin = input("Weka PIN: ")
if pin != PIN_SAHIHI:
    print("PIN si sahihi. Kadi imezuiliwa.")
else:
    print("1. Angalia salio")
    print("2. Toa pesa")
    chaguo = input("Chagua (1/2): ")

    if chaguo == "1":
        print(f"Salio lako ni {salio:,} TZS")
    elif chaguo == "2":
        kiasi = int(input("Kiasi cha kutoa: "))
        if kiasi <= 0:
            print("Kiasi si sahihi.")
        elif kiasi > salio:
            print("Salio halitoshi.")
        elif kiasi % 1000 != 0:
            print("ATM inatoa noti za 1,000 na kuendelea tu.")
        else:
            salio -= kiasi
            print(f"Chukua pesa zako. Salio jipya: {salio:,} TZS")
    else:
        print("Chaguo si sahihi.")

Mfano:

text
Weka PIN: 1234
1. Angalia salio
2. Toa pesa
Chagua (1/2): 2
Kiasi cha kutoa: 50000
Chukua pesa zako. Salio jipya: 100,000 TZS

Maswali ya kumuuliza mwanafunzi

  1. Kwa nini tunaweka : mwishoni mwa if? — Jibu: Ni sheria ya Python; inaonyesha block inaanza.
  2. if inaweza kuwa na elif ngapi? — Jibu: Yoyote; else moja tu, na mwishoni.
  3. Kama x = 0, if x: itafanya nini? — Jibu: Itaruka, kwa sababu 0 ni "falsy".
  4. Kwa nini tunatumia .lower() kwa jibu la mtumiaji? — Jibu: Ili "Ndiyo", "NDIYO", "ndiyo" zote zikubalike.
  5. Tofauti kati ya if...if mbili na if...elif? — Jibu: if mbili zote zinakaguliwa; elif inakaguliwa tu kama ya kwanza ilikuwa False.

Makosa ya kawaida

Kosa Ujumbe wa error Suluhisho
Kusahau : SyntaxError: expected ':' if umri >= 18:
Kutokuweka indentation IndentationError: expected an indented block after 'if' statement on line 3 Weka nafasi 4.
Indentation isiyo sawa IndentationError: unindent does not match any outer indentation level Mistari ya block moja iwe na nafasi sawa; usichanganye Tab na spaces.
= badala ya == if x = 5: → SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='? ==
else yenye sharti else alama < 30: → SyntaxError: expected ':' else: haina sharti; tumia elif.
Kulinganisha str na int input() == 5 daima False int(input()) au linganisha na "5".
if x == "a" or "b": Daima True (bug, si error!) if x == "a" or x == "b":
Mpangilio mbaya wa elif Daraja lisilo sahihi Kagua kubwa kwanza.

Zoezi darasani

  1. Uliza namba; sema kama ni chanya, hasi, au sifuri; na kama ni shufwa au witiri.
  2. Uliza namba tatu; onyesha kubwa zaidi (bila kutumia max()).
  3. Bei ya usafiri: uliza umbali (km) na kama ni mwanafunzi. Bei = 500 TZS kwa km kwa km 10 za kwanza, 300 kwa kila km baada ya hapo. Mwanafunzi anapata punguzo la 50%.
Jibu
python
# zoezi 1
n = int(input("Namba: "))
if n > 0:
    print("Chanya")
elif n < 0:
    print("Hasi")
else:
    print("Sifuri")

if n % 2 == 0:
    print("Shufwa")
else:
    print("Witiri")
python
# zoezi 2
a = float(input("a: "))
b = float(input("b: "))
c = float(input("c: "))
if a >= b and a >= c:
    kubwa = a
elif b >= a and b >= c:
    kubwa = b
else:
    kubwa = c
print("Kubwa zaidi:", kubwa)
python
# zoezi 3
km = float(input("Umbali (km): "))
mwanafunzi = input("Mwanafunzi? (ndiyo/hapana): ").strip().lower()

if km <= 10:
    bei = km * 500
else:
    bei = 10 * 500 + (km - 10) * 300

if mwanafunzi == "ndiyo":
    bei = bei * 0.5

print(f"Bei ya usafiri: {bei:,.0f} TZS")
# km 15, si mwanafunzi -> 5000 + 1500 = 6,500 TZS

Kipindi 3 — Loops: while, for, range, break, continue + Mchezo wa Bahatisha Namba

Mtiririko wa kipindi

  1. Marudio ya kazi ya nyumbani
  2. while loop, counter, infinite loop na Ctrl+C
  3. for loop juu ya string, range()
  4. Mapumziko
  5. break na continue, while True pattern
  6. Mini game: Bahatisha Namba (random) — tunaujenga hatua kwa hatua
  7. Marudio ya wiki
  8. Q&A + kazi ya nyumbani

Elezo kwa mwalimu (soma kwanza wewe)

  • Loop = kurudia block ya code mara nyingi.
  • while sharti: — inarudia maadamu sharti ni True. Kabla ya kila mzunguko inakagua sharti. Kitu ndani ya loop lazima kibadilishe hali, vinginevyo loop haitaisha (infinite loop) → simamisha kwa Ctrl + C (utaona KeyboardInterrupt).
  • for kitu in mfuatano: — inapita kwenye kila kipengele cha mfuatano (string, range, list...). Hutumika tunapojua idadi ya mizunguko.
  • range():
    • range(5) → 0, 1, 2, 3, 4 (haijumuishi 5)
    • range(1, 6) → 1, 2, 3, 4, 5
    • range(0, 20, 5) → 0, 5, 10, 15
    • range(10, 0, -1) → 10, 9, ..., 1
  • break — toka nje ya loop mara moja.
  • continue — ruka sehemu iliyobaki ya mzunguko huu, nenda mzunguko unaofuata.
  • Pattern muhimu: while True: + break — kwa programu zinazorudia hadi mtumiaji aseme "acha".
  • Accumulator pattern: jumla = 0 kabla ya loop, jumla += x ndani.
  • random: import random juu ya file; random.randint(1, 100) → namba ya bahati kuanzia 1 hadi 100 (zote zinajumuishwa, tofauti na range).

Sema hivi kwa mwanafunzi

  • "while ni kama kula wali: 'maadamu bado una njaa, endelea kula'. Ukishiba (sharti False), unaacha."
  • "for ni kama mwalimu anayeita majina kwenye orodha — anaanza wa kwanza, anamaliza wa mwisho, kila mmoja mara moja."
  • "break ni kama kengele ya moto — kila mtu anatoka nje ya jengo mara moja. continue ni kama kusema 'ruka huyu, nenda kwa anayefuata'."
  • "Infinite loop ni kama gari lisilo na breki. Ctrl + C ndiyo breki ya dharura."

Andika code hii live (share screen)

Hatua 1 — while (loops.py)

python
hesabu = 1
while hesabu <= 5:
    print("Mzunguko namba", hesabu)
    hesabu += 1
print("Loop imeisha")
text
Mzunguko namba 1
Mzunguko namba 2
Mzunguko namba 3
Mzunguko namba 4
Mzunguko namba 5
Loop imeisha

Kisha futa hesabu += 1 na endesha → infinite loop → Ctrl + C. "Ndiyo sababu lazima kitu kibadilike ndani ya loop."

Hatua 2 — Countdown

python
n = 5
while n > 0:
    print(n)
    n -= 1
print("Uzinduzi! 🚀")

Hatua 3 — for juu ya string

python
for herufi in "Python":
    print(herufi)
text
P
y
t
h
o
n
python
neno = "mamba"
idadi_a = 0
for h in neno:
    if h == "a":
        idadi_a += 1
print(f"Herufi 'a' ziko {idadi_a}")    # Herufi 'a' ziko 2

Hatua 4 — range()

python
for i in range(5):
    print(i, end=" ")       # 0 1 2 3 4
print()
for i in range(1, 6):
    print(i, end=" ")       # 1 2 3 4 5
print()
for i in range(0, 21, 5):
    print(i, end=" ")       # 0 5 10 15 20
print()
for i in range(10, 0, -2):
    print(i, end=" ")       # 10 8 6 4 2
print()

Hatua 5 — Jedwali la kuzidisha + jumla (accumulator)

python
n = int(input("Jedwali la namba gani? "))
for i in range(1, 11):
    print(f"{n} x {i:>2} = {n * i:>3}")

jumla = 0
for i in range(1, 101):
    jumla += i
print("Jumla ya 1 hadi 100 ni", jumla)   # 5050
text
Jedwali la namba gani? 7
7 x  1 =   7
7 x  2 =  14
...
7 x 10 =  70
Jumla ya 1 hadi 100 ni 5050

Hatua 6 — break na continue

python
for i in range(1, 11):
    if i == 7:
        break
    print(i, end=" ")
print()          # 1 2 3 4 5 6

for i in range(1, 11):
    if i % 3 == 0:
        continue
    print(i, end=" ")
print()          # 1 2 4 5 7 8 10

Hatua 7 — while True pattern

python
jumla = 0
while True:
    maandishi = input("Weka namba (au 'q' kuacha): ")
    if maandishi == "q":
        break
    if not maandishi.isdigit():
        print("Hiyo si namba, jaribu tena.")
        continue
    jumla += int(maandishi)
print("Jumla:", jumla)

Hatua 8 — MINI GAME: Bahatisha Namba (bahatisha.py). Jenga kwa hatua 3, ukiendesha kila hatua.

Toleo 1 (jaribio moja):

python
import random

siri = random.randint(1, 20)
jaribio = int(input("Nimefikiria namba kati ya 1 na 20. Bahatisha: "))
if jaribio == siri:
    print("Umepata!")
else:
    print(f"Hapana, ilikuwa {siri}")

Toleo 2 (rudia hadi apate, na vidokezo):

python
import random

siri = random.randint(1, 20)
while True:
    jaribio = int(input("Bahatisha (1-20): "))
    if jaribio < siri:
        print("Juu zaidi ⬆")
    elif jaribio > siri:
        print("Chini zaidi ⬇")
    else:
        print("Umepata! 🎉")
        break

Toleo 3 (kamili: majaribio machache, kuhesabu, kukagua input, kucheza tena):

python
import random

print("=== MCHEZO WA BAHATISHA NAMBA ===")

while True:                      # loop ya "cheza tena"
    siri = random.randint(1, 100)
    majaribio_max = 7
    majaribio = 0
    ameshinda = False

    print(f"\nNimefikiria namba kati ya 1 na 100. Una majaribio {majaribio_max}.")

    while majaribio < majaribio_max:
        jibu = input(f"Jaribio {majaribio + 1}: ").strip()
        if not jibu.isdigit():
            print("Tafadhali andika namba tu.")
            continue                 # haihesabiwi kama jaribio
        jaribio = int(jibu)
        if jaribio < 1 or jaribio > 100:
            print("Namba iwe kati ya 1 na 100.")
            continue
        majaribio += 1

        if jaribio < siri:
            print("Juu zaidi ⬆")
        elif jaribio > siri:
            print("Chini zaidi ⬇")
        else:
            print(f"Hongera! Umepata {siri} kwa majaribio {majaribio}.")
            ameshinda = True
            break

    if not ameshinda:
        print(f"Pole! Majaribio yamekwisha. Namba ilikuwa {siri}.")

    tena = input("Cheza tena? (ndiyo/hapana): ").strip().lower()
    if tena != "ndiyo":
        print("Kwaheri! 👋")
        break

Mfano:

text
=== MCHEZO WA BAHATISHA NAMBA ===

Nimefikiria namba kati ya 1 na 100. Una majaribio 7.
Jaribio 1: 50
Chini zaidi ⬇
Jaribio 2: 25
Juu zaidi ⬆
Jaribio 3: 37
Hongera! Umepata 37 kwa majaribio 3.
Cheza tena? (ndiyo/hapana): hapana
Kwaheri! 👋

Swali la ziada la kufikirisha: "Ni mbinu gani bora ya kubahatisha?" → Anza katikati (50), kisha katikati ya nusu iliyobaki (binary search). Kwa njia hii majaribio 7 yanatosha daima kwa 1–100 (2^7 = 128).

Kumbuka: emoji zinaonekana vizuri kwenye terminal ya VS Code. Kama terminal fulani inaonyesha alama za ajabu, ziondoe — si muhimu.

Maswali ya kumuuliza mwanafunzi

  1. range(3) inatoa namba gani? — Jibu: 0, 1, 2.
  2. random.randint(1, 6) inaweza kutoa 6? — Jibu: Ndiyo, inajumuisha pande zote mbili.
  3. Lini tutumie while badala ya for? — Jibu: while tusipojua idadi ya mizunguko (mf. hadi mtumiaji apate); for tukijua (mf. mara 10, au kila herufi).
  4. Tofauti ya break na continue? — Jibu: break inatoka kwenye loop yote; continue inaruka mzunguko huu tu.
  5. Code hii inachapisha nini? for i in range(2, 10, 3): print(i) — Jibu: 2, 5, 8.
  6. Utasimamishaje programu iliyokwama? — Jibu: Ctrl + C kwenye terminal.

Makosa ya kawaida

Kosa Ujumbe wa error Suluhisho
Infinite loop Programu haiishi; ukibonyeza Ctrl+C → KeyboardInterrupt Hakikisha variable ya sharti inabadilika ndani ya loop.
Kusahau import random NameError: name 'random' is not defined. Did you forget to import 'random'? import random juu ya file.
Kuita file random.py AttributeError: module 'random' has no attribute 'randint' Usiite file lako kwa jina la module ya Python. Badilisha jina, futa folder __pycache__.
Kufikiri range(1, 10) inajumuisha 10 Inaishia 9 range(1, 11)
Kuweka accumulator ndani ya loop jumla = 0 ndani ya loop → inarudi 0 kila mara Weka jumla = 0 kabla ya loop.
int() ya input isiyo namba ValueError: invalid literal for int() with base 10: 'abc' Kagua kwa .isdigit() kwanza.
break nje ya loop SyntaxError: 'break' outside loop break lazima iwe ndani ya for/while.
Kusahau : baada ya for/while SyntaxError: expected ':' for i in range(5):

Zoezi darasani

  1. Chapisha namba shufwa zote kati ya 1 na 30 kwa mstari mmoja.
  2. Uliza neno; hesabu vokali (a, e, i, o, u) zilizomo.
  3. Chora pembetatu ya nyota kwa urefu atakaouchagua mtumiaji:

    text
    *
    **
    ***
    
  4. Ongeza kwenye mchezo wa bahatisha: mtumiaji achague kiwango (1 = rahisi 1–10, 2 = kati 1–50, 3 = kigumu 1–100).

Jibu
python
# zoezi 1
for i in range(2, 31, 2):
    print(i, end=" ")
print()
python
# zoezi 2
neno = input("Neno: ").lower()
vokali = 0
for h in neno:
    if h in "aeiou":
        vokali += 1
print("Vokali:", vokali)
python
# zoezi 3
urefu = int(input("Urefu: "))
for i in range(1, urefu + 1):
    print("*" * i)
python
# zoezi 4 (sehemu ya kuongeza mwanzoni mwa mchezo)
import random

kiwango = input("Kiwango (1=rahisi, 2=kati, 3=kigumu): ").strip()
if kiwango == "1":
    juu = 10
elif kiwango == "2":
    juu = 50
else:
    juu = 100
siri = random.randint(1, juu)
print(f"Bahatisha namba kati ya 1 na {juu}")
while True:
    jaribio = int(input("Jaribio: "))
    if jaribio < siri:
        print("Juu zaidi")
    elif jaribio > siri:
        print("Chini zaidi")
    else:
        print("Umepata!")
        break

Kazi ya Nyumbani

KN1 (baada ya Kipindi 1, leta Kipindi 2): barua_pepe.py — uliza jina la kwanza na la mwisho; tengeneza email kwa mfumo jina.mwisho@shule.ac.tz (herufi ndogo, bila nafasi pembeni). Pia onyesha jina la mtumiaji (sehemu kabla ya @) kwa kutumia .find("@") na slicing.

KN2 (baada ya Kipindi 2, leta Kipindi 3): kodi.py — uliza mshahara wa mwezi. Kodi: hadi 270,000 → 0%; 270,001–520,000 → 8%; 520,001–760,000 → 20%; zaidi ya 760,000 → 25% (kwa urahisi, asilimia ya mshahara wote). Onyesha kodi na mshahara halisi kwa f-string yenye koma.

KN3 (baada ya Kipindi 3, leta kipindi kijacho): fizzbuzz.py — kwa namba 1 hadi 30: kama inagawanyika kwa 3 andika "Fizz", kwa 5 "Buzz", kwa 3 na 5 "FizzBuzz", vinginevyo namba yenyewe. Bonus: pin.py — mtumiaji ana majaribio 3 kuweka PIN sahihi ("2580"); baada ya 3 → "Kadi imezuiliwa".

Jibu
python
# barua_pepe.py
kwanza = input("Jina la kwanza: ").strip().lower()
mwisho = input("Jina la mwisho: ").strip().lower()
email = f"{kwanza}.{mwisho}@shule.ac.tz"
print("Email:", email)
mahali = email.find("@")
print("Jina la mtumiaji:", email[:mahali])
python
# kodi.py
mshahara = float(input("Mshahara wa mwezi: "))
if mshahara <= 270000:
    kiwango = 0
elif mshahara <= 520000:
    kiwango = 0.08
elif mshahara <= 760000:
    kiwango = 0.20
else:
    kiwango = 0.25
kodi = mshahara * kiwango
print(f"Kodi: {kodi:,.0f} TZS")
print(f"Mshahara halisi: {mshahara - kodi:,.0f} TZS")
python
# fizzbuzz.py
for n in range(1, 31):
    if n % 15 == 0:          # lazima ikaguliwe kwanza!
        print("FizzBuzz")
    elif n % 3 == 0:
        print("Fizz")
    elif n % 5 == 0:
        print("Buzz")
    else:
        print(n)
python
# pin.py
PIN = "2580"
majaribio = 0
while majaribio < 3:
    pin = input("PIN: ")
    majaribio += 1
    if pin == PIN:
        print("Karibu!")
        break
    else:
        print(f"Si sahihi. Majaribio yaliyobaki: {3 - majaribio}")
else:
    print("Kadi imezuiliwa")

Kumbuka: while ... else — else inafanyika kama loop imeisha bila break. Ni kipengele cha ziada; kama ni kigumu, tumia variable amefanikiwa = False badala yake.

Ukiulizwa swali usilolijua

Checklist ya mwisho wa wiki

  • Anatumia indexing (pamoja na negative) na anajua index inaanza 0
  • Anafanya slicing [a:b], [:b], [a:], [::-1]
  • Anajua strings ni immutable na anaandika s = s.upper()
  • Anatumia methods: strip, lower/upper/title, replace, split, find, count, isdigit
  • Anaandika f-strings na :.2f, :,
  • Anaandika if/elif/else kwa : na indentation sahihi
  • Anaelewa kwa nini mpangilio wa elif ni muhimu
  • Anaandika nested if
  • Anatumia while na anajua kusimamisha infinite loop kwa Ctrl+C
  • Anatumia for na range() (start, stop, step)
  • Anatumia break, continue, na pattern ya while True
  • Ameandika mchezo wa Bahatisha Namba unaofanya kazi