zoukankan      html  css  js  c++  java
  • python基础学习-函数闭包

    一:函数闭包的大前提

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

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

    二:什么是闭包函数

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

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

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

    示范:

    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
  • 相关阅读:
    笔记-[5]-关于JS事件流!
    JS中的模块化开发之Sea.JS
    利用JavaScript如何创建一个table表格[第2种方法]
    二维数组左滑删除某一行
    sdwebimage缓存图片
    scrollView中内部控件的悬停
    (转)将图片保存到相册
    离屏渲染
    标签栏隐藏
    iOS8新特性之交互式通知
  • 原文地址:https://www.cnblogs.com/dingbei/p/12535180.html
Copyright © 2011-2022 走看看