所谓高阶函数, 就是一个函数是另一个函数的参数或者返回值
函数作为参数
高阶函数示例1
# 高阶函数可以让编程获得很大的灵活性
# 传入不同的func, do可以执行不同的逻辑
def do(func, x, y):
return func(x, y)
do(lambda x, y: x - y, 10, 20)
do(lambda x, y: x + y, 10, 20)
高阶函数示例2
# 内置函数max可以获得列表中值最大的一项
lists = [1, 2, 3, 4]
max(lists)
# 如果lists中每一项包含多个值,比如是一个字典或者元组
# 比较方式就需要指定
lists = [("a", 10), ("c", 1), ("d", 3), ("b", 12)]
# 根据元组第一项
def get_value(item):
return item[0]
max(lists, key=get_value)
# 直接使用lambda表达式
max(lists, key=lambda x: x[0])
函数作为返回值
函数可以作为另一个函数的返回值返回
示例1: 函数作为返回值返回
def create_func():
return lambda x, y: x-y
# create_func调用返回值是一个函数
myfun = create_func()
# myfun调用
myfun(1, 2)
示例2: 根据不同条件返回不同函数
def myfun(func_type="sum"):
if func_type == "sum":
return lambda x, y: x+y
elif func_type=="sub":
return lambda x,y: x-y
elif func_type=="div":
return lambda x, y: x / y
elif func_type=="product":
return lambda x,y: x *y
闭包环境
闭包是指内嵌函数作为外部函数的返回值返回,在其内部引用了外部嵌套域的变量,那么这个变量不会随着外部函数执行销毁,而是保留在内嵌函数环境内
闭包环境示例1:
def outer_func(name):
def inner_func():
print(name)
return inner_func
myfun = outer_func("猿变")
myfun()
闭包环境示例2:
传入一个函数,然后对函数的行为进行修改。示例中,计算重力的函数有一个默认参数值g=9.8, 在其他地方需要输入不同的g值,可以通过修饰行为,使得计算不同地区重力值时有不同的重力值
a = 10
def outer_func():
c = a
def inner_func(b):
return b + c
return inner_func
func = outer_func()
a = 100
print(func(10))
闭包环境示例3:
下面示例中lambda表达式中的i参数
具有延迟绑定的特点
funcs = [lambda x: x * i for i in range(5)]
# 所有的函数都是hello*4的效果
funcs[0]("hello")
funcs[1]("hello")
使用闭包即时绑定
funcs = [(lambda i: lambda x: x * i)(i) for i in range(5)]
# 每个func中的i具有不同的值
funcs[0]("hello")
funcs[1]("hello")
高阶函数练习
# 使用内置函数min, 找出字典中value值最小的项
dicts = {"a": 100, "b": 80, "c": 60, "d": 40}
# 使用内置函数sorted对列表排序, 排序按照列表成员的第二个成员进行比较排序
# sorted(func, iter_obj)
lists = [(10,20),(3,5),(2,9)]
# 使用内置函数map对列表进行处理, 对每一个成员进行平方计算
# map(func, iter_obj)
lists = [1, 2, 3, 4]
# 使用内置函数filter对列表进行处理, 筛选偶数项
# filter(func, iter_obj)
lists = [1, 2, 3, 4, 5, 6]
# 计算重力公式为w = mg, g为加速度, 在全球各地并不相同, 编写一个函数, 可以创建不同默认g值的重力计算函数
讨论区