"""
在函数内部,是可以定义子函数的。
作为高阶函数,可以接受函数作为参数,其实高阶函数,除了不仅仅可以返回int、str、list、dict等数据类型,
还可以返回函数。因此,可以把函数的子函数返回。
"""
def func():
def sub_func():
print('call sub func')
sub_func()
func() # call sub func
# return 返回函数
def f():
print('call f()....')
def g():
print('call g()....')
return g
x = f()
print(x) # 变量x是f()返回的函数:g
x() # 相当于是g()
"""
打印结果:
call f()....
<function f.<locals>.g at 0x0000021372391310>
call g()....
"""
"""
返回函数和返回函数值的语句是非常类似的,返回函数时,不能带小括号,而返回函数值时,则需要带上小括号以调用函数
"""
def myabs():
return abs
def myabsA(x):
return abs(x)
a = myabsA(-1)
print(a)
"""
返回函数可以将一些计算延迟执行,举个例子,定义一个普通的求和函数。
"""
def calc_sum(list_):
return sum(list_)
print(calc_sum([1, 2, 3, 4, 5])) # 调用函数立即得到结果
def calc_sum(list_):
def lazy_sum():
return sum(list_)
return lazy_sum
s = calc_sum([1, 2, 3, 4, 5])
print(s())
# 练习:编写一个函数calc_prod(list_),它接收一个list,返回一个函数,返回函数可以计算参数的乘积
from functools import reduce
def calc_prod(list_):
def lazy_():
def chengji(x ,y):
return x * y
return reduce(chengji, list_)
return lazy_
y = calc_prod([1, 2, 3, 4, 5])
print(y())