1 函数可以用在哪些地方
函数作为第一类对象:
- 可以赋值给变量
- 可以作为参数
- 可以作返回值
- 可以作为容器的对象
# 2 闭包的概念 什么是闭包? 维基的解释:在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。 换成一种更具体的描述:内部函数包含对外部作用域中变量名的引用,但一定不是全局变量名的引用。 举个例子: ```python def func(name): def A(): print("A in func") def inner_func(age): print(name,age) A() return inner_func f=func("anne") f(18)
print:
anne 18
A in func
**inner_func()打包了外部函数func()中的变量name和A()的信息。**
**如何查看闭包中的调用了外部函数的哪些变量名。**
```python
print(f.__closure__) #(<cell at 0x0000015758BF9498: function object at 0x0000015758C8BAE8>, <cell at 0x0000015758BF94C8: str object at 0x0000015758C8A148>)
print(f.__closure__[1].cell_contents) #anne
# 3 闭包的作用 **除了返回函数本身的功能,还会返回外部作用域中变量的一个状态。** ```python def func(): x=1 def inner_func(): print(x) return inner_func
f=func()
f()
f()里就保存的x=1这个状态,每次只要掉用f(),就能获取x的状态。
<br>
# 5 闭包需要注意的问题
```python
def count():
fs=[]
for i in range(1,4):
def f():
print(id(i)) #这里的i其实是i的引用
return i*i
fs.append(f)
return fs
f1,f2,f3=count()
print(f1(),f2(),f3())
result:
9
9
9
全部都是 9!原因就在于返回的函数引用了变量 i,但它并非立刻执行。
等到 3 个函数都返回时,它们所引用的变量 i 已经变成了 3,因此最终
结果为 9。
返回闭包时牢记的一点就是:返回函数不要引用任何循环变量, 或者后
续会发生变化的变量。