• 闭包函数


    大前提

    闭包函数 = 名称空间与作用域 + 函数嵌套 + 函数对象

    核心点:名字的查找关系是以函数定义阶段为准

    什么是闭包函数

    "闭"函数指的该函数是内嵌函数

    "包"函数指的该函数包含对外层函数作用域名字的引用(不是对全局作用域)

    闭包函数

      名称空间与作用域的应用+函数嵌套

    def f1():
        x = 33333333333333333333
        def f2():
            print(x)
        f2()
    
    x=11111
    def bar():
        x=444444
        f1()
    
    def foo():
        x=2222
        bar()
    
    foo()
    
    输出:33333333333333333333
    思路:调用的是函数foo(),函数foo()内的x=2222未被调用,调用了函数bar()
         函数bar()内的x=444444未被调用,调用了函数f1()
         函数f1()内定义了x,定义了函数f2(),函数f2()内输出x
         函数f2()内未定义x,就去f1()中,找到了x=33333333333333333333
         最后函数f1()调用了函数f2(),输出33333333333333333333
    def f1():
        x = 33333333333333333333
        def f2():
            print('函数f2:',x)
        return f2
    
    f=f1()            # 调用f1(),返回函数f2(),输出:函数f2:33333333333333333333
    
    def foo():
        x=5555
        f()
    
    foo()            # 调用foo(),foo()内调用了f(),也就是调用了f2,输出:函数f2:33333333333333333333
    
    输出:函数f2: 33333333333333333333

    为何要有闭包函数 

    两种为函数体传参的方式:

    方式一:直接把函数体需要的参数定义成形参

    def f2(x):
        print(x)
    
    f2(1)
    f2(2)
    f2(3)
    
    输出:
    1
    2
    3

    方式二:使用闭包函数

    def f1(x): # x=3
        # x=3
        def f2():
            print(x)
        return f2
    
    x=f1(3)
    print(x)
    x()
    
    输出:
    <function f1.<locals>.f2 at 0x02F734A8>
    3

    思维导图(点击链接

  • 相关阅读:
    c++经典书籍介绍
    jpeg软解码实现介绍
    视频编解码类型调查——抖音客户端
    微机接口复习
    更改MySQL数据库的密码
    python学习之创建我的第一个Django项目
    关于 V831 linux 调用 gpio 的一些通用操作。
    SpringBoot整合H2内存数据库快速启动测试
    MybatisPlus的各种功能使用笔记综合!
    MybatisPlus的自动填充功能使用!
  • 原文地址:https://www.cnblogs.com/zhww/p/12983837.html
Copyright © 2020-2023  润新知