zoukankan      html  css  js  c++  java
  • 第八章、函数进阶之闭包函数01

    第八章、函数进阶之闭包函数01

    回顾

    函数对象:可以将定义在函数内的函数返回到全局使用,打破了函数的层级限制

    名称空间与作用域:作用域关系在函数定义阶段就已经固定死了,与调用位置无关,在任意位置调用函数都需要跑到定义函数时找到作用域关系

    def f1():
        x = 1
        def inner():
            print(x)
        return inner
    
    func = f1()
    func()
    x = 2
    
    
    def f2():
        x = 3
        func()
    
    
    f2()
    
    1
    1
    

    一、什么是闭包

    闭包:函数内部函数对外部作用域而非全局作用域的引用

    def outter():
        x = 1
    
        def inner():
            print(x)
        return inner
    
    
    f = outter()
    
    
    def f2():
        x = 2
        f()
    
    
    f2()
    

    1.1 两种为函数传值的方式

    为函数传值的方式一:使用参数的形式

    def func(x):
        print(x)
    
    
    func(1)
    func(1)
    func(1)
    

    为函数传值的方式二:包给函数

    def outter():
        def inner():
            print(x)
        return inner
    
    f = outter(1)
    f()
    f()
    f()
    # 查看闭包的元素
    print(F"f.__closure__[0].cell_contents: {f.__closure__[0].cell_contents}")
    

    二、闭包函数的应用

    闭包的意义:返回的函数对象,不仅仅是一个函数对象,还在函数外包裹了一层作用域,这就使得这个函数无论在哪调用,都优先使用自己外层包裹的作用域。

    应用领域:延迟计算、爬虫

    def get_res(url):
            responce=requests.get(url)
            print(responce.content)
            print(responce.text)
    get_res("http://www.baidu.com")
    get_res("http://www.baidu.com")
    

    闭包可以简化代码

    import requests
    def func(url):
        def get_res():
            responce=requests.get(url)
            print(responce.content)
            print(responce.text)
        return get_res
    
    baidu_spider=func("http://www.baidu.com")
    baidu_spider()
    baidu_spider()
    
  • 相关阅读:
    mysql存储过程基本函数
    Java多线程程序设计详细解析
    手把手教你写Undo、Redo程序
    mysql存储过程学习总结-操作符
    深入解析ATL第二版(ATL8.0)笔记--(2.3节)
    mysql 5.0存储过程学习总结
    php判断浏览器和语言
    Windows7系统环境安装配置PHP开发环境
    Nginx环境下Php安装
    php学习
  • 原文地址:https://www.cnblogs.com/demiao/p/11340283.html
Copyright © 2011-2022 走看看