1. 程式人生 > >2018年4月14日筆記

2018年4月14日筆記

生成 gen ever yield com 分享 高階函數 iter tor

  • 函數關鍵字

def  函數聲明

return  返回值

pass  略過,啥也不幹

exit(1)  直接退出

  • 高階函數:可接收另一個函數作為參數的函數

常用的高階函數有:

  1. map()
  2. reduce()
  3. filter()
  4. sorted()  -> 最常用

  • map()函數:接收兩個參數,一個是函數,一個是Iterablemap將傳入的函數依次作用到序列的每個元素,並把結果作為新的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]

  • 生成器
  1. 方法一: (exp for val in collection if condition)
  2. 方法二:使用yield關鍵字,包含yield語句的函數會被特定的編譯成生成器。yield可以理解為return,但並不退出,只是掛起,恢復時從yield下面開始執行。

通過列表生成式,我們可以直接創建一個列表。但是,受到內存限制,列表容量肯定是有限的。而且,創建一個包含100萬個元素的列表,不僅占用很大的存儲空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。

所以,如果列表元素可以按照某種算法推算出來,那我們是否可以在循環的過程中不斷推算出後續的元素呢?這樣就不必創建完整的list,從而節省大量的空間。在Python中,這種一邊循環一邊計算的機制,稱為生成器(Generator)。

通過next()函數獲得generator的下一個返回值

例:著名的斐波拉契數列(Fibonacci),除第一個和第二個數外,任意一個數都可由前兩個數相加得到:

1, 1, 2, 3, 5, 8, 13, 21, 34, ...

斐波拉契數列用列表生成式寫不出來,但可以用生成器寫出來,如下:

技術分享圖片

2018年4月14日筆記