Python: For-loop ถ้าพื้นฐานแน่น ซ้อนกี่ชั้นก็ไม่หวั่น

Grassroot Engineer
CODIUM
Published in
6 min readApr 15, 2021
https://giphy.com/gifs/twitter-nba-oh-xT9IgNvvcp14rl6PRu/links

จริงๆต้องบอกเลยว่า เรื่องพื้นฐานเป็นสิ่งที่สำคัญ ไม่อย่างงั้นเราจะไม่สามารถเข้าถึงตัวภาษาและไม่สามารถไปในระดับสูงได้ เอาล่ะ มาเริ่มจากง่ายไปยากกันเลยดีกว่า

โดยปกติใน ระบบคอมพิวเตอร์จะมีการทำซ้ำ 2 แบบคือ for-loop กับ while loop โดย for-loop นั้น จะใช้ในกรณีที่เรารู้จำนวนรอบที่แน่นอนตั้งแต่ตอนที่เราเขียนโค้ด เช่น เราจะพิมพ์ตัวเลข 1–100 ซึ่งเรารู้จำนวนรอบแน่ๆอยู่แล้วไง.

ส่วนอีกกรณี while loop คือเราไม่สามารถรู้จำนวนครั้งได้ เช่น ต้องการให้ user ใส่ตัวเลขเข้ามาเรื่อยๆ และนำข้อมูลแต่ละตัวมาบวกกัน โดยเมื่อผู้ใช้กด ‘Enter’ ก้อให้หยุดการทำงาน ซึ่งเราไม่รู้ล่วงหน้าว่า user จะใส่ตัวเลขเข้ามากี่ตัว

https://www.dataquest.io/blog/tutorial-advanced-for-loops-python-pandas/

เริ่มกันเลย

1. for Loop (basic)

เป็นการทำ loop ปกติที่ลูฟค่าออกมาจาก list ทีละตัว

colors = ['red', 'green', 'yellow', 'black']for color in colors:  # เป็นการลูฟ list of colors ออกมาทีละตัว (element)
print(color)
s = 'red'
for x in s:
# เป็นการลูฟ String ออกมาทีละตัว (element)
print(x)
# ==== output ====
red
green
yellow
black
r
e
d

หรืออีกตัวอย่างคับ
จริงๆแล้วแค่เปลี่ยนวิธีการเขียนเฉยๆโดยใช้ len() เข้ามาร่วมด้วยเพื่อให้วนรอบตามค่าของ len() ซึ่งในตัวอย่างคือ 6

แต่จริงๆแล้วเราจะใช้วิธีเดียวกับด้านบนก็ได้เช่นกันแบบนี้
for language in languages: print(language)

languages = ['Spanish', 'English', 'French', 'German', 'Irish', 'Chinese']

for index in range(len(languages)):
print('Language ', index + 1, ' = ', languages[index])
# ==== output ====
Language 1 = Spanish
Language 2 = English
Language 3 = French
Language 4 = German
Language 5 = Irish
Language 6 = Chinese

2. for Loop with Break statement

เมื่อเจอ break ก็จะออกจาก loop for ฉะนั้นใน output จึงมี print แค่ 2 elements.

colors = ['red', 'green', 'yellow', 'black']for color in colors:
if color == 'yellow':
break
#เมื่อเจอ break จะออกจาก loop for เลยจึงไม่ทำเงื่อนไขใน if
print(color)
print('---End---')
# ==== output ====
red
green
---End---

3. for Loop with Continue statement

คือ เมื่อเจอ continue ก็จะผ่านไปเลย คือ ignore 3 ไปเลยนะ เพื่อไปทำ 4 ต่อ (ทำลูฟถัดไป) ฉะนั้น output จึงไม่มี 3

พูดง่ายๆนะ ถ้าตรงเงื่อนไข แล้วเจอกับ continue มันจะไม่ทำข้างล่าง continue แล้ว และไปเริ่ม for loop รอบต่อไปเลย

(เคสข้างล่างนี้พอมันไม่ทำ print(number) นั่นคือ จะไม่ print รอบที่ for loop เป็น 3 นั่นเอง)

numbers = [1, 2, 3, 4, 5]
for number in numbers:
if number == 3:
continue
# ถ้าเจอ continue จะไม่ทำในเงื่อนไข แต่ยังอยู่ในลูฟ
print(number)
print('---End---')
# ==== output ====
1
2
4
5
---End---

จำง่ายๆนะ ไม่ว่าจะเจอ break หรือ continue ก็จะไม่ทำในเงื่อนไขนะ
เพียงแต่ break จะออกจากลูฟเลย แต่ continue ยังอยู่ในลูฟต่อไป

4. The Range() Function

เป็นการใช้ for Loop ร่วมกับ range() โดย range() เป็น function นึงของ Python ที่สามารถกำหนดได้ 3 arguments คือ start, stop, step แต่ในที่นี้เรากำหนดแค่

range(5) คือ นับจาก 0 ถึง 4
range(2, 8) คือ นับตั้งแต่ 2 ถึง 7
list(range(2, 8)) จึงเป็นการแปลงให้ range ออกมาเป็น list

for i in range(5):
print(i)

print(list(range(2, 8)))
# เป็นการ print list ของ range() นะ
# ==== output ====
0
1
2
3
4
[2, 3, 4, 5, 6, 7]

5. for Loop with Else

เป็นการใช้คำสั่ง else ร่วมกับ for Loop ด้วย โดย for loop จะถูก execute ก่อน จากนั้นส่วนของ else ค่อย execute ทีหลังตามลำดับ

colors = ['red', 'green', 'yellow', 'black']

for color in colors:
print(color)
else:
print('No more color !')
# ทำงานหลังจาก loop for

print('---End---')
# ==== output ====
red
green
yellow
black
No more color !
---End---

6. Nested for Loops

อันนี้จะเป็น for Loops แบบหลายชั้น สำหรับงานที่ซับซ้อนขึ้น
ลูฟที่อยู่ข้างใน เราจะเรียกว่า “nested loop” ในการทำงาน ลูฟนอกจะทำ 1 ครั้งต่อ nested loop (inner loop) 4 ครั้ง หรือ ตามจำนวนของ elements ด้านใน

fruits = ['mango', 'banana', 'apple']
colors = ['yellow', 'black', 'green', 'purple']

for fruit in fruits:
# ลูฟนอก มี 3 elements จึงทำ 3 ครั้ง
for color in colors:
# ลูฟใน 4 elements จึงทำ 4 ครั้งต่อลูฟนอก 1 ครั้ง
print(fruit, ' = ', color)
print('-------------')
# ==== output ลูฟนอก 3 ครั้ง ลูฟใน 4 ครั้ง ====mango = yellow
mango = black
mango = green
mango = purple
-------------
banana = yellow
banana = black
banana = green
banana = purple
-------------
apple = yellow
apple = black
apple = green
apple = purple
-------------

อาจจะงงๆ ลองมาดูตัวอย่างต่อไปกันครับ จะเป็นการสร้างสูตรคูณนะคับ เร่ิมจาก for loop ชั้นเดียวก่อนจะได้แบบนี้

def mult_table(number):
for i in range(1, 13):
print('{} x {} = {}'.format(number, i, i * number))
print('-' * 15)

mult_table(number=5)
# ==== output ====
5 x 1 = 5
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45
5 x 10 = 50
5 x 11 = 55
5 x 12 = 60
---------------

ถัดไปจะลองใช้ for loop แบบ 2 ชั้นเพื่อกำหนดให้แสดงสูตรคูณได้ทีละหลายแม่เลย ซึ่งในตัวอย่างข้างล่างคือจะให้แสดงสูตรคูณตั้งแต่แม่ 2 ถึงแม่ 5 จึงต้องใช้ for loop 2 ขั้นคือ

  • รอบนอกจะเป็นการกำหนดรอบใหญ่รอบนอกว่าต้องการ range กว้างแค่ไหน
  • รอบในจะตายตัวคือ ให้เป็น 1 ถึง 12 ฉะนั้นจึงกำหนด range(1, 13)
def list_mult_table(number_start, number_stop):
for i in range(number_start, number_stop + 1):
for j in range(1, 13):
print('{} x {} = {}'.format(i, j, i * j))
print('-' * 15)


list_mult_table(number_start=2, number_stop=5)
# ==== output ====
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18
2 x 10 = 20
2 x 11 = 22
2 x 12 = 24
---------------
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27
3 x 10 = 30
3 x 11 = 33
3 x 12 = 36
---------------
4 x 1 = 4
4 x 2 = 8
4 x 3 = 12
4 x 4 = 16
4 x 5 = 20
4 x 6 = 24
4 x 7 = 28
4 x 8 = 32
4 x 9 = 36
4 x 10 = 40
4 x 11 = 44
4 x 12 = 48
---------------
5 x 1 = 5
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45
5 x 10 = 50
5 x 11 = 55
5 x 12 = 60
---------------

7. List-of-Lists in Python For Loop

จริงๆแล้วมันคือ List ที่ซ้อนอยู่ภายใน Lists อีกที ซึ่งเราสามารถใช้ for loop โดย access the individual elements ในแต่ละ list หรือ tuple ได้เลย เช่น จากตัวอย่างด้านล่าง เราจะใช้ตัวแปร name, age, position มารับค่าที่ได้จากลิสต์ info ได้เลย

info = [
['Attana', 37, 'Grassroot dev'],
['Supitcha', 24, 'Junior dev'],
['Pawanphat', 30, 'Shipping']
]
for name, age, position in info: # สามารถทำ for-loop แบบนี้ได้เลย
print('name = ', name)
print('age = ', age)
print('position = ', position)
print('------------------')
# ==== output ====age = 37
position = Grassroot dev
------------------
name = Supitcha
age = 24
position = Junior dev
------------------
name = Pawanphat
age = 30
position = Shipping
------------------

หรือ อีกตัวอย่างนะคับ

numbers = ((1, 2), (3, 4), (5, 6))

for a, b in numbers:
print(a, ' + ', b, ' = ', a + b)
# ==== output ====
1 + 2 = 3
3 + 4 = 7
5 + 6 = 11

ซึ่งจาก 2 ตัวอย่างด้านบนเป็นการใช้ for loop ดำเนินการใน list หรือ tuple อันนี้ลองมาใช้กับ dictionary กันบ้าง

ถ้าใช้กับ dict เราจะต้องใช้ร่วมกับ .items() เพื่อให้มันคืนค่าออกมาเป็น dict_items คือ หน้าตาจะเป็น tuple ที่อยู่ด้านใน list, หลังจากนั้นเราก้อใช้ for loop กับมันได้ปกติเลย

stocks = {
'BBL': 152.3,
'KBANK': 182.5,
'KTB': 17.5,
'TMB': 2.3
}

for bank, price in stocks.items():
print('{} : {}'.format(bank, price))
# ==== output ====
BBL : 152.3
KBANK : 182.5
KTB : 17.5
TMB : 2.3

8. Access Index in for Loop

enumerate แปลว่า แจกแจง
คำสั่งนี้เป็นคำสั่งสำหรับแจกแจงค่า index และข้อมูลใน index ในรูปแบบทูเพิล (Tuple) ดังนี้ (Index,Value) โดยต้องใช้กับข้อมูลชนิด list

คือ พูดง่ายๆ ถ้าใช้ enumerate() กับ for loop เราก็จะได้ค่า index พร้อมกับ value ใน list คืนกลับมา

colors = ['yellow', 'black', 'green', 'purple']

for index, value in enumerate(colors):
print(index, value)
# ==== output ====
0 yellow
1 black
2 green
3 purple

9. Short for-loop

ในการเขียน for-loop เราสามารถเขียนแบบรวบรัดให้เหลือกบรรทัดเดียวก็ได้ เช่น

เปรียบเทียบ for-loop normal กับ short for-loop
อีกตัวอย่างของ short for-loop ที่ใช้กับ list ซ้อนใน list โดยแจกแจงค่าออกมาเก็บไว้ใน name, score

ใน Used case จริงๆ ถ้าตัวแปรไหนใช้แค่ครั้งเดียว ไม่ได้ใช้ที่อื่นอีก เราไม่ควรแทนตัวแปรนะคับ กำหนดค่าเข้าไปเลย เช่น ตัวอย่างข้างล่าง จะประหยัดตัวแปร result ถ้าเราต้องการแค่เก็บค่า และ print ออกไปเท่านั้น

ใช้ short for loop จะช่วยให้ performance ดีขึ้น

10. Nested short for-loop

ถ้าเราแม่นขึ้นมาหน่อยแล้ว เราสามารถเขียน short for-loop 2 ชั้น ก็ได้นะ (แต่ code จะอ่านยาก จึงไม่แนะนำเท่าไหร่)

Nested short for loop (very simple but great)

อีก used case ของ nested for loop เพื่อสร้าง data type แบบที่เราต้องการ

nested for loop in used case

--

--

Grassroot Engineer
CODIUM
Writer for

ATM engineer who is interested in CODING and believe in EFFORT. — https://grassrootengineer.com