အခန်း 7 · animation 3 ခု

Chapter 6: For Loop နှင့် Nested Loop များ (For Loops and Nested Loops)

808 Coder မှ တင်ဆက်သည်

ဒီအခန်းပြီးရင်...

  • for loop ကို list နဲ့ string တွေပေါ်မှာ သုံးတတ်မယ်
  • range() function ကို start, stop, step တွေနဲ့ တွဲသုံးတတ်မယ်
  • break နဲ့ continue ရဲ့ ကွာခြားချက်ကို ရှင်းရှင်းလင်းလင်း သိမယ်
  • loop ထဲမှာ loop ထပ်ထည့်တဲ့ nested loop တွေ ရေးတတ်မယ်
  • ကြယ်ပုံစံ (pattern) တွေနဲ့ ဂဏန်းမြှောက်ဇယား ထုတ်နိုင်မယ်

for Loop ကို မိတ်ဆက်ခြင်း

အခန်း ၅ မှာ while loop ကို လေ့လာခဲ့ပြီးပြီ။ while က အခြေအနေ (condition) မှန်နေသရွေ့ ထပ်ခါထပ်ခါ လုပ်တာမျိုး။ ဒါပေမယ့် တခါတလေ ကိုယ်လုပ်ချင်တာက "ဒီ list ထဲက ပစ္စည်းတွေကို တစ်ခုချင်းစီ ယူကြည့်မယ်"၊ "ဒီစာကြောင်းထဲက အက္ခရာတွေကို တစ်ခုချင်းစီ စစ်မယ်" ဆိုတာမျိုး။ အဲ့ဒီအခါ for loop က အသင့်တော်ဆုံးပဲ။

for loop ရဲ့ အလုပ်က ရှင်းရှင်းလေးပဲ — sequence (ဥပမာ list, string) ထဲက item တစ်ခုချင်းစီကို အလှည့်ကျ ယူပြီး loop body ထဲက code ကို run ပေးတာ။ item တွေ ကုန်သွားရင် loop လည်း ရပ်သွားတယ်။ အကြိမ်အရေအတွက်ကို ကိုယ်တိုင် ရေတွက်နေစရာ မလိုဘူး။

Syntax က ဒီလိုပါ —

for variable in sequence:
    pass  # code block (indentation နဲ့ ခွဲခြားရမယ်)

variable ဆိုတာ ကိုယ်ကြိုက်တဲ့ နာမည်ပေးလို့ရတဲ့ ယာယီ variable တစ်ခုပဲ။ loop တစ်ပတ်လည်တိုင်း sequence ထဲက နောက် item တစ်ခုကို သူ့ထဲ ထည့်ပေးသွားတယ်။

list တစ်ခုပေါ်မှာ for loop ပတ်ကြည့်ရအောင် —

fruits = ["apple", "banana", "mango", "orange"]

for fruit in fruits:
    print("I like", fruit)

Output:

I like apple
I like banana
I like mango
I like orange

မြင်တဲ့အတိုင်းပဲ၊ fruit ဆိုတဲ့ variable ထဲကို "apple"၊ ပြီးရင် "banana" ဆိုပြီး တစ်ခုချင်း ဝင်သွားတယ်။ list မှာ item ၄ ခုရှိတော့ loop က ၄ ပတ် လည်တယ်။

string တစ်ခုပေါ်မှာလည်း ဒီအတိုင်းပဲ ပတ်လို့ရတယ်။ string ဆိုတာ အက္ခရာ (character) တွေရဲ့ sequence ပဲလေ —

word = "Python"

for letter in word:
    print(letter)

Output:

P
y
t
h
o
n

မှတ်ချက် for loop ဘယ်နှစ်ပတ် လည်မလဲဆိုတာ sequence ရဲ့ အရှည် (length) နဲ့ အမြဲတူတယ်။ ၆ လုံးပါတဲ့ string ဆို ၆ ပတ်၊ item ၁၀ ခုပါတဲ့ list ဆို ၁၀ ပတ် လည်မယ်။

for fruit in [ ... ]: the variable visits every item apple banana cherry date fruit = "apple" ... then "date" the variable takes each value in turn, one round per item
for loop က list ထဲက item တစ်ခုချင်းစီကို လှည့်ယူပုံ

Reference

range() Function

တခါတလေ list အစစ်အမှန် မရှိဘဲ "၁ ကနေ ၁၀ ထိ"၊ "၂ ကနေ ၂၀ ထိ ၂ လုံးခြား" ဆိုတဲ့ ဂဏန်းစဉ်မျိုးကို loop ပတ်ချင်တယ်။ အဲ့ဒီအတွက် range() ဆိုတဲ့ built-in function ရှိတယ်။ range() က ဂဏန်းတွေရဲ့ sequence တစ်ခု ထုတ်ပေးတယ်။

ပုံစံ ၃ မျိုးရှိတယ် —

range(stop)                 # 0 ကနေ stop-1 ထိ
range(start, stop)          # start ကနေ stop-1 ထိ
range(start, stop, step)    # step အကွာနဲ့ start ကနေ stop-1 ထိ

list() နဲ့ ပြောင်းကြည့်ရင် အထဲမှာ ဘာဂဏန်းတွေပါလဲ မြင်ရတယ် —

print(list(range(10)))        # 0 ကနေ 9 ထိ
print(list(range(1, 10)))      # 1 ကနေ 9 ထိ
print(list(range(2, 10, 2)))  # 2, 4, 6, 8
print(list(range(5, 0, -1)))   # 5, 4, 3, 2, 1

Output:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[2, 4, 6, 8]
[5, 4, 3, 2, 1]

သတိပြုရန် range() ရဲ့ stop တန်ဖိုးကိုယ်တိုင် ဘယ်တော့မှ မပါဘူး။ range(10) ဆိုတာ 0 ကနေ 9 ထိပဲ၊ 10 မပါဘူး။ ဒါက အမှားများတတ်တဲ့ အချက်မို့ သေချာမှတ်ထားပါ။

for loop နဲ့ တွဲသုံးတဲ့အခါ list() ထည့်စရာ မလိုဘူး။ range() ကိုယ်တိုင်က sequence တစ်ခုမို့လို့ တိုက်ရိုက်ပတ်လို့ရတယ် —

for number in range(1, 6):
    print("Round", number)

Output:

Round 1
Round 2
Round 3
Round 4
Round 5

နောက် ဥပမာတစ်ခု။ ၃ ရဲ့ ဆတိုးကိန်းတွေကို ၅ နဲ့ မြှောက်ပြမယ် —

for number in range(3, 16, 3):
    print(f"{number} * 5 = {number * 5}")

Output:

3 * 5 = 15
6 * 5 = 30
9 * 5 = 45
12 * 5 = 60
15 * 5 = 75

range(3, 16, 3) က 3, 6, 9, 12, 15 ကို ထုတ်ပေးတယ် (16 မပါဘူး)။ list() မထည့်လည်း for loop က အဆင်ပြေပြေ ပတ်နိုင်တယ်။

မှတ်ချက် range() က list အစစ်မဟုတ်ဘူး — "range object" ဆိုတဲ့ ပေါ့ပါးတဲ့ အမျိုးအစားပဲ။ ဂဏန်းတွေ အများကြီး (ဥပမာ သန်းချီ) ပတ်ချင်ရင်တောင် memory အများကြီး မစားဘူး။ ဒါကြောင့် for နဲ့ တွဲသုံးရင် list() ပြောင်းစရာ မလိုဘူး။

range(2, 10, 2) -> 2, 4, 6, 8 (10 is excluded) 0 1 2 3 4 5 6 7 8 9 10 11 12 2 4 6 8 X stop: excluded step = 2
range(2, 10, 2) က ထုတ်ပေးတဲ့ ဂဏန်းများ — 10 မပါဝင်ပုံ

Reference

break နဲ့ continue

loop လည်နေတုန်း အလယ်မှာ ရပ်ချင်တာ၊ ဒါမှမဟုတ် တစ်ပတ်ကို ကျော်ချင်တာမျိုးရှိတယ်။ အဲ့ဒီအတွက် break နဲ့ continue ဆိုတဲ့ statement နှစ်ခု ရှိတယ်။

  • break — loop ကို အဲဒီနေရာတင် အပြီးရပ်ပစ်တယ်။ loop အပြင်ဘက်က code ကို ဆက်သွားတယ်။
  • continue — လက်ရှိပတ်နေတဲ့ တစ်ပတ်ကိုပဲ ကျော်တယ်။ loop ကတော့ ဆက်လည်နေတယ်။ continue အောက်က စာကြောင်းတွေ ဒီတစ်ပတ်အတွက် မလုပ်တော့ဘူး။

continue နမူနာ — ၃ နဲ့ စားလို့ရတဲ့ ဂဏန်းတွေကို ကျော်မယ် —

for count in range(1, 11):
    if count % 3 == 0:
        continue
    print("statement #" + str(count))

print("The last statement")

Output:

statement #1
statement #2
statement #4
statement #5
statement #7
statement #8
statement #10
The last statement

3, 6, 9 တို့ရောက်တိုင်း continue က print ကို ကျော်သွားတယ်၊ ဒါပေမယ့် loop က ဆက်လည်တယ်။ ဒါကြောင့် "The last statement" မတိုင်ခင် စာကြောင်း ၇ ကြောင်း ထွက်လာတယ်။

break နမူနာ — အတူတူပဲ၊ ဒါပေမယ့် ၃ နဲ့ စားလို့ရတာနဲ့ တွေ့တာနဲ့ loop အပြီးရပ်တယ် —

for count in range(1, 11):
    if count % 3 == 0:
        break
    print("statement #" + str(count))

print("The last statement")

Output:

statement #1
statement #2
The last statement

၃ ရောက်တာနဲ့ break က loop ကို ဖြတ်ပစ်လိုက်တယ်။ ဒါကြောင့် statement #1 နဲ့ #2 ပဲ ထွက်လာတယ်။

နှစ်ခုကို ဇယားနဲ့ နှိုင်းယှဉ်ကြည့်ရအောင် —

break continue
အလုပ်လုပ်ပုံ loop ကို အပြီးရပ်ပစ်တယ် ဒီတစ်ပတ်ကိုပဲ ကျော်တယ်
ပြီးရင် ဘာဆက်လဲ loop အပြင်ဘက်က code ကို ဆက်တယ် loop ထဲမှာပဲ နောက်တစ်ပတ် ဆက်လည်တယ်
သုံးလေ့ရှိတာ ရှာနေတာတွေ့ရင် ရပ်ဖို့ မလိုတဲ့ item တွေ ကျော်ဖို့

သတိပြုရန် nested loop (loop ထဲမှာ loop) မှာ break သုံးရင် အတွင်းဆုံး loop ကိုပဲ ရပ်တယ်။ အပြင် loop က ဆက်လည်နေဦးမယ်။ loop နှစ်ခုလုံး ရပ်ချင်ရင် နည်းလမ်း သပ်သပ်လိုတယ် (ဥပမာ flag variable သုံးတာ)။

Reference

Nested Loop — Loop ထဲမှာ Loop

Nested loop ဆိုတာ loop တစ်ခုရဲ့ body ထဲမှာ နောက် loop တစ်ခု ထပ်ထည့်ထားတာပဲ။ အရင်အခန်းတွေမှာ nested if ကို တွေ့ခဲ့ပြီးပြီ — ဒါက loop version ပေါ့။

အရေးကြီးတဲ့ စည်းမျဉ်းတစ်ခု ရှိတယ် — အပြင် loop (outer loop) တစ်ပတ်လည်တိုင်း၊ အတွင်း loop (inner loop) က အစကနေ အဆုံးထိ အပြည့်အဝ လည်ရတယ်။ ပြီးမှ အပြင် loop က နောက်တစ်ပတ်ကို သွားတယ်။

ကြယ်ပုံ တြိဂံလေး ဆွဲကြည့်ရအောင်။ while နှစ်ခုနဲ့ —

row = 1
while row <= 6:          # Outer loop — အတန်း
    col = 1
    while col <= row:    # Inner loop — အတန်းတစ်တန်းထဲက ကြယ်
        print("#", end=" ")
        col += 1
    print()              # အတန်းပြီးရင် စာကြောင်းသစ်
    row += 1

Output:

#
# #
# # #
# # # #
# # # # #
# # # # # #

ဘယ်လိုအလုပ်လုပ်လဲ လိုက်ကြည့်ရအောင်။ row = 1 တုန်းက inner loop က col <= 1 မို့ တစ်ပတ်ပဲ လည်တယ် → # တစ်လုံး။ row = 2 ကျတော့ inner loop က ၂ ပတ် လည်တယ် → # # နှစ်လုံး။ ဒီလိုနဲ့ အတန်းတိုင်း ကြယ်အရေအတွက် တိုးသွားတာ။

for loop နှစ်ခုနဲ့လည်း ဒီအတိုင်းပဲ ရေးလို့ရတယ်။ စတုဂံပုံ grid လေး —

for row in range(3):
    for col in range(5):
        print("*", end=" ")
    print()

Output:

* * * * *
* * * * *
* * * * *

အပြင် loop က ၃ ပတ် (အတန်း ၃ တန်း)၊ တစ်တန်းချင်းစီမှာ အတွင်း loop က ကြယ် ၅ လုံး ရိုက်တယ်။

ဂဏန်းတြိဂံလေး နောက်တစ်မျိုး —

for row in range(1, 6):
    for num in range(1, row + 1):
        print(num, end=" ")
    print()

Output:

1
1 2
1 2 3
1 2 3 4
1 2 3 4 5

Nested loop ကို လက်တွေ့မှာလည်း menu program တွေမှာ သုံးတယ်။ ဆိုင်သုံး menu အသေးလေး ကြည့်ရအောင် —

while True:
    print("\n--- Mini Shop ---")
    print("1. Buy item")
    print("2. Check info")
    print("3. Exit")
    choice = input("Choose (1-3): ")

    if choice == "3":
        print("Thanks for visiting!")
        break
    elif choice == "1":
        while True:                      # Inner loop
            item = input("Item name (or 'done'): ")
            if item == "done":
                break                    # အတွင်း loop ကိုပဲ ရပ်တယ်
            print(item, "added to cart.")
    elif choice == "2":
        print("We open daily 9am - 9pm.")
    else:
        print("Invalid choice.")

'done' လို့ ရိုက်ရင် အတွင်း loop ပဲ ရပ်ပြီး အပြင် menu loop ကို ပြန်ရောက်တယ်။ '3' ရွေးမှ program အပြီးရပ်တယ်။ ဒါက nested loop + break ရဲ့ လက်တွေ့သုံး နမူနာကောင်းတစ်ခုပဲ။

မှတ်ချက် Pattern ပုံဆွဲတဲ့အခါ variable နာမည်ကို row / col (သို့မဟုတ် i / j) လို့ ပေးလေ့ရှိတယ်။ အပြင် loop က အတန်း (row) ကို ထိန်းပြီး အတွင်း loop က ကော်လံ (column) ကို ထိန်းတယ်ဆိုတာ နာမည်ကနေတင် မှတ်ရလွယ်တယ်။

Nested loops: the inner loop finishes fully each time outer: i = 0 outer finished? No inner loop runs COMPLETELY (j = 0,1,2) i += 1 Yes continue
nested loop အလုပ်လုပ်ပုံ — အတွင်း loop အပြည့်ပြီးမှ အပြင် loop ဆက်ခြင်း

Reference

Nested for နဲ့ Matrix ကို ဖြတ်သန်းခြင်း (အစမ်းမြည်း)

Nested loop ရဲ့ နောက်ထပ် အသုံးဝင်တဲ့ နေရာတစ်ခုက ဇယား (matrix/table) ပုံစံ data တွေကို တစ်ခုချင်း လျှောက်ကြည့်တာပဲ။ ဥပမာ ကျောင်းသားတစ်ယောက်ချင်းစီရဲ့ ဘာသာစုံ အမှတ်တွေ —

scores = [
    [85, 90, 78],
    [70, 88, 92],
    [95, 80, 84]
]

for row in scores:        # အပြင် loop — အတန်းတစ်ခုချင်း
    for mark in row:       # အတွင်း loop — အတန်းထဲက အမှတ်တစ်ခုချင်း
        print(mark, end=" ")
    print()                # တစ်တန်းပြီးတိုင်း စာကြောင်းသစ်

Output:

85 90 78
70 88 92
95 80 84

အပြင် loop က scores ထဲက list တစ်ခုချင်းစီ (အတန်း) ကို ယူတယ်။ အတွင်း loop က အဲ့ဒီအတန်းထဲက ဂဏန်း (အမှတ်) တစ်ခုချင်းစီကို ယူတယ်။ ဒီပုံစံက စာရင်းဇယား၊ ဂိမ်းဘုတ်၊ pixel ပုံတွေမှာ အသုံးများတယ်။

မှတ်ချက် ဒါက အစမ်းသပ်လေ့လာမှုပဲ။ list ထဲမှာ list ထပ်ထည့်တဲ့ "nested list" အကြောင်းကို အခန်း ၉ မှာ အသေးစိတ် လေ့လာရဦးမယ်။ အခု outer/inner loop ရဲ့ စိတ်ကူးကို ရသွားရင် လုံလောက်ပြီ။

Reference

for နဲ့ while — ဘယ်ဟာရွေးမလဲ

for လည်း loop ပဲ၊ while လည်း loop ပဲ — ဒါဆို ဘယ်အချိန်မှာ ဘယ်ဟာသုံးရမလဲ။ စည်းမျဉ်းက ရှင်းတယ် —

  • အကြိမ်အရေအတွက်ကို ကြိုသိရင် → for။ list ထဲက item တွေ၊ string ထဲက အက္ခရာတွေ၊ range() ဂဏန်းစဉ်တွေ — ဘယ်နှစ်ပတ်လည်မယ် အတိအကျသိတယ်။
  • ဘယ်တော့ပြီးမယ် မသိရင် → while။ အခြေအနေတစ်ခုဖြစ်တဲ့အထိ (ဥပမာ password မှန်တဲ့အထိ၊ user က 'q' နှိပ်တဲ့အထိ) ဆက်လုပ်ရမယ်။

နှိုင်းယှဉ်ကြည့်ရအောင် —

# for — ၅ ကြိမ်ဆိုတာ ကြိုသိတယ်
for i in range(5):
    print("Hello")

# while — ဘယ်နှစ်ကြိမ် တောင်းရမယ် မသိဘူး
password = ""
while password != "secret123":
    password = input("Enter password: ")
print("Welcome!")
အခြေအနေ သုံးသင့်တာ ဥပမာ
item အရေအတွက် သိတယ် for shopping list ထဲက ပစ္စည်းတွေ တစ်ခုချင်းပြ
အကြိမ်အရေအတွက် သိတယ် for + range() ၁ ကနေ ၁၀ ထိ ဂဏန်းတွေ ပေါင်း
အခြေအနေဖြစ်တဲ့အထိ while password မှန်တဲ့အထိ ပြန်တောင်း
user က ရပ်ခိုင်းတဲ့အထိ while True + break menu program တွေ

မှတ်ချက် တကယ်တော့ for နဲ့ while နှစ်ခုလုံးနဲ့ အတူတူရေးလို့ရတဲ့ program တွေ အများကြီးရှိတယ်။ ဒါပေမယ့် မှန်ကန်တာကို ရွေးသုံးရင် code က ဖတ်ရပိုလွယ်၊ အမှားလည်းနည်းတယ်။ "ဘယ်နှစ်ပတ်လဲ သိလား" လို့ ကိုယ့်ကိုယ်ကို မေးကြည့်ပါ — သိရင် for၊ မသိရင် while။

Reference

လေ့ကျင့်ခန်းများ

လေ့ကျင့်ခန်း ၁ (လွယ်) — ၁၀ × ၁၀ မြှောက်ဇယား။ Nested for loop သုံးပြီး ၁၀ × ၁၀ မြှောက်ဇယား ရိုက်ထုတ်ပါ။ ပုံစံကို အောက်ပါအတိုင်း အတိအကျ လိုက်နာပါ (i * j = ရလဒ် ကို tab နဲ့ ခြားပြီး တစ်တန်းချင်းစီ ရိုက်ပါ)။

Sample output (ပထမ ၂ ကြောင်းနဲ့ နောက်ဆုံး ၁ ကြောင်း):

1 * 1 = 1	1 * 2 = 2	1 * 3 = 3	1 * 4 = 4	1 * 5 = 5	1 * 6 = 6	1 * 7 = 7	1 * 8 = 8	1 * 9 = 9	1 * 10 = 10
2 * 1 = 2	2 * 2 = 4	2 * 3 = 6	2 * 4 = 8	2 * 5 = 10	2 * 6 = 12	2 * 7 = 14	2 * 8 = 16	2 * 9 = 18	2 * 10 = 20
...
10 * 1 = 10	10 * 2 = 20	10 * 3 = 30	10 * 4 = 40	10 * 5 = 50	10 * 6 = 60	10 * 7 = 70	10 * 8 = 80	10 * 9 = 90	10 * 10 = 100

လေ့ကျင့်ခန်း ၂ (အလယ်) — ပြောင်းပြန် ကြယ်တြိဂံ။ User က အမြင့် (height) ရိုက်ထည့်ရင် အဲ့ဒီအမြင့်နဲ့ ပြောင်းပြန် ကြယ်တြိဂံ ရိုက်ထုတ်တဲ့ program ရေးပါ။

Sample input/output:

Enter height: 4
* * * *
* * *
* *
*

လေ့ကျင့်ခန်း ၃ (အလယ်) — နာမည် စစ်ထုတ်ခြင်း။ အောက်ပါ list ထဲက 'y' နဲ့ ဆုံးပြီး အလျား ၅ လုံး (သို့မဟုတ်) ၅ လုံးထက် ပိုတဲ့ နာမည်တွေကိုပဲ ရိုက်ထုတ်ပါ။

names = ["Tommy", "Jerry", "Al", "Sunny", "Bo", "Emily"]

Expected output:

Tommy
Jerry
Sunny
Emily

လေ့ကျင့်ခန်း ၄ (ခက်) — ၃/၇ နဲ့ ဆုံးတဲ့ ဂဏန်းတွေ အစားထိုးခြင်း။ User က ဂဏန်း ၂ လုံး (a နဲ့ b) ရိုက်ထည့်မယ်။ a ကနေ b ထိ ဂဏန်းတွေကို ရိုက်ထုတ်ပါ။ ဒါပေမယ့် ၃ ဒါမှမဟုတ် ၇ နဲ့ ဆုံးတဲ့ ဂဏန်းမှန်သမျှကို * နဲ့ အစားထိုးပြပါ။

Sample input/output:

Enter a: 10
Enter b: 25
10 11 12 * 14 15 16 * 18 19 20 21 22 * 24 25