for 包含式(Comprehension)


你可以在for運算式中使用包含式語法來進行值的收集,for運算結束傳回收集的結果,例如:
import sys
files = [arg for arg in sys.argv if arg.endswith('.txt')]
print(files)

這個範例可以收集命令列引數中輸入為.txt結尾的檔名,只有符合if測試的arg才會被收集,由於使用[]包含,所以最後的結果是以串列傳回。例如:
>python demo.py 1.txt 2.doc. 3.txt 4.html 5.txt
['1.txt', '3.txt', '5.txt']

if的部份可以省略,這時會收集所有的迭代的值,你可以在for左邊進行值的處理。例如計算串列中所有數的平方數:
>>> [number ** 2 for number in [10, 20, 30]]
[100, 400, 900]

如果要作更巢狀的元素包括也是可行的,例如以下可將二維矩陣轉換為一維陣列:
>>> matrix = [
...     [1, 2, 3],
...     [4, 5, 6],
...     [7, 8, 9]
... ]
>>> array = [element for row in matrix for element in row]
>>> array
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>

上例若不以for包含式來實作,則如下:
>>> matrix = [
...     [1, 2, 3],
...     [4, 5, 6],
...     [7, 8, 9]
... ]
>>> array = []
>>> for row in matrix:
...     for element in row:
...         array.append(element)
...
>>> array
[1, 2, 3, 4, 5, 6, 7, 8, 9]

另一個例子是,使用for包含式來取得兩個串列的排列組合:
>>> [letter1 + letter2 for letter1 in 'Justin' for letter2 in 'momor']
['Jm', 'Jo', 'Jm', 'Jo', 'Jr', 'um', 'uo', 'um', 'uo', 'ur', 'sm', 'so', 'sm', 'so', 'sr', 'tm', 'to', 'tm', 'to', 'tr', 'im', 'io', 'im', 'io', 'ir', 'nm', 'no
', 'nm', 'no', 'nr']
>>>

在Python3中,for包含式所收集的元素並不一定得包括在串列中,而可以包括在集合、字典中。例如:
>>> {i for i in 'Justin'}
{'i', 'J', 'n', 's', 'u', 't'}
>>> scores = [('Justin', 95), ('momor', 93), ('Hamimi', 99)]
>>> {name : score for (name, score) in scores}
{'Hamimi': 99, 'Justin': 95, 'momor': 93}
>>>

如果以()包括for包含式,則會建立一個產生器物件(本身是個具有__next__()的迭代器),可以直接對其迭代來逐一取得元素。例如建立一個質數產生器(參考 Eratosthenes 篩選求 質數):
import math
def primes(max):
prime = [1] * max
for i in range(2, int(math.sqrt(max))):
if prime[i] == 1:
for j in range(2 * i, max):
if j % i == 0:
prime[j] = 0
return (i for i in range(2, max) if prime[i] == 1)

for prime in primes(1000):
print(prime, end=" ")