4.闭包

作者: 软件开发技术修炼 | 来源:发表于2022-04-02 14:23 被阅读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>

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

相关文章

  • 4.闭包

    一、函数也是对象,和变量一样 可以作为参数被传递可以在函数内部定义可以作为函数返回值函数可以赋值给变量 二、内部函...

  • 4 iOS类微信日志2018-01-13

    Swift 闭包的使用 步骤: 1. 声明闭包 2. 声明闭包的别名属性 3. 设置回调函数 4. 调用闭包 声明...

  • 4. Dart -方法/闭包

    Dart方法的格式: 返回类型 方法名称 (参数1, 参数2, ...){ 方法体 return 返回值;} 示例...

  • 前端笔记(13)

    代码:1.闭包 2.闭包循环的索引值 3.闭包做选项卡 4.获取地址栏参数 5.封闭函数 6.变量的作用域 7.倒计时

  • swift闭包的相关知识

    swift闭包的相关知识,闭包是引用类型1.嵌套函数2.闭包表达式3.利用上下文推断类型4.捕获上下文中的常量和变...

  • 前端经典必问面试题---谈谈对闭包的理解。

    首先我们说说回答的方向 1.先回答闭包是什么2.闭包怎么样3.闭包怎么用4.自己平时在公司里是怎么用的 那么接下来...

  • swift-闭包

    闭包 闭包定义 闭包简化 - 尾随闭包 闭包参数 闭包返回值 闭包的循环引用

  • 闭包,闭包,闭包

    1、这家伙到底是什么? 网上关于这个的讨论的太多了太多了,有各种的举例子,但是大部分还在寻找这个答案的小伙伴对于变...

  • 闭包-Closures [swift 5.1]

    闭包的语法 尾随闭包 闭包逃离 自动闭包

  • Day7 闭包(Closures)

    本页包含内容:• 闭包表达式• 尾随闭包• 值捕获• 闭包是引用类型• 逃逸闭包• 自动闭包 1、闭包表达式 闭包...

网友评论

      本文标题:4.闭包

      本文链接:https://www.haomeiwen.com/subject/poltsrtx.html