返回函数
#返回函数 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