python进阶一(函数式编程)【2-6 python中返回函数】
python中返回函数
Python的函数不但可以返回int、str、list、dict等数据类型,还可以返回函数!
例如,定义一个函数 f(),我们让它返回一个函数 g,可以这样写:
1 def f(): 2 print 'call f()...' 3 # 定义函数g: 4 def g(): 5 print 'call g()...' 6 # 返回函数g: 7 return g
仔细观察上面的函数定义,我们在函数 f 内部又定义了一个函数 g。由于函数 g 也是一个对象,函数名 g 就是指向函数 g 的变量,所以,最外层函数 f 可以返回变量 g,也就是函数 g 本身。
调用函数 f,我们会得到 f 返回的一个函数:
1 >>> x = f() # 调用f() 2 call f()... 3 >>> x # 变量x是f()返回的函数: 4 <function g at 0x1037bf320> 5 >>> x() # x指向函数,因此可以调用 6 call g()... # 调用x()就是执行g()函数定义的代码
请注意区分返回函数和返回值:
1 def myabs(): 2 return abs # 返回函数 3 def myabs2(x): 4 return abs(x) # 返回函数调用的结果,返回值是一个数值
返回函数可以把一些计算延迟执行。例如,如果定义一个普通的求和函数:
1 def calc_sum(lst): 2 return sum(lst)
调用calc_sum()函数时,将立刻计算并得到结果:
>>> calc_sum([1, 2, 3, 4])
10
但是,如果返回一个函数,就可以“延迟计算”:
1 def calc_sum(lst): 2 def lazy_sum(): 3 return sum(lst)#返回一个求和函数的求和结果 4 return lazy_sum#返回一个求和延迟函数
# 调用calc_sum()并没有计算出结果,而是返回函数:
>>> f = calc_sum([1, 2, 3, 4]) >>> f <function lazy_sum at 0x1037bfaa0>
# 对返回的函数进行调用时,才计算出结果:
>>> f()
10
由于可以返回函数,我们在后续代码里就可以决定到底要不要调用该函数。
任务
请编写一个函数calc_prod(lst),它接收一个list,返回一个函数,返回函数可以计算参数的乘积。
1 def calc_prod(lst): 2 def lazy_prod():#编写一个延迟的乘积函数 3 def f(x,y):#求乘积函数 4 return x * y#返回乘积结果 5 return reduce(f,lst,1)#reduce()函数,连续相称,接受第三个参数,从1开始相乘 6 return lazy_prod#返回一个求乘积的延迟函数 7 8 f = calc_prod([1, 2, 3, 4])#调用calc_prod并没有计算出结果,而是返回了函数lazy_prod 9 print f()#对返回的函数进行调用时,才能算出结果,f()调用返回函数