1. 程式人生 > 程式設計 >python列表推導和生成器表示式知識點總結

python列表推導和生成器表示式知識點總結

首先來看一下程式碼:

chars = "abcd"
tmp = []
for char in chars:
 tmp.append(ord(char))
print(tmp)

這是一般的寫法,將字串中的每一個字元轉換稱ASCII碼,然後存進一個tmp陣列。

利用列表推導的方式

tmp = [ord(char) for char in chars]

輸出:[97,98,99,100]

列表推導中也可以使用if和else。

當只有一個if時:

chars = "abcd"
tmp = [ord(char) for char in chars if ord(char)>=98]
print(tmp)

輸出:['b','c','d']

額外提一下,當然我們也可以利用filter和map達到相同的效果

tmp = list(filter(lambda x:x>=98,map(ord,chars)))

這句話的意思是,使用map對chars中的每一個字元利用ord函式進行處理。再使用filter對這每一個字元的ASCII碼進行過濾大於等於98的,最後將這些符合條件的值存進一個列表中。lambda x:x>98是一個匿名函式。

有一個if else時:

chars = "abcd"
tmp = [True if ord(char)>=98 else False for char in chars]
print(tmp)

輸出:[False,True,True]

一般而言,列表推導應儘量保持簡短。

再看下一個例子:利用列表推導計算笛卡兒積(以衣服的顏色和尺寸為例)

colors = ["black","white"]
sizes = ["S","M","L"]
tshirts = [(color,size) for color in colors for size in sizes]
print(tshirts)

生成器表示式可以用於生成其它資料型別的序列,雖然列表推導也可以初始化元祖、陣列和其它型別,但是生成器表示式是更好的選擇。這是因為生成器表示式背後遵從迭代器協議,可以逐個產生元素,而不是先建立一個完整的列表

生成器表示式語法和列表差不多,只不過把方括號變成圓括號。

用生成器表示式生成元組和陣列例子:

chars = "abcd"
tmp = tuple(ord(char) for char in chars)
print(tmp)

輸出:(97,100)

import array
chars = "abcd"
a = array.array("I",(ord(char) for char in chars))
print(a)

輸出:array('I',[97,100])

array的構造方法須提供兩個引數,第一個是陣列中元素的儲存方式。如果生成器表示式是唯一的引數,就不用括號括起來,這裡不是唯一的,因此要用括號括起來。

colors = ["black","L"]
for tshirt in ("%s %s" % (c,s) for c in colors for s in sizes):
  print(tshirt)

輸出:

black S
black M
black L
white S
white M
white L

以上就是本次介紹的全部相關知識點,感謝大家的學習和對我們的支援。