python列表解析和生成表達式淺要說明

  本章內容含有 列表解析和 生成表達式

在看下面的之前 我先說下 python的 核心 價值觀、

◇優雅

◇清晰

◇務實

這樣會讓你更好理解下面要說的內容。

列表解析:如果想通過操作和處理一個序列來創建一個新的列表時,可以使用列表解析和生成表達式。當我們 對一個序列 進行一種 處理的時候,最終還要 用到一個列表,這個時候就會用到列表表達式。

生成表達式有時簡單的生成器可以用簡潔的方式調用,就像不帶中括號的鏈表推導式。這些表達式是爲函數調用生成器而設計的。生成器表達式比完整的生成器定義更簡潔,但是沒有那麼多變,而且通常比等價的鏈表推導式更容易記。官方手冊9.10 位置

 

 

 

1.     列表解析

列表解析的定義(List comprehensions)

 

我們從一道 數學題來開啓此次思路

如果我們列出小於10,並且是3或5的倍數的所有自然數,

它們是3、5、6、9,計算它們的和是3+5+6+9=23。

 

現找出小於1000並且是3或5的倍數的所有自然數計算出

它們的和。


普通解決方案1

blob.png運算結果

運行看起來沒什麼問題-下面介紹下列表解析,你就會發現新世界的大門哦~

補充知識點sum函數,給它一個列表 就可以自動求和。

 

 

列表解析表達式爲:

[expr for iter_var in iterable]

表達式  for循環 -迭代從後的序列當中 -進行迭代,-取到的值 -進行前面的運算

舉個例子


blob.png效果很明顯 先從後面遍歷取值,*以前面的值。生成新的列表。

 

[expr for iter_var in iterable]

序列當中for循環 -進行迭代變量 -進行判斷 -滿足這個條件 -在到前面進行運算

舉個例子

blob.png發現沒有 i取值後 必須先執行 if 判斷 小於5,纔會執行到前面的運算。所以小於5的會執行運算*10。

 

列表解析 --方案2

blob.png 

這就是用列表解析 生成一個效果.是不是比普通寫起來更加 優雅 ~~通過一行代碼解決了問題。

小提示:當我們 對一個序列 進行一種 處理的時候最終還要 用到一個列表,這個時候就會用到列表 表達式,其它環境下用不到。


看起來代碼少了一點,下面我們探究下 效率高不高

blob.png我運行了以上代碼,後面計算1億裏面取值時,頓挫感很強。注意第一行的程序,當執行1-10的送代時候,會返回一個列表。當1個億的時候,在它求和之前,會把列表全部列出來,進行求模元素,滿足這個條件,就會生成一共大列表。在內存當中就會生成一段時間,會影響運算速度,佔用內存空間。

現在有了有列表解析了,代碼簡介了,可是它的效力並不高,產生這麼多無用的列表。

我不打印 ,也會在內存中產生,佔用大量內存空間。

所以這個時候就要倫到二號角色上場了。

 

 

 

2.生成器表達式

(expr for iter_var in iterable)

(expr for iter_var in iterable if cond_expr)

形式上來看 ,和列表解析唯一的區別就是把列表的方括號 變成了元組的圓括號

 

▲舉個生成器例子

blob.png只需要改括號就可以

Po一張 鄒老師的課程的圖 生成器表達器的解釋和特點

blob.png

 

這裏面有個概念是 生成器是爲 惰性運算,這個翻譯會成不同意思,這裏我們就叫做生成器表達式。

列表比較長的情況下,我們都會用生成器表達式,會有效的節省內存空間。


▲案例 1

blob.png生成的是 生成器 對象返回不是值

顯著特點 當有人 向它 索取值的時候,它纔會把這個值產生出來,所以稱之爲 惰性計算

返回的不是值,它就是一個生成器對象。


案例 2

blob.png

當有方法 用到值的的時候,纔會用到。和列表解析的最大區別,不會上來生成大量列表

生成器表達式 概念 = 惰性計算

惰性計算 不會無故一下生產 3-5-6-9這幾個值,而是會變成一個整體對象。

---generator-生成器 - expression-表達式

有人取值了 取 3 給3 -取 5 給5 -取6給6-取9給9。在取就沒有了.在列表比較長的時候會用到生成器表達式,有效節省內存空間。內存上更加優越!

 

 

知道了列表解析 和生成表達式的時候,會覺得很方便,很便捷,但是不建議一直用!

下面po一張鄒老師的建議

blob.png

 可能你獲得是別人二次處理的知識,你也可以去官網查官方手冊


本章獲得知識點:

列表解析的使用,和含義

生成表達式的使用,和含義

希望我理解能對你有幫助。     

                          

                                                                                          2017年12月15日 王宇林

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章