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 kwawhile/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 + Cndani ya terminal. Utaihitaji!
Malengo ya Wiki (mwisho wa wiki mwanafunzi ataweza...)
- Kutumia indexing (
s[0],s[-1]) na slicing (s[1:4],s[::-1]) kwenye strings. - Kutumia string methods:
upper,lower,title,strip,replace,split,find,count,startswith,isdigit, nalen(),in. - Kutumia f-strings:
f"Habari {jina}",f"{bei:,.2f}". - Kuandika maamuzi kwa
if / elif / elsena nested conditions. - Kurudia kazi kwa
whilenafor, kutumiarange(),break,continue. - Kutumia
random.randint()kujenga mchezo wa kubahatisha namba.
Kipindi 1 — Strings kwa Kina: indexing, slicing, methods, f-strings
Mtiririko wa kipindi
- Marudio ya kazi ya nyumbani (kibadilishaji.py)
- String ni mfuatano wa herufi:
len(), indexing, negative index - Slicing
[start:stop:step] - Mapumziko
- String methods
- f-strings na formatting ya namba
- Zoezi darasani
- 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.
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 kulikolen(s)-1→IndexError. - Slicing
s[start:stop]inachukua kuanziastarthadi kabla yastop(stop haijumuishwi).s[0:3]→"Tan". Ukiachastart→ kuanzia mwanzo; ukiachastop→ hadi mwisho.s[::2]→ kila herufi ya pili.s[::-1]→ string iliyogeuzwa. - Slicing haileti
IndexErrorhata ukizidi:s[0:100]→ string yote. - Strings hazibadiliki (immutable):
s[0] = "t"→TypeError. Methods hazibadilishi string ya asili; zinarudisha string mpya. Ndiyo maana tunaandikajina = 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
fkabla 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
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
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
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.
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
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:
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
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]}")
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
"Python"[2]? — Jibu:"t"."Python"[-1]? — Jibu:"n"."Python"[1:4]? — Jibu:"yth"(index 1, 2, 3).- Baada ya
s = "abc"; s.upper(),sni nini? — Jibu: bado"abc"; lazimas = s.upper(). - Utageuzaje string kinyume? — Jibu:
s[::-1]. "ana" in "Tanzania"? — Jibu:False. T-a-n-z-a-n-i-a ina "an" lakini hakuna "a-n-a" mfululizo."zan" in "Tanzania"niTrue. 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
- Uliza jina kamili (mf. "amina juma hassan"). Onyesha: jina kwa
title(), initials (A.J.H.), na idadi ya herufi bila nafasi. - Uliza neno; onyesha kama ni palindrome (linasomeka sawa kinyume, mf. "kayak", "ada") —
True/False. - Uliza namba ya simu; onyesha
Truekama ina tarakimu 10 zote ni digits na inaanza na "0".
Jibu
# 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.
# zoezi 2 neno = input("Neno: ").strip().lower() print("Ni palindrome?", neno == neno[::-1])
# 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
- Marudio ya kazi ya nyumbani
ifpeke yake, indentation,elseelif— chaguo nyingi (mfano: madaraja ya alama)- Mapumziko
- Nested conditions + kuchanganya na
and/or - Mfano mkubwa: kikokotoo cha bei ya usafiri / ATM rahisi
- Zoezi darasani
- Q&A + kazi ya nyumbani
Elezo kwa mwalimu (soma kwanza wewe)
if sharti:— kama sharti (condition) niTrue, Python inatekeleza mistari iliyo indented chini yake. Kama niFalse, inairuka.-
Muundo:
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 mwaif/elif/else; indentation ya nafasi 4;elifnaelsesi 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 =
ifndani yaif(indentation mara mbili = nafasi 8). - Truthiness:
if jina:ni True kamajinasi 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
- "
ifni kama njia panda. Ukifika, unaangalia kibao: 'kama mvua inanyesha, chukua mwavuli; vinginevyo (else), vaa kofia ya jua'." - "
elifni 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
ifiliyo juu yake."
Andika code hii live (share screen)
Hatua 1 — if na else (maamuzi.py)
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):
Umri wako: 25 Wewe ni mtu mzima. Unaweza kupiga kura. Asante!
Umri wako: 15 Bado wewe ni mtoto. Subiri miaka 3 zaidi. Asante!
Hatua 2 — elif: madaraja ya alama (mfumo wa NECTA kwa urahisi)
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:
alama = 80 if alama >= 30: print("D") # inasimama hapa! si sahihi elif alama >= 75: print("A")
Hatua 3 — Nested if
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
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)
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:
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
- Kwa nini tunaweka
:mwishoni mwaif? — Jibu: Ni sheria ya Python; inaonyesha block inaanza. ifinaweza kuwa naelifngapi? — Jibu: Yoyote;elsemoja tu, na mwishoni.- Kama
x = 0,if x:itafanya nini? — Jibu: Itaruka, kwa sababu 0 ni "falsy". - Kwa nini tunatumia
.lower()kwa jibu la mtumiaji? — Jibu: Ili "Ndiyo", "NDIYO", "ndiyo" zote zikubalike. - Tofauti kati ya
if...ifmbili naif...elif? — Jibu:ifmbili zote zinakaguliwa;elifinakaguliwa 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
- Uliza namba; sema kama ni chanya, hasi, au sifuri; na kama ni shufwa au witiri.
- Uliza namba tatu; onyesha kubwa zaidi (bila kutumia
max()). - 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
# 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")
# 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)
# 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
- Marudio ya kazi ya nyumbani
whileloop, counter, infinite loop naCtrl+Cforloop juu ya string,range()- Mapumziko
breaknacontinue,while Truepattern- Mini game: Bahatisha Namba (
random) — tunaujenga hatua kwa hatua - Marudio ya wiki
- 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 kwaCtrl + C(utaonaKeyboardInterrupt).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, 5range(0, 20, 5)→ 0, 5, 10, 15range(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 = 0kabla ya loop,jumla += xndani. random:import randomjuu ya file;random.randint(1, 100)→ namba ya bahati kuanzia 1 hadi 100 (zote zinajumuishwa, tofauti narange).
Sema hivi kwa mwanafunzi
- "
whileni kama kula wali: 'maadamu bado una njaa, endelea kula'. Ukishiba (sharti False), unaacha." - "
forni kama mwalimu anayeita majina kwenye orodha — anaanza wa kwanza, anamaliza wa mwisho, kila mmoja mara moja." - "
breakni kama kengele ya moto — kila mtu anatoka nje ya jengo mara moja.continueni kama kusema 'ruka huyu, nenda kwa anayefuata'." - "Infinite loop ni kama gari lisilo na breki.
Ctrl + Cndiyo breki ya dharura."
Andika code hii live (share screen)
Hatua 1 — while (loops.py)
hesabu = 1 while hesabu <= 5: print("Mzunguko namba", hesabu) hesabu += 1 print("Loop imeisha")
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
n = 5 while n > 0: print(n) n -= 1 print("Uzinduzi! 🚀")
Hatua 3 — for juu ya string
for herufi in "Python": print(herufi)
P y t h o n
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()
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)
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
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
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
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):
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):
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):
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:
=== 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
range(3)inatoa namba gani? — Jibu: 0, 1, 2.random.randint(1, 6)inaweza kutoa 6? — Jibu: Ndiyo, inajumuisha pande zote mbili.- Lini tutumie
whilebadala yafor? — Jibu:whiletusipojua idadi ya mizunguko (mf. hadi mtumiaji apate);fortukijua (mf. mara 10, au kila herufi). - Tofauti ya
breaknacontinue? — Jibu:breakinatoka kwenye loop yote;continueinaruka mzunguko huu tu. - Code hii inachapisha nini?
for i in range(2, 10, 3): print(i)— Jibu: 2, 5, 8. - Utasimamishaje programu iliyokwama? — Jibu:
Ctrl + Ckwenye 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
- Chapisha namba shufwa zote kati ya 1 na 30 kwa mstari mmoja.
- Uliza neno; hesabu vokali (a, e, i, o, u) zilizomo.
-
Chora pembetatu ya nyota kwa urefu atakaouchagua mtumiaji:
* ** ***
-
Ongeza kwenye mchezo wa bahatisha: mtumiaji achague kiwango (1 = rahisi 1–10, 2 = kati 1–50, 3 = kigumu 1–100).
Jibu
# zoezi 1 for i in range(2, 31, 2): print(i, end=" ") print()
# zoezi 2 neno = input("Neno: ").lower() vokali = 0 for h in neno: if h in "aeiou": vokali += 1 print("Vokali:", vokali)
# zoezi 3 urefu = int(input("Urefu: ")) for i in range(1, urefu + 1): print("*" * i)
# 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
# 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])
# 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")
# 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)
# 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
- Jaribu pamoja kwenye REPL — strings na
rangeni rahisi kujaribu papo hapo (list(range(2, 10, 3))inaonyesha namba zote za range). - Tafuta: "python string methods", "python f-string format number", "python while vs for".
- Docs: https://docs.python.org/3/library/stdtypes.html#string-methods , https://docs.python.org/3/tutorial/controlflow.html , https://docs.python.org/3/library/random.html
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/elsekwa:na indentation sahihi - Anaelewa kwa nini mpangilio wa
elifni muhimu - Anaandika nested
if - Anatumia
whilena anajua kusimamisha infinite loop kwaCtrl+C - Anatumia
fornarange()(start, stop, step) - Anatumia
break,continue, na pattern yawhile True - Ameandika mchezo wa Bahatisha Namba unaofanya kazi