中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

列表推導和生成器表達式怎么在python中使用

發布時間:2021-02-03 12:16:50 來源:億速云 閱讀:132 作者:Leah 欄目:開發技術

列表推導和生成器表達式怎么在python中使用?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

序列

序列是指一組數據,按存放類型分為容器序列與扁平序列,按能否被修改分為不可變序列與可變序列。

容器序列與扁平序列

容器序列存放的是對象的引用,包括list、tuple、collections.deque。

扁平序列存放的是對象的值,包括str、bytes、bytearray、memoryview和array.array。

扁平序列的值是字符、字節和數值這種基礎類型。

不可變序列與可變序列

不可變序列,包括tuple、str、bytes。

可變序列,包括list、bytearray、array.array、collection.deque、memoryview。

下圖左邊是父類,右邊是子類,可以看出可變序列是從不可變序列繼承來的,擴展了可變方法:

列表推導和生成器表達式怎么在python中使用

列表推導

Python語言魅力在于簡潔,這能從最常見的創建列表體現出來,比如我們想把字符串"abc"轉換成新列表["a", "b", "c"],常規寫法:

symbols = "abc"
codes = []
for symbol in symbols:
 codes.append(symbol)
print(codes) # ["a", "b", "c"]

用到了for循環和列表append方法。實際上可以不用append方法,直接:

symbols = "abc"
codes = [symbol for symbol in symbols]

這叫做列表推導,是更加Pythonic的寫法。

無論是編寫效率還是可閱讀性,列表推導都更勝一籌,可以說是構建列表的快捷方式。但是不能濫用,通用原則是,如果列表推導的代碼超過了兩行,就要考慮用append了。這不是規定,完全可以憑借自我喜好來選擇。

笛卡爾積是指多個序列中元素所有組合,我們用列表推導來實現笛卡爾積:

colors = ["black", "white"]
sizes = ["S", "M", "L"]
tshirts = [(color, size) for color in colors for size in sizes]

一行代碼搞定!Life is short,use Python,list comprehension is wonderful,amazing。

注意這行代碼有兩個for循環,等價于:

for color in colors:
 for size in sizes:

運行結果是:

[('black', 'S'), ('black', 'M'), ('black', 'L'), ('white', 'S'), ('white', 'M'), ('white', 'L')]

如果換一下順序:

[(color, size) for color in colors for size in sizes]

等價于:

for size in sizes:
 for color in colors:

運行結果是不同的,觀察第2個元素:

[('black', 'S'), ('white', 'S'), ('black', 'M'), ('white', 'M'), ('black', 'L'), ('white', 'L')]

生成器表達式

一般接觸到生成器時,都要講yield關鍵字,看似有點復雜,然而卻很簡單,生成器就像列表推導一樣,只不過是用來生成其他類型序列的,比如元組:

symbols = "abc"
codes = (symbol for symbol in symbols)

它的語法非常簡單,把列表推導的中括號[]換成小括號(),就可以了。

語法相似,本質上卻有很大區別,我們試著用生成器表達式來實現笛卡爾積,看看會有什么變化:

colors = ["black", "white"]
sizes = ["S", "M", "L"]
tshirts = ((color, size) for color in colors for size in sizes)

運行結果是:

<generator object <genexpr> at 0x000001FD57D2DB30>

generator object,結果是一個生成器對象。因為生成器表達式在每次迭代時才會逐個產出元素,所以這里的結果并不是已經創建好的元組。列表推導才會一次性產生新列表所有元素。

通過迭代把生成器表達式結果輸出:

for tshirt in tshirts:
 print(tshirt)
('black', 'S')
('white', 'S')
('black', 'M')
('white', 'M')
('black', 'L')
('white', 'L')

生成器表達式可以提升程序性能,比如要計算兩個各有1000個元素的列表的笛卡爾積,生成器表達式可以幫忙省掉運行for循環的開銷,即一個包含100萬個元素的列表。

yield作用和return差不多,后面會講到。

Tips

本小節內容是我看《流暢的Python》第一遍時記錄的知識點:

  1. Python標準庫用C實現了豐富的序列類型。

  2. 列表推導,就是指a = [x for x in something]這種寫法。

  3. 生成器表達式用于生成列表外的其他類型的序列,它跟列表推導的區別僅僅在于方括號換成圓括號,如b = tuple(x for x in something)

  4. array.array('I', x for x in something) ,array構造方法的第一個參數指定了數組中數字的存儲方式。

  5. for tshirt in [c, s for c in colors for s in sizes],列表推導會一次性生成這個列表,存儲在內存中,占用資源。for tshirt in ('%s %s' for c in colors for s in sizes),生成器表達式只在循環時逐個產出元素,避免額外的內存占用,省掉了運行for循環的開銷。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鄂伦春自治旗| 缙云县| 华容县| 邯郸市| 巢湖市| 庆安县| 秀山| 临潭县| 泗阳县| 葵青区| 柘荣县| 鄂温| 宁武县| 定安县| 调兵山市| 上蔡县| 中山市| 赤水市| 新龙县| 兴海县| 镇安县| 同仁县| 达州市| 汕头市| 蓬莱市| 周口市| 巴林左旗| 原平市| 太白县| 马关县| 寻乌县| 鄂伦春自治旗| 衢州市| 阿拉善右旗| 曲麻莱县| 庆云县| 汾西县| 资兴市| 甘德县| 平湖市| 九龙坡区|