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 
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

# 对返回的函数进行调用时,才计算出结果:

>>> 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()调用返回函数

 

你可能感兴趣的:(python进阶一(函数式编程)【2-6 python中返回函数】)