2 2 列表推導和生成器表示式

2022-05-21 17:48:12 字數 2305 閱讀 2384

標準的列表推導寫法:

>>> symbols = '

$¢£¥€¤

' >>> codes = [ord(symbol) for symbol in

symbols]

>>>codes

[36, 162, 163, 165, 8364, 164]

通常的原則是,只用列表推導來建立新的列表,並且盡量保持簡短。如果列表推導的**超過了兩行,你可能就要考慮是不是得用 for 迴圈重寫了。就跟寫文章一樣,並沒有什麼硬性的規則,這個度得你自己把握。

>>> symbols = '

$¢£¥€¤

' >>> beyond_ascii = [ord(s) for s in symbols if ord(s) > 127]

>>>beyond_ascii

[162, 163, 165, 8364, 164]

>>> beyond_ascii = list(filter(lambda c: c > 127, map(ord, symbols)))

>>>beyond_ascii

[162, 163, 165, 8364, 164]

雖然也可以用列表推導來初始化元組、陣列或其他序列型別,但是生成器表示式是更好的選擇。這是因為生成器表示式背後遵守了迭代器協議,可以逐個地產出元素,而不是先建立乙個完整的列表,然後再把這個列表傳遞到某個建構函式裡。前面那種方式顯然能夠節省記憶體。

生成器表示式的語法跟列表推導差不多,只不過把方括號換成圓括號而已。

>>> symbols = '

$¢£¥€¤

' >>> tuple(ord(symbol) for symbol in

symbols) ➊

(36, 162, 163, 165, 8364, 164)

>>> import

array

>>> array.array('

i', (ord(symbol) for symbol in

symbols)) ➋

array('i

', [36, 162, 163, 165, 8364, 164])

➊ 如果生成器表示式是乙個函式呼叫過程中的唯一引數,那麼不需要額外再用括號把它圍起來。

➋ array 的構造方法需要兩個引數,因此括號是必需的。array 構造方法的第乙個引數指定了陣列中數字的儲存方式

使用列表推導計算笛卡兒積:

>>> colors = ['

black

', '

white']

>>> sizes = ['

s', '

m', 'l'

] >>> tshirts = [(color, size) for color in colors for size in

sizes]

>>>tshirts [('

black

', '

s'), ('

black

', '

m'), ('

black

', '

l'), ('

white

', '

s'), ('

white

', '

m'), ('

white

', '

l')]

使用生成器表示式計算笛卡兒積:

>>> colors = ['

black

', '

white']

>>> sizes = ['

s', '

m', '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

兩種方法不同的是,用到生成器表示式之後,記憶體裡不會留下乙個有 6 個組合的 列表,因為生成器表示式會在每次 for 迴圈執行時才生成乙個組合。如果要計算兩個各有 1000 個元素的列表的笛卡兒積,生成器表示式就可以幫忙省掉執行 for 迴圈的開銷,即乙個含有 100 萬個元素的列表。

python 列表推導和生成器表示式

一 列表推導式 通常原則只用來建立新列表,並盡量保持簡短,如果列表 超過了兩行,就要考慮是不是得用for迴圈重寫了 例子1 1 建立新列表 new list i for i in range 10 print new list 執行結果 f virtualenvironment venv scrip...

列表推導式和生成器表示式

固定語法 i for i in a if 示例 獲取偶數 a 1,2,3,4 x for i in a if i 2 0 a x print a 2,4 使用列表推導式 a 1,2,3,4 a i for i in a if i 2 0 print a 2,4 列表推導式可以呼叫函式 a 1,2,3...

Python 列表推導 生成器表示式

str abc codes for s in str 列表推導 是不是更具可讀性?codes s for s in str 使用的原則 只用列表推導來建立新的列表,並且盡量保持簡短,最好不超過兩行。列表推導 構建列表的快捷方式 生成器表示式 建立其他任何型別的序列。語法區別 前者是方括號 後者是圓括...