說說在 Python 中如何使用列表推導

2021-10-09 09:14:59 字數 3730 閱讀 6470

luciano ramalho 舉了這樣乙個示例,把乙個字串轉為 unicode 碼的列表。

傳統寫法是這樣的:

symbols='@#$%^&'

codes=

for symbol in symbols:

執行結果:

info - codes -> [64, 35, 36, 37, 94, 38]
ord() 函式是 chr() 函式(對於8位的ascii字串)或 unichr() 函式(對於unicode物件)的配對函式,它以乙個字元(長度為1的字串)作為引數,返回對應的 ascii 數值,或者 unicode 數值,如果所給的 unicode 字元超出了 python 定義範圍,則會引發 typeerror 異常。

而列表推導的寫法是這樣的:

codes=[ord(symbol) for symbol in symbols]
這種寫法給人的第一印象是簡潔。

列表推導使用原則:只用列表推導來建立新的列表,並且盡量保持簡潔。如果列表推導的**超過了兩行,那麼我們就要考慮使用 for 迴圈來重構**。

在 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]

python 的 filter() 函式用於過濾序列,過濾掉不符合條件的元素,然後返回由符合條件元素組成的新列表。

語法為:

filter(function, iterable)
該函式接收兩個引數,第乙個為函式,第二個為序列,序列的每個元素作為引數傳遞給函式進行判斷,然後返回 true 或 false,最後將返回 true 的元素放到新列表中。

而 map() 會根據提供的函式對指定序列做對映。

第乙個引數 function 以引數序列中的每乙個元素呼叫 function 函式,返回包含每次呼叫 function 函式返回值的新列表。

我們用乙個示例來比較列表推導和 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]
對比發現,列表推導方式的可讀性更高。

笛卡爾乘積是指在數學中,兩個集合x和y的笛卡爾積(cartesian product),又稱直積,表示為x × y,第乙個物件是x的成員而第二個物件是y的所有可能有序對的其中乙個成員。

luciano ramalho 舉了乙個撲克牌的例子,來說明什麼是笛卡爾乘積。含有 4 種花色和 3 種牌面的列表的笛卡兒積,結果是乙個包含 12 個元素的列表。

如果大家對於學習python有任何問題,學習方法,學習路線,如何學習有效率的問題,可以隨時來諮詢我,或者缺少系統學習資料的,我做這行年頭比較久,自認為還是比較有經驗的,可以幫助大家提出建設性建議,這是我的python交流qun:785128166,有任何問題可以隨時來諮詢我。

假設有 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')

說說在 Python 中如何向函式傳參

位置實參指的是,實參的順序與形參相同。def to read book name,book type 想讀的書 print 我想讀 book name 咯 print 它屬於 book type 領域 to read 現代藝術150年 乙個未完成的故事 藝術 執行結果 我想讀 現代藝術150年 乙個...

說說在 Canvas 中如何新增陰影

canvas 的 context 中有四個引數可以用於設定陰影相關屬性。方法名說明 shadowoffsetx 陰影 x 軸偏移量。可以為正值或負值 負值表示在左側和上方建立陰影,正值表示在底部和右側建立陰影。shadowoffsety 陰影 y 軸偏移量。其它特性與陰影 x 軸偏移量相同。shad...

說說在 Python 中如何處理檔案系統路徑

在 windows 作業系統中,檔案路徑以倒斜槓作為資料夾之間的分隔符。但在 osx 和 linux 上,使用的則是正斜槓作為路徑分隔符。如果希望讓程式適配所有作業系統,就會用到 os.path.join 函式。import os path os.path.join usr local sbin p...