在python的list表示中,提供了一種簡易的寫法可以將複雜的迴圈表示為一行的形式,如官網文件中寫道,我們想要生成一個0-9平方項的列表可以這樣寫:
土法煉鋼使用迴圈
squares = []
for x in range(10):
squares.append(x**2)
# Output
squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
或者可以表示為list建構子帶函式參數:
squares = list(map(lambda x: x**2, range(10)))
或者是表示為List Comprehesion形式:
squares = [x**2 for x in range(10)]
[expression for item in iterable]
其中:
上述程式碼可以看到,使用List Comprehesion寫法可以使程式碼更簡潔和易讀
在list comprehesion表示中甚至可以加入條件式,語法為:[expression for item in iterable if condition]
其中:
接續上述範例,若想要產生一組0-9中奇數的平方項列表,可以這樣寫:
odd_squares = [x**2 for x in range(10) if x%2 != 0]
# Output
odd_squares
[1, 9, 25, 49, 81]
在list comprehesion表示中也可以將巢狀迴圈表示為一行,語法為:[expression for item in iterable for item2 iterable2 ...]
其中:
巢狀迴圈的順序等於list comprehesion裡由左至右的順序,例如我們想要生成一個九九乘法表可以表示為:
table = [x*y for x in range(10)[1:] for y in range(10)[1:]]
# Output
table
[1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 4, 6, 8, 10, 12, 14, 16, 18, 3, 6, 9, 12, 15, 18, 21, 24, 27, 4, 8, 12, 16, 20, 24, 28, 32, 36, 5, 10, 15, 20, 25, 30, 35, 40, 45, 6, 12, 18, 24, 30, 36, 42, 48, 54, 7, 14, 21, 28, 35, 42, 49, 56, 63, 8, 16, 24, 32, 40, 48, 56, 64, 72, 9, 18, 27, 36, 45, 54, 63, 72, 81]
或是想要整理成這樣,因為list comprehesion本身就可以表示為一個合法的表達式(expression):
table = [[x*y for x in range(10)[1:]] for y in range(10)[1:]]
# Output
table
[[1, 2, 3, 4, 5, 6, 7, 8, 9], [2, 4, 6, 8, 10, 12, 14, 16, 18], [3, 6, 9, 12, 15, 18, 21, 24, 27], [4, 8, 12, 16, 20, 24, 28, 32, 36], [5, 10, 15, 20, 25, 30, 35, 40, 45], [6, 12, 18, 24, 30, 36, 42, 48, 54], [7, 14, 21, 28, 35, 42, 49, 56, 63], [8, 16, 24, 32, 40, 48, 56, 64, 72], [9, 18, 27, 36, 45, 54, 63, 72, 81]]
在list comprehesion中甚至還有更複雜的寫法:[expression if-else clause for item in iterable condition/iterable]
其中:
基於可讀性的因素,這樣複雜的表示可能會造成程式的可讀性變差,有興趣的觀眾朋友再自己試試囉
官網文件List Comprehesion
https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions
Python Basics:List Comprehesions
https://towardsdatascience.com/python-basics-list-comprehensions-631278f22c40