python 闭包

1 函数可以用在哪些地方

函数作为第一类对象:

  1. 可以赋值给变量
  2. 可以作为参数
  3. 可以作返回值
  4. 可以作为容器的对象

# 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。
返回闭包时牢记的一点就是:返回函数不要引用任何循环变量, 或者后
续会发生变化的变量。

原文地址:https://www.cnblogs.com/yangzhenwei123/p/6759204.html