zoukankan      html  css  js  c++  java
  • day11 Python 闭包

    闭包

    什么是闭包? 闭包就是内层函数, 对外层函数(非全局)的变量量的引用. 叫闭包

    def func1(): 
        name = "test"
        def func2():
            print(name)
        func2()
    func1()
    
    
    结果: test

    我们可以使⽤用__closure__来检测函数是否是闭包. 使⽤用函数名.__closure__返回cell就是闭包. 返回None就不是闭包

    def func1():
        name = "alex"
        def func2():
            print(name) # 闭包
        func2()  
        print(func2.__closure__) # (<cell at 0x10c2e20a8: str object at 0x10c3fc650>,)
    
    
    func1()

    问题, 如何在函数外边调⽤内部函数呢?

     def outer():
        name = "alex"
        # 内部函数 
        def inner():
            print(name)
        return inner
    
    fn = outer() # 访问外部函数, 获取到内部函数的函数地址 
    fn() # 访问内部函数

    那如果多层嵌套呢? 很简单, 只需要一层一层的往外层返回就行了

    def func1():
        def func2():
            def func3():
                print("嘿嘿")
                return func3
            return func2
    
    func1()()()    
    

    由它我们可以引出闭包的好处. 由于我们在外界可以访问内部函数. 那这个时候内部函 数访问的时间和时机就不一定了, 因为在外部, 我可以选择在任意的时间去访问内部函数. 这个时候. 想一想. 我们之前说过, 如果一个函数执行完毕. 则这个函数中的变量以及局部命名空间中的内容都将会被销毁. 在闭包中. 如果变量被销毁了了. 那内部函数将不能正常执行. 所 以.python规定. 如果你在内部函数中访问了外层函数中的变量. 那么这个变量将不会消亡. 将会常驻在内存中. 也就是说. 使用闭包, 可以保证外层函数中的变量在内存中常驻. 这样做 有什么好处呢? 非常⼤的好处. 我们来看⼀个关于爬⾍虫的代码:

    from urllib.request import urlopen
    def but():
        content = urlopen("http://www.baidu.com").read()
        def get_content():
            return content
        return get_content
    fn = but() # 这个时候就开始加载校花100的内容
    # 后⾯需要用到这⾥面的内容就不需要在执⾏非常耗时的网络连接操作了 
    content = fn() # 获取内容
    print(content)
     
    
    content2 = fn() # 重新获取内容
    print(content2)
     

    综上, 闭包的作⽤就是让一个变量能够常驻内存. 供后面的程序使用.

  • 相关阅读:
    Unity 项目中委托Delegate用法案例
    如何让jpa 持久化时不校验指定字段
    Unity 3D光源-Spot Light聚光灯用法详解、模拟手电筒、台灯等线性教程
    unity 实现调用Windows窗口/对话框交互
    Unity 3D光源-Point Light点光源详解/灯泡、模拟灯光效果教程
    unity ugui Toggle Group详解(Chinar出品、简单易懂)
    Unity 3D UGUI Toggle用法教程
    Unity3D UGUI下拉菜单/Dropdown组件用法、总结
    CI/CD学习一
    智慧校园整体架构
  • 原文地址:https://www.cnblogs.com/fanghongbo/p/9885235.html
Copyright © 2011-2022 走看看