標準的列表推導寫法:
>>> 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):
(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 使用的原則 只用列表推導來建立新的列表,並且盡量保持簡短,最好不超過兩行。列表推導 構建列表的快捷方式 生成器表示式 建立其他任何型別的序列。語法區別 前者是方括號 後者是圓括...