本章內容含有 列表解析和 生成表達式
在看下面的之前 我先說下 python的 核心 價值觀、
◇優雅
◇清晰
◇務實
這樣會讓你更好理解下面要說的內容。
◆列表解析:如果想通過操作和處理一個序列來創建一個新的列表時,可以使用列表解析和生成表達式。當我們 對一個序列 進行一種 處理的時候,最終還要 用到一個列表,這個時候就會用到列表表達式。
◆生成表達式:有時簡單的生成器可以用簡潔的方式調用,就像不帶中括號的鏈表推導式。這些表達式是爲函數調用生成器而設計的。生成器表達式比完整的生成器定義更簡潔,但是沒有那麼多變,而且通常比等價的鏈表推導式更容易記。官方手冊9.10 位置
1. 列表解析
列表解析的定義(List comprehensions)
我們從一道 數學題來開啓此次思路
⒈ 如果我們列出小於10,並且是3或5的倍數的所有自然數,
它們是3、5、6、9,計算它們的和是3+5+6+9=23。
⒉ 現找出小於1000並且是3或5的倍數的所有自然數計算出
它們的和。
普通解決方案1
運算結果
運行看起來沒什麼問題-下面介紹下列表解析,你就會發現新世界的大門哦~
補充知識點sum函數,給它一個列表 就可以自動求和。
列表解析表達式爲:
[expr for iter_var in iterable]
表達式 for循環 -迭代從後的序列當中 -進行迭代,-取到的值 -進行前面的運算
▲舉個例子
效果很明顯 先從後面遍歷取值,*以前面的值。生成新的列表。
[expr for iter_var in iterable]
序列當中for循環 -進行迭代變量 -進行判斷 -滿足這個條件 -在到前面進行運算
▲舉個例子
發現沒有 i取值後 必須先執行 if 判斷 小於5,纔會執行到前面的運算。所以小於5的會執行運算*10。
列表解析 --方案2
這就是用列表解析 生成一個效果.是不是比普通寫起來更加 優雅 ~~通過一行代碼解決了問題。
小提示:當我們 對一個序列 進行一種 處理的時候,最終還要 用到一個列表,這個時候就會用到列表 表達式,其它環境下用不到。
看起來代碼少了一點,下面我們探究下 效率高不高
我運行了以上代碼,後面計算1億裏面取值時,頓挫感很強。注意第一行的程序,當執行1-10的送代時候,會返回一個列表。當1個億的時候,在它求和之前,會把列表全部列出來,進行求模元素,滿足這個條件,就會生成一共大列表。在內存當中就會生成一段時間,會影響運算速度,佔用內存空間。
現在有了有列表解析了,代碼簡介了,可是它的效力並不高,產生這麼多無用的列表。
我不打印 ,也會在內存中產生,佔用大量內存空間。
所以這個時候就要倫到二號角色上場了。
2.生成器表達式
(expr for iter_var in iterable)
(expr for iter_var in iterable if cond_expr)
從形式上來看 ,和列表解析唯一的區別就是把列表的方括號 變成了元組的圓括號
▲舉個生成器例子
只需要改括號就可以
Po一張 鄒老師的課程的圖 生成器表達器的解釋和特點
這裏面有個概念是 生成器是爲 惰性運算,這個翻譯會成不同意思,這裏我們就叫做生成器表達式。
在列表比較長的情況下,我們都會用生成器表達式,會有效的節省內存空間。
▲案例 1
生成的是 生成器 對象返回不是值
顯著特點 當有人 向它 索取值的時候,它纔會把這個值產生出來,所以稱之爲 惰性計算
返回的不是值,它就是一個生成器對象。
▲案例 2
當有方法 用到值的的時候,纔會用到。和列表解析的最大區別,不會上來生成大量列表
生成器表達式 概念 = 惰性計算
惰性計算 不會無故一下生產 3-5-6-9這幾個值,而是會變成一個整體對象。
---generator-生成器 - expression-表達式
有人取值了 取 3 給3 -取 5 給5 -取6給6-取9給9。在取就沒有了.在列表比較長的時候會用到生成器表達式,有效節省內存空間。內存上更加優越!
知道了列表解析 和生成表達式的時候,會覺得很方便,很便捷,但是不建議一直用!
下面po一張鄒老師的建議
可能你獲得是別人二次處理的知識,你也可以去官網查官方手冊。
本章獲得知識點:
列表解析的使用,和含義
生成表達式的使用,和含義
希望我理解能對你有幫助。
2017年12月15日 王宇林