您好,登錄后才能下訂單哦!
這篇文章主要介紹了python使用列表推導式的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
使用列表推導式
一個列表推導式包含以下幾個部分:
一個輸入序列
一個表示輸入序列成員的變量
一個可選的斷言表達式
一個將輸入序列中滿足斷言表達式的成員變換成輸出列表成員的輸出表達式
num = [1, 4, -5, 10, -7, 2, 3, -1] filtered_and_squared = []for number in num: if number > 0: filtered_and_squared.append(number ** 2) print filtered_and_squared# [1, 16, 100, 4, 9]
而如果使用filter、lambda和map函數,則能夠將代碼大大簡化:
num = [1, 4, -5, 10, -7, 2, 3, -1] filtered_and_squared = map(lambda x: x ** 2, filter(lambda x: x > 0, num))print filtered_and_squared # [1, 16, 100, 4, 9] ## 更簡化的一種寫法 num = [1, 4, -5, 10, -7, 2, 3, -1] filtered_and_squared = [ x**2 for x in num if x > 0]print filtered_and_squared # [1, 16, 100, 4, 9]
列表推導也可能會有一些負面效應,那就是整個列表必須一次性加載于內存之中,這對上面舉的例子而言不是問題,甚至擴大若干倍之后也都不是問題。但是總會達到極限,內存總會被用完。
針對上面的問題,生成器(Generator)能夠很好的解決。生成器表達式不會一次將整個列表加載到內存之中,而是生成一個生成器對象(Generator objector),所以一次只加載一個列表元素。
生成器表達式同列表推導式有著幾乎相同的語法結構,區別在于生成器表達式是被圓括號包圍,而不是方括號:
num = [1, 4, -5, 10, -7, 2, 3, -1] filtered_and_squared = ( x**2 for x in num if x > 0 ) print filtered_and_squared# <generator object <genexpr> at 0x00583E18>for item in filtered_and_squared: print item# 1, 16, 100 4,9
這比列表推導效率稍微提高一些,讓我們再一次改造一下代碼:
num = [1, 4, -5, 10, -7, 2, 3, -1]def square_generator(optional_parameter): return (x ** 2 for x in num if x > optional_parameter)print square_generator(0)# <generator object <genexpr> at 0x004E6418># Option Ifor k in square_generator(0): print k# 1, 16, 100, 4, 9# Option IIg = list(square_generator(0))print g# [1, 16, 100, 4, 9]
除非特殊的原因,應該經常在代碼中使用生成器表達式。但除非是面對非常大的列表,否則是不會看出明顯區別的。 再來看一個通過兩階列表推導式遍歷目錄的例子:
import os def tree(top): for path, names, fnames in os.walk(top): for fname in fnames: yield os.path.join(path, fname)for name in tree('C:\Users\XXX\Downloads\Test'): print name
感謝你能夠認真閱讀完這篇文章,希望小編分享的“python使用列表推導式的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。