高阶函数、匿名函数、闭包

高阶函数

  • 函数可以赋给变量

  • 可以被其他函数调用

  • 可以从其他函数中返回一个函数

#定义函数sum_1def sum_1(a, b):    return a + b
  • 赋值给变量

#赋值给变量testtest = sum_1#调用test(7, 8)
15
  • 被其他函数调用

#定义函数test2def test2(func, arg1, arg2):    ret = func(arg1, arg2)    print(ret)
#函数test2调用函数sum_1test2(sum_1, 7, 8)
15
  • 返回一个函数

#定义可变参数求和函数sum_2def sum_2(*args):    s = 0    for i in args:        s += i    return s
#定义一个返回求和函数的函数sum_3def sum_3(*args):    def sum_2():        s = 0        for i in args:            s += i        return s    return sum_2
#调用sum_3,返回的是求和函数sum_2f = sum_3()type(f)
function
f(1, 4, 5)
10

闭包

  • 内部函数可以引用外部函数的参数和局部变量,当内部函数被返回时,相关参数和变量都保存在返回的函数中

  • 外部函数第一次调用传递的局部变量,能被返回的新函数所引用

  • 外部函数的主要作用是给内部函数提供运行环境

#定义函数test_3返回新函数y的x次方def test_3(x):    def power(y):        return y ** x    return power
#调用test3生成新函数y ** 2new_fun = test_3(2)type(new_fun)
function
  • 新函数不断的引用第一次传递给外层函数的变量

#调用新函数new_fun(3)
4
new_fun(5)
25

匿名函数lambda

  • 本身没有名称调用时赋予一个变量名

  • 是一个表达式非语句、非代码块

  • 不能出现非表达式语句

  • 用途指定短小的回调函数

f = lambda x,y: x + yf(3, 4)
7
#定义列表list1元素为2个函数list1 = [(lambda x:x*3), (lambda y:y*9)]#遍历列表给函数赋值for i in list1:    print(i(5))
1545

过滤器filter

  • 为已知的序列,每个元素调用给定的布尔函数

  • 返回值为真的元素将会被添加到一个列表中

#定义列表list2 = [1, 33, 45, 13, 22]#定义布尔函数def test4(x):    if x > 20:        return True    else:        return False    list(filter(test4, list2))
[33, 45, 22]

映射器map

  • map()将函数调用映射到每个序列对应位置的元素上并返回一个含有所有返回值的列表

#把两个列表不做处理构建成元组列表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 折叠

  • 把一个函数作用在一个序列上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算

#字符串转换成数字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
#字符串转换成数字,匿名函数实现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