摘要:高階函數(shù)、匿名函數(shù)、閉包高階函數(shù)函數(shù)可以賦給變量可以被其他函數(shù)調用可以從其他函數(shù)中返回一個函數(shù)#定義函數(shù)sum_1def sum_1(a, b): return a + b賦值給變量#賦值給變量testtest = sum_1#調用test(7, 8)15被其他函數(shù)調用#定
高階函數(shù)、匿名函數(shù)、閉包
高階函數(shù)
函數(shù)可以賦給變量
可以被其他函數(shù)調用
可以從其他函數(shù)中返回一個函數(shù)
#定義函數(shù)
sum_1def sum_1(a, b):
return a + b
賦值給變量
#賦值給變量
testtest = sum_1#調用test(7, 8)
15
被其他函數(shù)調用
#定義函數(shù)test2def
test2(func, arg1, arg2):
ret = func(arg1, arg2)
print(ret)
#函數(shù)test2調用函數(shù)
sum_1test2(sum_1, 7, 8)
15
返回一個函數(shù)
#定義可變參數(shù)求和函數(shù)
sum_2def sum_2(*args):
s = 0
for i in args:
s += i
return s
#定義一個返回求和函數(shù)的函數(shù)
sum_3def sum_3(*args):
def sum_2():
s = 0
for i in args:
s += i
return s
return sum_2
#調用sum_3,返回的是求和函數(shù)
sum_2f = sum_3()type(f)
function
f(1, 4, 5)
10
閉包
內部函數(shù)可以引用外部函數(shù)的參數(shù)和局部變量,當內部函數(shù)被返回時,相關參數(shù)和變量都保存在返回的函數(shù)中
外部函數(shù)第一次調用傳遞的局部變量,能被返回的新函數(shù)所引用
外部函數(shù)的主要作用是給內部函數(shù)提供運行環(huán)境
#定義函數(shù)test_3返回新函數(shù)y的x次方
def test_3(x):
def power(y):
return y ** x
return power
#調用test3生成新函數(shù)y ** 2
new_fun = test_3(2)type(new_fun)
function
新函數(shù)不斷的引用第一次傳遞給外層函數(shù)的變量
#調用新函數(shù)
new_fun(3)
4
new_fun(5)
25
匿名函數(shù)lambda
本身沒有名稱調用時賦予一個變量名
是一個表達式非語句、非代碼塊
不能出現(xiàn)非表達式語句
用途指定短小的回調函數(shù)
f = lambda x,y: x + yf(3, 4)
7
#定義列表list1元素為2個函數(shù)
list1 = [(lambda x:x*3), (lambda y:y*9)]
#遍歷列表給函數(shù)賦值
for i in list1:
print(i(5))
15
45
過濾器filter
為已知的序列,每個元素調用給定的布爾函數(shù)
返回值為真的元素將會被添加到一個列表中
#定義列表
list2 = [1, 33, 45, 13, 22]
#定義布爾函數(shù)
def test4(x):
if x > 20:
return True
else:
return False
list(filter(test4, list2))
[33, 45, 22]
映射器map
map()將函數(shù)調用映射到每個序列對應位置的元素上并返回一個含有所有返回值的列表
#把兩個列表不做處理構建成元組列表
def f1(x,y):
return (x,y)list3 = [1, 2, 3, 4, 5]list4 = ['a', 'b', 'c', 'd', 'e']list(map(f1, list3, list4))
[(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e')]
#處理
def f1(x,y):
return (x*2,y)list3 = [1, 2, 3, 4, 5]list4 = ['a', 'b', 'c', 'd', 'e']list(map(f1, list3, list4))
[(2, 'a'), (4, 'b'), (6, 'c'), (8, 'd'), (10, 'e')]
reduce 折疊
把一個函數(shù)作用在一個序列上,這個函數(shù)必須接收兩個參數(shù),reduce把結果繼續(xù)和序列的下一個元素做累積計算
#字符串轉換成數(shù)字
from functools import reducedef str2int1(s):
def fn(x, y):
return x * 10 + y
def char2num(s):
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
return reduce(fn, map(char2num, s))str2int1('999')
999
#字符串轉換成數(shù)字,匿名函數(shù)實現(xiàn) from functools import reducedef char2num(s): return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]def str2int(s): return reduce(lambda x, y: x * 10 + y, map(char2num, s))str2int('234')
234