成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python騷操作從列表推導和生成器表達式開始

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

 [[379605]]

本文轉載自微信公眾號「PythonMind」,作者dongfanger 。轉載本文請聯系PythonMind公眾號。  

序列

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

容器序列與扁平序列

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

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

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

不可變序列與可變序列

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

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

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

列表推導

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

  1. symbols = "abc" 
  2. codes = [] 
  3. for symbol in symbols: 
  4.     codes.append(symbol) 
  5. print(codes)  # ["a""b""c"

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

  1. symbols = "abc" 
  2. codes = [symbol for symbol in symbols] 

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

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

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

  1. colors = ["black""white"
  2. sizes = ["S""M""L"
  3. tshirts = [(color, sizefor color in colors for size in sizes] 

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

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

  1. for color in colors: 
  2.     for size in sizes: 

運行結果是:

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

如果換一下順序:

  1. [(color, sizefor color in colors for size in sizes] 

等價于:

  1. for size in sizes: 
  2.     for color in colors: 

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

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

生成器表達式

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

  1. symbols = "abc" 
  2. codes = (symbol for symbol in symbols) 

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

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

  1. colors = ["black""white"
  2. sizes = ["S""M""L"
  3. tshirts = ((color, sizefor color in colors for size in sizes) 

運行結果是:

  1. <generator object <genexpr> at 0x000001FD57D2DB30> 

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

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

  1. for tshirt in tshirts: 
  2.     print(tshirt) 
  1. ('black''S'
  2. ('white''S'
  3. ('black''M'
  4. ('white''M'
  5. ('black''L'
  6. ('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循環的開銷。

小結

本文首先介紹了序列的概念,然后演示了Python常規騷操作——列表推導,最后引出了生成器表達式這個看似復雜實則簡單的語法。列表是可變的,它有個不可變的孿生兄弟,元組。

 

責任編輯:武曉燕 來源: PythonMind
相關推薦

2025-01-20 09:02:00

列表推導生成器表達式Python

2024-09-25 14:16:35

2022-10-27 13:58:32

Python編程生成器

2024-05-10 14:46:27

Pythonfor循環

2011-03-14 14:02:55

Python

2021-08-11 20:20:51

Python異步列表

2009-08-24 16:12:21

正則表達式操作符

2017-09-06 09:26:03

Python生成器協程

2021-12-04 22:07:44

Python

2024-11-01 15:51:06

2019-05-13 14:20:19

正則表達式JavaScript前端

2018-09-27 15:25:08

正則表達式前端

2014-01-05 17:41:09

PostgreSQL表達式

2020-04-03 13:43:23

Python列表推導式字典推導式

2017-12-07 14:23:55

前端Javascript正則表達式

2023-11-15 13:35:00

迭代器生成器Python

2024-02-23 18:32:17

2023-03-01 00:07:32

JavaScript迭代器生成器

2011-12-23 13:42:05

JavaScript

2010-09-07 16:31:17

SQL語句insert
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲福利一区二区 | 成年网站在线观看 | 午夜久久久| 日韩综合在线视频 | 欧美精品日韩精品国产精品 | 欧美一区二区三区在线观看视频 | 久久亚洲视频网 | 91久久网站| 午夜视频在线免费观看 | 大象一区| 久久精品成人热国产成 | 日韩一区二区三区在线观看视频 | 欧美 日韩 亚洲91麻豆精品 | 久久久久久久久国产精品 | 色综合久久伊人 | 欧美日韩福利视频 | 久久国产高清 | 日韩av电影在线观看 | 羞羞网站免费观看 | 欧美亚洲在线 | 久久伊人精品一区二区三区 | 视频一区二区三区中文字幕 | 国产精品五月天 | 国产精品美女久久久久aⅴ国产馆 | 91亚洲欧美 | 紧缚调教一区二区三区视频 | 日韩毛片在线观看 | 中文字幕精品一区 | 成人精品福利 | 中文字幕第二十页 | 91久久综合亚洲鲁鲁五月天 | 91pao对白在线播放 | 黄色片免费在线观看 | 黄视频在线网站 | 色吧久久 | 视频一区在线 | 国产日韩欧美一区二区 | 久久机热 | 在线国产一区 | 亚洲午夜精品久久久久久app | 亚洲视频免费播放 |