python 返回函数

转自http://blog.csdn.net/ljp1919/article/details/50937665

1:python返回函数

Python的函数不但可以返回int、str、list、dict等数据类型,还可以返回函数!例如,定义一个函数 f(),我们让它返回一个函数 g,可以这样写:

def f(): 
    print 'call f()...'
    # 定义函数g:
    def g():
            print 'call g()...'
    # 返回函数g:
    return g
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在函数 f 内部又定义了一个函数 g。由于函数 g 也是一个对象,函数名 g 就是指向函数 g 的变量,所以,最外层函数 f 可以返回变量 g,也就是函数 g 本身。调用函数 f,我们会得到 f 返回的一个函数:

x = f() # 调用f(),打印结果call f()...
# 变量x是f()返回的函数:
x() # x指向函数,因此可以调用。
#打印结果call g()... 
# 调用x()就是执行g()函数定义的代码
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

2:请注意区分返回函数和返回值:

def myabs():
    return abs   # 返回函数
def myabs2(x):
    return abs(x)   # 返回函数调用的结果,返回值是一个数值
 
 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

3:返回函数可以把一些计算延迟执行。

这点其实是回调函数。例如,如果定义一个普通的求和函数:

def calc_sum(lst):
    return sum(lst)
 
 
  • 1
  • 2
  • 1
  • 2

调用calc_sum()函数时,将立刻计算并得到结果: 
calc_sum([1, 2, 3, 4])#返回结果是10,立刻可以得到 
但是,如果返回一个函数,就可以“延迟计算”:

def calc_sum(lst):
    def lazy_sum():
        return sum(lst)
    return lazy_sum
 
 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

调用calc_sum()并没有计算出结果,而是返回函数:

f = calc_sum([1, 2, 3, 4])
f()#调用返回函数进行求和计算
 
 
  • 1
  • 2
  • 1
  • 2

4:使用例子

请编写一个函数calc_prod(lst),它接收一个list,返回一个函数,返回函数可以计算参数的乘积。

# -*- coding: utf-8 -*-
__author__ = 'liujiepeng'
def calc_prod(lst):
    def lazy_prod():
        def f(x, y):
            return x * y
        return reduce(f, lst, 1)
    return lazy_prod
f = calc_prod([1, 2, 3, 4])
print f()
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

补充reduce: 
python中的reduce内建函数是一个二元操作函数,他用来将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给reduce中的函数 func()(必须是一个二元操作函数)先对集合中的第1,2个数据进行操作,得到的结果再与第三个数据用func()函数运算,最后得到一个结果。所以,上述的连乘操作,需要定义如上:

        def f(x, y):
            return x * y
        return reduce(f, lst, 1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值