Python編程思想(15):for循環表達式

李寧老師已經在「極客起源」 微信公衆號推出《Python編程思想》電子書,囊括了Python的核心技術,以及Python的主要函數庫的使用方法。讀者可以在「極客起源」 公衆號中輸入 160442 開始學習。

《Python編程思想》總目錄

《Python編程思想》專欄

for表達式可以利用其他元組、列表等集合對象創建列表。for表達式的語法格式如下:

[表達式 for 循環計數器 in 可迭代對象]

從上面的語法格式可以看出,for表達式與普通for循環的區別有如下兩點:

  • 在for關鍵字之前需要定義一個表達式,該表達式通常會包含循環計數器;

  • for表達式沒有循環體,因此不需要冒號;

for表達式當然也是有循環的,它同樣會對可迭代對象進行循環,這一點與普通的for循環沒什麼兩樣。for表達式最終返回的是列表,因此for表達式也被稱爲列表推導式。

下面的代碼演示瞭如何用for表達式創建列表:

示例代碼:for_expr1.py

num_range = range(10)
# 對num_range執行for表達式
num_list1 = (x + x for x in num_range)   # 生成一個生成器
num_list2 = [x + x for x in num_range]   
for num in num_list1:
    print(num)
# num_range集合包含10個元素
print(num_list2)

這段代碼的執行結果如下:

0
2
4
6
8
10
12
14
16
18
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

上面的代碼會對 num_range執行選代,由於 num_range相當於包含10個元素的可迭代對象,因此程序生成的 num_list1和num_list2同樣包含10個元素,每個元素都是 num_range中每個元素的2倍(由表達式x+x控制)。

如果將for表達式的方括號改爲圓括號,for表達式將不再生成列表,而是生成一個生成器( generator),該生成器不能直接輸出相應的值,但可以使用for循環迭代。

還可以在for表達式後面添加if條件,這樣for表達式將只迭代那些符合條件的元素。代碼如下:

示例代碼:for_expr2.py

num_range = range(10)
num_list = [x + x for x in num_range if x % 2 == 1]
# a_list集合包含10個元素
print(num_list)

上面的代碼代碼與前面的代碼大致相同,只是爲for表達式增加了if條件,這樣程序只處理 num_range區間的奇數,因此程序生成的列表中只包含5個元素。

執行這段代碼,可以看到如下輸出結果

[2, 6, 10, 14, 18]

在前面看到的for表達式都是單層循環,實際上for表達式也可以是嵌套循環,代碼如下:

示例代碼:for_expr3.py

num_list = [(x, y) for x in range(5) for y in range(4)]
# num_list列表包含20個元素
print(num_list)
last_list = []
for x in range(5):
    for y in range(4):
        last_list.append((x, y))
print(last_list)

上面代碼中x是遍歷 range(5)的計數器,因此x可迭代5次(0到4);y是遍歷 range(4)的計數器,因此該y可選代4次(0到3)。所以(x,y)表達式一共會迭代20次。

運行這段代碼,可以看到如下輸出結果

[(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3), (3, 0), (3, 1), (3, 2), (3, 3), (4, 0), (4, 1), (4, 2), (4, 3)]
[(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3), (3, 0), (3, 1), (3, 2), (3, 3), (4, 0), (4, 1), (4, 2), (4, 3)]

上面的for表達式相當於如下嵌套循環

last_list=[]
for x in range(5):
    for y in range(4):
        last_list.append((x, y))
print(last_list)

當然,for表達式也支持3層或更多層嵌套,例如如下代碼是3層嵌套:

num_list = [[x, y, z] for x in range(5) for y in range(4) for z in range(8)]
print(num_list)

num_list列表共包含160個元素。

對於嵌套循環的for表達式,同樣可指定if條件。假如我們有一個需求:程序要將兩個列表中的數值按“能否整除”的關係配對在一起。比如num_list1列表中包含30,num_list2列表中包含6,其中30可以整除6,這樣就可以將30和5配對在一起。對於上面的需求使用for表達式來實現非常簡單,代碼如下:

num_list1 = [30, 12, 77, 34, 39, 78, 36, 36, 121]
num_list2 = [3, 6, 7, 12]
# 只要y能整除x,就將它們配對在一起
result = [(x, y) for x in num_list2 for y in num_list1 if y % x == 0]
print(result)

運行這段代碼,會輸出如下結果:

[(3, 30), (3, 12), (3, 39), (3, 78), (3, 36), (3, 36), (6, 30), (6, 12), (6, 78), (6, 36), (6, 36), (7, 77), (12, 12), (12, 36), (12, 36)]

對本文感興趣的同學可以加微信unitymarvel,或掃描下面二維碼加羣,然後拖加入技術討論羣。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章