廖雪峰python摘錄4
1、直接作用於for
循環的對象統稱為可叠代對象:Iterable。 可以被
next()
函數調用並不斷返回下一個值的對象稱為叠代器:Iterator
。
2、生成器都是Iterator
對象,但list
、dict
、str
雖然是Iterable
,卻不是Iterator
。
把list
、dict
、str
等Iterable
變成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()
函數接收兩個參數,一個是函數,一個是Iterable
,map
將傳入的函數依次作用到序列的每個元素,並把結果作為新的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
是一個Iterator
,Iterator
是惰性序列,因此通過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