1 從示例說起
Luciano Ramalho 舉了這樣一個示例,把一個字符串轉為 Unicode 碼的列表。
傳統寫法是這樣的:
symbols='@#$%^&'
codes=[]
for symbol in symbols:
codes.Append(ord(symbol))
運行結果:
INFO - codes -> [64, 35, 36, 37, 94, 38]
ord() 函數是 chr() 函數(對于8位的ASCII字符串)或 unichr() 函數(對于Unicode對象)的配對函數,它以一個字符(長度為1的字符串)作為參數,返回對應的 ASCII 數值,或者 Unicode 數值,如果所給的 Unicode 字符超出了 Python/ target=_blank class=infotextkey>Python 定義范圍,則會引發 TypeError 異常。
而列表推導的寫法是這樣的:
codes=[ord(symbol) for symbol in symbols]
這種寫法給人的第一印象是簡潔。
列表推導使用原則:只用列表推導來創建新的列表,并且盡量保持簡潔。如果列表推導的代碼超過了兩行,那么我們就要考慮使用 for 循環來重構代碼。
2 局部作用域
在 Python3 中,表達式內部的變量和賦值只在局部起作用,即具有局部作用域。因此與外層的同名變量互不影響。
x='ABC'
dummy=[ord(x) for x in x]
logging.info('x -> %s',x)
logging.info('dummy -> %s',dummy)
運行結果:
INFO - x -> ABC
INFO - dummy -> [65, 66, 67]
3 比較列表推導和 map/filter 組合
3.1 filter()
Python 的 filter() 函數用于過濾序列,過濾掉不符合條件的元素,然后返回由符合條件元素組成的新列表。
語法為:
filter(function, iterable)
該函數接收兩個參數,第一個為函數,第二個為序列,序列的每個元素作為參數傳遞給函數進行判斷,然后返回 True 或 False,最后將返回 True 的元素放到新列表中。
3.2 map()
而 map() 會根據提供的函數對指定序列做映射。
第一個參數 function 以參數序列中的每一個元素調用 function 函數,返回包含每次調用 function 函數返回值的新列表。
3.3 比較
我們用一個示例來比較列表推導和 map/filter 組合在寫法上的區別。假設需要把一個字符串轉換為 ascii 碼數組,該數組需過濾掉碼值小于 38 的值。
map/filter 組合方式:
list(filter(lambda c:c>37,map(ord,symbols)))
列表推導方式:
[ord(s) for s in symbols if ord(s)>37]
對比發現,列表推導方式的可讀性更高。
4 計算笛卡兒積
笛卡爾乘積是指在數學中,兩個集合X和Y的笛卡爾積(Cartesian product),又稱直積,表示為X × Y,第一個對象是X的成員而第二個對象是Y的所有可能有序對的其中一個成員。
Luciano Ramalho 舉了一個撲克牌的例子,來說明什么是笛卡爾乘積。含有 4 種花色和 3 種牌面的列表的笛卡兒積,結果是一個包含 12 個元素的列表。
假設有 3 種不同尺寸(S、M、L)的 T 恤衫,每個尺寸都有 2 個顏色(黑色或白色),尺寸與顏色的笛卡爾積就會得到 6 種組合。
colors=['black','white']
sizes=['S','M','L']
# 先顏色再尺碼
tshirts=[(color,size) for color in colors for size in sizes]
logging.info('tshirts -> %s',tshirts)
# 先尺碼再顏色
tshirts=[(color,size) for size in sizes for color in colors]
logging.info('tshirts -> %s',tshirts)
運行結果:
INFO - tshirts -> [('black', 'S'), ('black', 'M'), ('black', 'L'), ('white', 'S'), ('white', 'M'), ('white', 'L')]
INFO - tshirts -> [('black', 'S'), ('white', 'S'), ('black', 'M'), ('white', 'M'), ('black', 'L'), ('white', 'L')]
for color in colors for size in sizes 表示先按照顏色排序,然后再按照尺碼排序;而 for size in sizes for color in colors 則表示先按照尺碼排序,然后再按照顏色排序。
雙重迭代的順序,也會影響輸出結果:
for color in colors:
for size in sizes:
logging.info('(color,size) -> %s',(color,size))
logging.info('n')
for size in sizes:
for color in colors:
logging.info('(color,size) -> %s',(color,size))
運行結果:
INFO - (color,size) -> ('black', 'S')
INFO - (color,size) -> ('black', 'M')
INFO - (color,size) -> ('black', 'L')
INFO - (color,size) -> ('white', 'S')
INFO - (color,size) -> ('white', 'M')
INFO - (color,size) -> ('white', 'L')
INFO -
INFO - (color,size) -> ('black', 'S')
INFO - (color,size) -> ('white', 'S')
INFO - (color,size) -> ('black', 'M')
INFO - (color,size) -> ('white', 'M')
INFO - (color,size) -> ('black', 'L')
INFO - (color,size) -> ('white', 'L')
不知道發什么了剛好看到這個就發出來了,需要大廠資料的可以s信小編