while
ไปแล้ว ในบทนี้จะพูดถึงอีกวิธีหนึ่ง ก็คือใช้ for
while
จะทำซ้ำตามเงื่อนไขที่กำหนดไว้ตอนต้น for
นั้นมีกลไกในการทำซ้ำที่ต่างกันออกไปfor
เป็นคำสั่งสำหรับให้ทำซ้ำตามจำนวนของข้อมูลซึ่งใช้เป็นฐานในการวนซ้ำfor
ได้ต้องใช้คู่กับข้อมูลจำพวกลำดับของข้อมูล เช่น ลิสต์, ทูเพิล, เรนจ์, ฯลฯfor ตัวแปรที่รับค่า in รายการข้อมูลที่เป็นฐาน:
คำสั่งที่ต้องการให้ทำซ้ำ
for i in [5,6,4]:
print(i)
5
6
4
i
จะรับค่าของสมาชิกทีละตัวซึ่งต่างกันไปในแต่ละรอบ จึงแสดงผลค่าที่ต่างไปตามลำดับfor
มักใช้คู่กับ range
for i in range(1,11):
print(i,end=' ')
1 2 3 4 5 6 7 8 9 10
for i in 'αβγδεζ':
print(i,end='|')
α|β|γ|δ|ε|ζ|
in
นอกจากจะใช้คู่กับ for
แล้วโดยปกติยังใช้เพื่อหาว่าข้อมูลตัวหนึ่งเป็นสมาชิกในลำดับข้อมูลหรือไม่ เช่น
1 in [1,2,3] # ได้ True
10 in range(2,9) # ได้ False
in
มี ๒ ความหมายซึ่งแตกต่างกันระหว่างใช้กับ for
และใชักับ if
if a in x
หมายถึงตรวจเงื่อนไขว่า a
อยู่ใน x
หรือเปล่า ถ้ามีก็ทำ ถ้าไม่มีก็ไม่ทำfor a in x
หมายถึงทำซ้ำสำหรับ a
ที่มีค่าเป็นแต่ละตัวใน x
for
ก็เช่นเดียวกับ while
หรือ if
สามารถซ้อนกันหลายๆชั้นได้for i in range(1,7):
for j in range(i-1):
print(i-j,end=' ')
print(1)
1
2 1
3 2 1
4 3 2 1
5 4 3 2 1
6 5 4 3 2 1
pascal = [[1]]
for i in range(1,8):
p = [1]
for j in range(1,i):
p += [pascal[i-1][j]+pascal[i-1][j-1]]
p += [1]
pascal += [p]
print(pascal)
[[1],
[1, 1],
[1, 2, 1],
[1, 3, 3, 1],
[1, 4, 6, 4, 1],
[1, 5, 10, 10, 5, 1],
[1, 6, 15, 20, 15, 6, 1],
[1, 7, 21, 35, 35, 21, 7, 1]]
for
นอกจากจะใช้เพื่อสร้างวงจรทำซ้ำแล้ว ยังสามารถใช้เพื่อสร้างลิสต์ได้ด้วย
h = [9-x for x in range(9)]
print(h)
h
ในที่นี้หากให้เปรียบเทียบเป็นเซ็ตทางคณิตศาสตร์ก็อาจถูกเขียนเป็น
หรือ
for
อย่างที่เห็นfor
ในลักษณะนี้ จะใช้ for
เพื่อวนซ้ำเพิ่มสมาชิกก็ได้
h = []
for x in range(9):
h.append(9-x)
print(h)
for
ภายในลิสต์จึงเหมือนเป็นการเขียนย่อให้สั้นลง และนอกจากนี้แล้วยังสร้างได้เร็วขึ้นด้วยfor
อาจใช้ร่วมกับ if
เพื่อคัดกรองเฉพาะบางส่วนที่ต้องการ เช่น
k = [x for x in range(8,33,2) if(x%10!=0)]
print(k) # ได้ [8, 12, 14, 16, 18, 22, 24, 26, 28, 32]
if
ทำการคัดกรององค์ประกอบที่หาร 10
ลงตัวออกไปx = [i**2 for i in range(1,21)]
y = [i for i in range(1,401,3)]
z = [i for i in x if(i in y)]
print(z) # ได้ [1, 4, 16, 25, 49, 64, 100, 121, 169, 196, 256, 289, 361, 400]
x
และ y
มาก่อน โดยลิสต์ x
มีค่าเลขจำนวนเต็มยกกำลังสองตั้งแต่ 1
ไปถึง 20
ส่วน y
มีจำนวนที่หาร 3
แล้วได้เศษ 1
ตั้งแต่ 1
จนถึง 400
z
ได้สมาชิกเป็นจำนวนที่มีอยู่ในทั้งลิสต์ x
และ y
คือเป็นเลขยกกำลังสองที่หาร 3 แล้วได้เศษ 1for
อาจใช้เพื่อสร้างสิ่งที่คล้ายๆกับคู่อันดับหรือฟังก์ชันทางคณิตศาสตร์ได้ เช่น
z = [[i,i**2] for i in range(5)]
print(z) # ได้ [[0, 0], [1, 1], [2, 4], [3, 9], [4, 16]]
for
มากกว่าหนึ่งด้วย ซึ่งในกรณีนั้นจะเกิดผลลัพธ์เป็นสมาชิกในลิสต์จำนวนมากมายเท่ากับจำนวนของ สมาชิกในลิสต์ที่นำมาใช้เป็นฐานคูณกัน เช่นfor
สร้างลิสต์ของคู่อันดับที่จับเอาสมาชิกจาก ๒ ลิสต์มาไขว้กันให้หมด
x = range(5)
y = [4-i for i in range(5)]
z = [(i,j) for i in x for j in y] # ได้ [(0, 4), (0, 3), (0, 2), (0, 1), (0, 0), (1, 4), (1, 3), (1, 2), (1, 1), (1, 0), (2, 4), (2, 3), (2, 2), (2, 1), (2, 0), (3, 4), (3, 3), (3, 2), (3, 1), (3, 0), (4, 4), (4, 3), (4, 2), (4, 1), (4, 0)]
z = [i*j for i in x for j in y]
print(z) # ได้ [0, 0, 0, 0, 0, 4, 3, 2, 1, 0, 8, 6, 4, 2, 0, 12, 9, 6, 3, 0, 16, 12, 8, 4, 0]
x
และ y
ทั้งหมด ทำให้ได้สมาชิกออกมา 25 ตัวfor
ที่อยู่ทางขวา แล้วค่อยตามด้วย for
ตัวซ้ายz = [i for i in x for j in y]
print(z) # ได้ [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4]
y
จะไม่ได้ส่งผลต่อค่าของสมาชิกในลิสต์ แต่จำนวนสมาชิกของ y
ก็มีผลต่อจำนวนที่จะได้ซ้ำf = ['ก','ข','ค','ง']
g = [i for i in f for j in [0,0,0]]
print(g) # ได้ ['ก', 'ก', 'ก', 'ข', 'ข', 'ข', 'ค', 'ค', 'ค', 'ง', 'ง', 'ง']
for
นั้น ต้องมีตัวแปรหนึ่งมาทำหน้าที่เป็นตัวช่วยไล่เพื่อป้อนค่าให้กับลิสต์ ตัวแปรนั้นจะใช้ชื่อว่าอะไรก็ได้ แม้ว่าจะซ้ำกับชื่อที่มีอยู่แล้วก็ไม่มีผลอะไร
i = 100
x = [i for i in range(10)]
print(i) # ได้ 100 เท่าเดิม
i
ที่ถูกใช้วิ่งในลิสต์ไม่ได้เกี่ยวข้องอะไรกับ i
ที่ถูกประกาศก่อนหน้า ดังนันพอหาค่า i
หลังจากสร้างลิสต์จบ ค่าของ i
ก็ยังคงได้ 100
เท่าเดิมi
จะเปลี่ยนไปด้วยfor
เพื่อสร้างวงจรทำซ้ำ ตัวแปรที่ถูกใช้จะเปลี่ยนค่าไปด้วย ต่างกับกรณีใช้ for
สร้างลิสต์
i = 100
x = []
for i in range(10):
x.append(i)
print(i) # ได้ 9
i
กลายเป็น 9
ซึ่งเป็นค่าสุดท้ายของเรนจ์ที่ถูกไล่ในวงจร for
แทนที่จะเป็นค่าเดิมคือ 100
for
สามารถใช้เพื่อทำการวนซ้ำได้ โดยมีกลไกและข้อดีและข้อเสียต่างไปจาก while
หากแยกแยะใช้ ๒ วิธีนี้สลับกันไปตามสถานการณ์น่าจะช่วยให้การทำงานมีประสิทธิภาพเป็นอย่างมากfor
ยังสามารถใช้สร้างลิสต์ได้ด้วย ซึ่งเป็นวิธีการที่สะดวก ช่วยให้การสร้างลิสต์เขียนสั้นลงดูง่ายขึ้นมากติดตามอัปเดตของบล็อกได้ที่แฟนเพจ