zoukankan      html  css  js  c++  java
  • 闭包函数

    大前提

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

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

    什么是闭包函数

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

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

    闭包函数

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

    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#——总结两种方式下载模板
    c#——NPOL下载
    c#——泛型类型约束
    Oracle 数据类型
    软件测试绩效评估点
    读《没有带不好的员工》总结
    安装jenkins,配置pipline 运行docker
    K8S pv与pvc匹配不到的坑
    jenkins 在pipeline中运行docker镜像执行测试代码
    k8s 储存卷的定义与使用
  • 原文地址:https://www.cnblogs.com/zhww/p/12983837.html
Copyright © 2011-2022 走看看