1. 程式人生 > >廖雪峰python摘錄4

廖雪峰python摘錄4

生成 結果 api cnblogs fun 相關 cap object log

1、直接作用於for循環的對象統稱為可叠代對象:Iterable。 可以被next()函數調用並不斷返回下一個值的對象稱為叠代器:Iterator

2、生成器都是Iterator對象,但listdictstr雖然是Iterable,卻不是Iterator

listdictstrIterable變成Iterator可以使用iter()函數

3、因為Python的Iterator對象表示的是一個數據流,Iterator對象可以被next()函數調用並不斷返回下一個數據,直到沒有數據時拋出StopIteration錯誤。可以把這個數據流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()

函數實現按需計算下一個數據,所以Iterator的計算是惰性的,只有在需要返回下一個數據時它才會計算。

4、我們通過把大段代碼拆成函數,通過一層一層的函數調用,就可以把復雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程序設計。函數就是面向過程的程序設計的基本單元。

5、函數式編程的一個特點就是,允許把函數本身作為參數傳入另一個函數,還允許返回一個函數!

Python對函數式編程提供部分支持。由於Python允許使用變量,因此,Python不是純函數式編程語言。

6、高階函數英文叫Higher-order function。

(1)變量可以指向函數 1 >>> f = abs
2 >>> f(-10) 3 10
說明變量f現在已經指向了abs函數本身。直接調用abs()函數和調用變量f()完全相同

(2)把abs指向10後,就無法通過abs(-10)調用該函數了!因為abs這個變量已經不指向求絕對值函數而是指向一個整數10

1 >>> abs = 10
2 >>> abs(-10)
3 Traceback (most recent call last):
4   File "<stdin>", line 1, in <module>
5 TypeError: int object is not callable

7、我們先看map。map()函數接收兩個參數,一個是函數,一個是Iterablemap將傳入的函數依次作用到序列的每個元素,並把結果作為新的Iterator返回。

8、reduce()函數也是Python內置的一個高階函數。

reduce()函數接收的參數和 map()類似,一個函數 f,一個list,但行為和 map()不同,reduce()傳入的函數 f 必須接收兩個參數,reduce()對list的每個元素反復調用函數f,並返回最終結果值。再看reduce的用法。reduce把一個函數作用在一個序列[x1, x2, x3, ...]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算

9、

1 >>> from functools import reduce
2 >>> def fn(x, y):
3 ...     return x * 10 + y
4 ...
5 >>> def char2num(s):
6 ...     return {‘0‘: 0, ‘1‘: 1, ‘2‘: 2, ‘3‘: 3, ‘4‘: 4, ‘5‘: 5, ‘6‘: 6, ‘7‘: 7, ‘8‘: 8, ‘9‘: 9}[s]
7 ...
8 >>> reduce(fn, map(char2num, ‘13579‘))
9 13579

裏面的char2num()依次把輸入的單個str‘1’轉換成1

10(例題)、利用map()函數,把用戶輸入的不規範的英文名字,變為首字母大寫,其他小寫的規範名字。輸入:[‘adam‘, ‘LISA‘, ‘barT‘],輸出:[‘Adam‘, ‘Lisa‘, ‘Bart‘]

list(map(lambda x:x.capitalize(),[‘mike‘,‘jack‘]))

map()傳入的第一個參數是f,即函數對象本身。由於結果r是一個IteratorIterator是惰性序列,因此通過list()函數讓它把整個序列都計算出來並返回一個list。

感覺lambda運用更廣,不但abs(),而且x.capitalize()

11、和map()類似,filter()也接收一個函數和一個序列。和map()不同的是,filter()把傳入的函數依次作用於每個元素,然後根據返回值是True還是False決定保留還是丟棄該元素。

12、此外,sorted()函數也是一個高階函數,它還可以接收一個key函數來實現自定義的排序,例如按絕對值大小排序

13、高階函數除了可以接受函數作為參數外,還可以把函數作為結果值返回。

14、我們在函數lazy_sum中又定義了函數sum,並且,內部函數sum可以引用外部函數lazy_sum的參數和局部變量,當lazy_sum返回函數sum時,相關參數和變量都保存在返回的函數中,這種稱為“閉包(Closure)”的程序結構擁有極大的威力。 返回一個函數時,牢記該函數並未執行,返回函數中不要引用任何可能會變化的變量。

廖雪峰python摘錄4