返回函数

#返回函数
def lazy_sum(*args):
    def sum():
        sum = 0
        for i in args:
            sum += i
        return sum
    return sum
#当我们调用lazy_sum()时,返回的并不是求和结果,而是求和函数:
t = lazy_sum(1, 4, 5, 6)
#调用函数f时,才真正计算求和的结果:
print(t())

#注意:
f1 = lazy_sum(1, 4, 5, 6)
f2 = lazy_sum(1, 4, 5, 6)
print(f1 == f2) #注意这个输出结果为False,所以说这是两个函数,调用结果互不影响

def count():
    L = []
    for i in range(1, 4):
        def f():
            return i*i
        L.append(f)
    return L
f1, f2, f3 = count()
print(f1()) #9
print(f2()) #9
print(f3()) #9
#注意三个函数的输出结果都为9,而不是1, 4, 9
#我们分析一下原因,三个函数都引用了变量i,但是函数并没有立即执行,当我们调用的时候函数才开始执行,
#但是这个时候里面用到的变量已经改变了,所以输出结果是根据最后的变量i来计算的

#!!!因此我们一定要注意,当一个函数的返回值是另一个函数的时候,传入的参数不能使循环变量或者后续执行过程中会变化的量
#如果一定要使用循环变量可以重新定义一个函数,用该函数的参数绑定此时循环变量的数值,这样无论循环变量如何改变,
#已经绑定到函数参数的值并不会改变

def count():
    def f(j):
        def f2():
            return j * j
        return f2
    L = []
    for i in range(1, 4):
        L.append(f(i))
    return L
t = count()
t1, t2, t3 = count()
print(t1()) #1
print(t2()) #4
print(t3()) #9

#匿名函数
t = list(map(lambda x:x*x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
print(t)

def build(x, y):
    return lambda x, y: x*10+y
t = build(5, 6)
print(t)
print(t(6, 7)) #这一行输出结果为67

 

posted on 2016-06-03 17:07  张明明_1  阅读(243)  评论(0编辑  收藏  举报

导航