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>

关于闭包,还有哪些实际应用,欢迎下方补充~

上一篇下一篇

猜你喜欢

热点阅读