函數式編程:容許把函數自己做爲參數傳入另外一個函數,還容許返回一個函數!python
一個函數能夠接收另外一個函數做爲參數,這種函數稱之爲高階函數編程
abs(-10) 是函數調用 abs是函數自己 abs函數名實際上是一個變量名閉包
變量能夠指向函數,函數名也是變量名函數式編程
map()函數
map(func,seq)
函數接收兩個參數,一個是函數,一個是Iterable(可迭代對象,序列)
,map
將傳入的函數func()依次做用到序列seq的每一個元素,並把結果做爲新的Iterator(迭代器)
返回,以後可轉爲lis或其餘類型t輸出。spa
1 #!/usr/bin/python3 2 3 def f(x): 4 return x*x 5 6 r = map(f, [ 1, 2, 3, 4, 5, 6 ]) 7 print(list(r)) 8 #因爲結果r是Iterator(惰性序列),所以經過list()函數計算整個序列
reduce()3d
reduce(func,seq)
把一個函數做用在一個序列[x1, x2, x3, ...]
上,這個函數必須接收兩個參數,reduce()
把結果繼續和序列的下一個元素作累積計算,日誌
意即一次取序列兩個元素放到函數,函數結果和下一個函數結果(取下兩個元素放到函數獲得的函數結果)相加,依次類推。code
1 #!/usr/bin/python3 2 from functools import reduce 3 4 def f(x,y): 5 return x+y 6 7 r = reduce(f, [ 1, 2, 3, 4, 5, 6 ]) 8 print(r)
filter()對象
filter(func,seq)
函數用於過濾序列,調用一個布爾函數func()來迭代遍歷每一個seq中的元素,返回一個使func返回值爲True的元素的序列
和map()
相似,filter()
也接收一個函數和一個序列。和map()
不一樣的是,filter()
把傳入的函數依次做用於每一個元素,而後根據返回值是True
仍是False
決定保留仍是丟棄該元素。
篩選迴文 回數是指從左向右讀和從右向左讀都是同樣的數
1 #!/usr/bin/python3 2 3 def is_palindrone(n): 4 return str(n) == str(n)[::-1] #[::-1]是倒切 從右往左 5 6 print( list( filter( is_palindrone, range(11,200) ) ) )
sorted()
排序的核心是比較兩個元素的大小。若是是數字,咱們能夠直接比較,但若是是字符串或者兩個dict呢?直接比較數學上的大小是沒有意義的,所以,比較的過程必須經過函數抽象出來。
sorted(seq,key=func)
函數也是一個高階函數,它能夠接收一個key
函數來實現自定義的排序,例如按絕對值大小排序
不是同一種類型數據相比較,key決定比較大小的標準:
匿名函數與lambda
lambda表達式返回可調用的函數對象
1 def add(x,y):return x+y 2 sum1 = add(2,3) 3 #等價於 4 add = lambda x,y:x+y 5 add(2,3)
Python簡單的句法限制了lambda函數的定義體只能使用純表達式。即不能賦值,也不能使用while和try等Python語句
除了做爲參數傳給高階函數以外,Python不多使用匿名函數
把函數做爲結果返回
1 #!/usr/bin/python3 2 3 def lazy_sum(*args): 4 def sum(): 5 #閉包 sum能夠引用外部函數lazy_sum的參數和局部變量 6 ax = 0 7 for n in args: 8 ax = ax+n 9 return ax 10 return sum 11 12 f = lazy_sum(1, 3, 5, 7, 9) #不須要當即求和,而是在後面的代碼中根據須要計算 13 #返回的函數並無馬上執行,而是直到調用了f()才執行 14 print(f())
返回值與函數類型
返回的對象數目 Python實際返回的對象類型
0 None
1 object
>1 tuple
不修改原函數的定義,在代碼運行期間動態增長功能的方式(如在調用先後自動打印日誌,但又不修改函數的定義),稱之爲「裝飾器」(Decorator),裝飾器就是函數,藉助@調用。
1 #!/usr/bin/python3 2 3 def log(func): 4 def printInfo(*arge, **kw): #*不定長參數 **關鍵字參數 5 print('call %s()' % func.__name__) #在調用func以前打印一些信息 6 return func(*arge, **kw) 7 return printInfo 8 9 #log是一個裝飾器,接收函數返回函數,藉助@語法把裝飾器置於函數的定義外 10 @log #至關於執行了 now = log(now) 11 def now(): 12 print('2019-4-20') 13 14 #如今同名now()指向了新的函數,調用now()返log()中的printInfo()函數 15 print(now())
當函數參數過多,需簡化時,使用 functools.partial() 能夠建立一個新的函數,這個函數能夠固定住原函數的部分參數
1 #!/usr/bin/python3 2 import functools 3 4 int2 = functools.partial(int, base = 2) 5 print(int2('1000000')) #如今只需傳一個序列, 不需傳指定的進制