函数作为返回值
1.返回函数
返回函数时相关参数和变量保存在返回函数中1
2
3
4
5
6
7
8
9
10
11def lazy_sum(*args):
def sum():
ans = 0
for i in args:
ans = ans+i
return ans
return sum
a = lazy_sum(1,2,3,4,5)
print(a)#返回函数
b = a()
print(b)#返回结果
1 | <function lazy_sum.<locals>.sum at 0x7f47807908c8> |
每次调用lazy_sum时,都会返回一个新的函数,即使传入相同的参数1
2
3f1 = lazy_sum()
f2 = lazy_sum()
print(f1 == f2)
1 | False |
2.闭包
闭包:
1.内部函数可以引用外部函数的参数或变量(不一定就是上一层函数中的参数和变量)
2.外部函数把内部函数作为返回值,相关参数和变量都保存在内部函数中1
2
3
4
5
6
7
8
9
10
11def count():
fn = []
for i in range(1, 4):
def get():
def f():
return i * i
return f
fn.append(get())
return fn
f1,f2,f3 = count()
print(f1(),f2(),f3())
1 | 9 9 9 |
直到调用f()才执行函数,此时i已经变成3,所以最终结果是9 9 9,而不是1,4,9
所以函数最好不要引用循环变量,以及后续会发生变化的量
如果一定要引用循环变量,再创建一个函数,用函数绑定当前循环变量的值1
2
3
4
5
6
7
8
9
10
11def count():
def f(j):
def g():
return j*j
return g
fn = []
for i in range(1,4):
fn.append(f(i))
return fn
f1,f2,f3 = count()
print(f1(),f2(),f3())
1 | 1 4 9 |
3.练习
闭包返回计数器函数,每次返回递增整数1
2
3
4
5
6
7
8
9def createCounter():
i = 0
def counter():
nonlocal i#闭包对闭包函数外,函数内的变量进行引用
i = i+1
return i
return counter
countA = createCounter()
print(countA(),countA(),countA())
1 | 1 2 3 |
4.三种不同写法
1 | #---------------------------------------------------- |
最终结果都是一样的哈哈,现在的程序员,真的是……没毛病!!!