4.闭包
2022-04-02 本文已影响0人
软件开发技术修炼
一、函数也是对象,和变量一样
可以作为参数被传递
可以在函数内部定义
可以作为函数返回值
函数可以赋值给变量
二、内部函数
把函数的内部定义函数,就是内部函数
def outter():
print('我是外部函数')
def inner():
print('我是outter的内部函数')
print('调用内部函数')
inner()
print('我再次调用内部函数,自己家的想用就用,随时用')
inner()
print('还可以返回给大家共用')
return inner
#调用外部函数,并接受返回值
func = outter()
#调用outter返回的内部函数
print('在外部调用内部函数')
三、闭包
内部函数特性:
1、可以访问它所属的外部函数的局部变量,这些变量被称为nonlocal,或者enclosing变量
2、可以携带这些nonlocal变量,让它们不会被回收
所以说Python中的闭包就是内部函数,准确点是使用了nonlocal变量的内部函数。
闭包函数必须满足:
1、函数内部定义的函数
2、包含对外部作用域而非全局作用域的引用
1. 没有引用变量
def outer():
def inner():
print("inner func excuted")
inner()
print("outer func excuted")
outer()
#结果:
inner func excuted
outer func excuted
2. 变量x属于全局变量,而非外部作用于域的变量
x= 1
def outer():
def inner():
print("x = %s" %x) # 变量x属于全局变量,而非外部作用于域的变量
print("inner func excuted")
inner()
print("outer func excuted")
outer()
#结果:
x=1
inner func excuted
outer func excuted
3. 正真的闭包
def outer():
x = 1
def inner():
print("x = %s" %x) # 变量x属于外部作用于域的变量
print("inner func excuted")
inner()
print("outer func excuted")
outer()
结果:
x = 1
inner func excuted
outer func excuted
4. 输出引用的外部局部变量
结果表明,在inner内部,引用了两个外部局部变量。如果引用的是非局部变量,那么这里输出的为None
def outer():
x = 1
y = 2
def inner():
print("x=%s" %x)
print("y=%s" % y)
# print("inner func excuted")
# inner()
# print("outer func excuted")
print(inner.__closure__)
return inner
outer()
#输出:
(<cell at 0x02AE22D0: int object at 0x65A4D430>, <cell at 0x02B68070: int object at 0x65A4D440>)
5. 闭包实际应用
from urllib.request import urlopen
def index(url):
def get():
# 只要在函数内部的变量都属于函数。那么我在index(url),这个url也属于函数内部
return urlopen(url).read()
return get
python = index("http://www.python.org")
print(python)
baidu = index("http://www.baidu.com")
print(baidu)
#结果:
<function index.<locals>.get at 0x02B4EA98>
<function index.<locals>.get at 0x02B4EC00>
关于闭包,还有哪些实际应用,欢迎下方补充~