2018年4月14日筆記
阿新 • • 發佈:2018-04-16
生成 gen ever yield com 分享 高階函數 iter tor
- 函數關鍵字
def 函數聲明
return 返回值
pass 略過,啥也不幹
exit(1) 直接退出
- 高階函數:可接收另一個函數作為參數的函數
常用的高階函數有:
- map()
- reduce()
- filter()
- sorted() -> 最常用
- map()函數:接收兩個參數,一個是函數,一個是
Iterable
,map
將傳入的函數依次作用到序列的每個元素,並把結果作為新的Iterator
返回
例1:我們有一個函數f(x)=x2,要把這個函數作用在一個list [1, 2, 3, 4]
上,就可以用map()
實現如下:
- reduce()函數:把一個函數作用在一個序列
[x1, x2, x3, ...]
reduce
把結果繼續和序列的下一個元素做累積計算,其效果就是:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
例2:寫一個將字符串轉化為整數的函數,即實現內置int()函數的功能
也可使用lambda簡化為:
- filter()函數:接收一個函數f和一個list,這個函數f的作用是對每個元素進行判斷,返回true或false,filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件的元素組成的list
例3:將一個列表中的奇數過濾出來
- sorted()函數:對所有可叠代的對象進行排序操作
sorted 語法:
sorted(iterable[, cmp[, key[, reverse]]])
參數說明:
- iterable -- 可叠代對象。
- cmp -- 比較的函數,這個具有兩個參數,參數的值都是從可叠代對象中取出,此函數必須遵守的規則為,大於則返回1,小於則返回-1,等於則返回0。
- key -- 主要是用來進行比較的元素,只有一個參數,具體的函數的參數就是取自於可叠代對象中,指定可叠代對象中的一個元素來進行排序。
- reverse -- 排序規則,reverse = True 降序 , reverse = False 升序(默認)。
例4:對列表和字典進行排序
- 列表生成式
格式為:[exp for val in collection if condition]
例如,list = [x for x in range(1,10) if x%2==0]
- 生成器
- 方法一: (exp for val in collection if condition)
- 方法二:使用yield關鍵字,包含yield語句的函數會被特定的編譯成生成器。yield可以理解為return,但並不退出,只是掛起,恢復時從yield下面開始執行。
通過列表生成式,我們可以直接創建一個列表。但是,受到內存限制,列表容量肯定是有限的。而且,創建一個包含100萬個元素的列表,不僅占用很大的存儲空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。
所以,如果列表元素可以按照某種算法推算出來,那我們是否可以在循環的過程中不斷推算出後續的元素呢?這樣就不必創建完整的list,從而節省大量的空間。在Python中,這種一邊循環一邊計算的機制,稱為生成器(Generator)。
通過next()
函數獲得generator的下一個返回值
例:著名的斐波拉契數列(Fibonacci),除第一個和第二個數外,任意一個數都可由前兩個數相加得到:
1, 1, 2, 3, 5, 8, 13, 21, 34, ...
斐波拉契數列用列表生成式寫不出來,但可以用生成器寫出來,如下:
2018年4月14日筆記