在函数内部,是可以定义子函数的。
def func(): # 定义子函数 def sub_func(): print('call sub_func.') sub_func() >>> func() call sub_func.
作为高阶函数,可以接受函数作为参数,其实高阶函数,除了不仅仅可以返回int、str、list、dict等数据类型,还可以返回函数。因此,可以把函数的子函数返回。
def f(): print('call f()...') # 定义函数g: def g(): print('call g()...') # 返回函数g: return g
仔细观察上面的函数定义,我们在函数 f 内部又定义了一个函数 g。由于函数 g 也是一个对象,函数名 g 就是指向函数 g 的变量,所以,最外层函数 f 可以返回变量 g,也就是函数 g 本身。
调用函数 f,我们会得到 f 返回的一个函数:
>>> x = f() # 调用f() call f()... >>> x # 变量x是f()返回的函数: <function f.<locals>.g at 0x7f4a4936dbf8> >>> x() # x指向函数,因此可以调用 call g()... # 调用x()就是执行g()函数定义的代码
有必要注意的是,返回函数和返回函数值的语句是非常类似的,返回函数时,不能带小括号,而返回函数值时,则需要带上小括号以调用函数。
# 返回函数 def myabs(): return abs # 返回函数值 def myabs(x): return abs(x)
返回函数有很多应用,比如可以将一些计算延迟执行,举个例子,定义一个普通的求和函数。
def calc_sum(list_): return sum(list_)
调用calc_sum()函数时,将立刻计算并得到结果:
>>> calc_sum([1, 2, 3, 4]) 10
但是,如果返回一个函数,就可以“延迟计算”:
def calc_sum(list_): def lazy_sum(): return sum(list_) return lazy_sum
调用calc_sum()并没有计算出结果,而是返回函数:
>>> f = calc_sum([1, 2, 3, 4]) >>> f <function calc_sum.<locals>.lazy_sum at 0x7f4a4936db70>
对返回的函数进行调用时,才计算出结果:
>>> f() 10
由于可以返回函数,我们在后续代码里就可以决定到底要不要调用该函数。
请编写一个函数calc_prod(list_),它接收一个list,返回一个函数,返回函数可以计算参数的乘积。
参考答案:
from functools import reduce def calc_prod(list_): def lazy_prod(): def f(x, y): return x * y return reduce(f, list_, 1) return lazy_prod f = calc_prod([1, 2, 3, 4]) f()
请验证,完成请求
由于请求次数过多,请先验证,完成再次请求
打开微信扫码自动绑定
绑定后可得到
使用 Ctrl+D 可将课程添加到书签
举报