zoukankan      html  css  js  c++  java
  • Python入门之函数的嵌套/名称空间/作用域/函数对象/闭包函数

    本篇目录:

        一、函数嵌套

        二、函数名称空间与作用域

        三、函数对象

        四、闭包函数

    ==============================================================================

    一、函数嵌套

      1. 函数的嵌套调用

          函数内又调用了其他函数(函数平级)

    def max(x,y):
        return x if x > y else y
    
    def max4(a,b,c,d):
        res1=max(a,b)
        res2=max(res1,c)
        res3=max(res2,d)
        return res3
    print(max4(1,2,3,4))

       

        2. 函数的嵌套定义

          函数在自己内部定义了其他函数(自己使用)

    def f1():
        def f2():
                print('from f2')
        f2()
    f1()

    二、函数名称空间与作用域

      1. 空间名称的定义

    #名称空间:存放名字的地方,三种名称空间,(之前遗留的问题x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方)

         

        1.1 内置名称空间 

    # a. Python解释器自带的名字,Python自带的一些方法, built-in function
    # b. 打开Python解释器时候就加载就绪,解释器关闭就释放资源

       

        1.2 全局名称空间

    # a. 文件级别的名字,不是系统自带,不是函数内部
    # b. 执行文件,加载内容时候准备就绪;在文件执行结束,或者文件运行期间被删除的时候,是释放资源

        

        1.3 局部名称空间

    # a. 函数内部定义的名字,函数的参数以及函数内的名字都存放在局部名称空间
    # b. 在函数调用时候临时生效

      2. 名字空间的加载顺序

    python test.py
    #1、python解释器先启动,因而首先加载的是:内置名称空间
    #2、执行test.py文件,然后以文件为基础,加载全局名称空间
    #3、在执行文件的过程中如果调用函数,则临时产生局部名称空间
    #4、内部名称空间>>>全局名称空间>>>局部名称空间

     

      3. 函数的作用域

    #1、作用域即范围
        - 全局范围(内置名称空间与全局名称空间属于该范围):全局存活,全局有效
        - 局部范围(局部名称空间属于该范围):临时存活,局部有效
    #2、作用域关系是在函数定义阶段就已经固定的,与函数的调用位置无关,如下
    x=1
    def f1():
        def f2():
            print(x)
        return f2
    x=100
    def f3(func):
        x=2
        func()
    x=10000
    f3(f1())
    
    #3、查看作用域:globals(),locals()
    
    
    LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> __builtins__
    locals 是函数内的名字空间,包括局部变量和形参
    enclosing 外部嵌套函数的名字空间(闭包中常见)
    globals 全局变量,函数定义所在模块的名字空间
    builtins 内置模块的名字空间
    # 局部名称空间--->全局名称空间--->内置名称空间
    
    # 需要注意的是:在全局无法查看局部的,在局部可以查看全局的,如下示例
    
    # max=1
    def f1():
        # max=2
        def f2():
            # max=3
            print(max)
        f2()
    f1()
    print(max)

      

        3.1 全局作用域

    # 包含的是内置名称空间和全局名称空间;
    # 在任何位置都已访问,该范围内名字会伴随程序整个生命周期

        3.2 局部作用域

    # 包含的是局部名称空间的名字;
    # 只能在函数内使用,调用函数时生效,调用结束失效

     三、函数对象(函数在Python中是第一类对象)

       

      1. 函数可以被引用

      2.函数可以被当作参数传入

    # 注意函数名字没带括号,传入的是内存地址
    # 如果是函数名带括号,传入的是函数的return值

      3. 函数可以当返回值

      4. 函数可以被当作容器类型的元素(放入列表,元素,字典中)

    # 注意下图中, dic[choice](),相当于value加了括号,直接调用了函数

    四、闭包函数

      1. 什么是闭包

    #内部函数包含对外部作用域而非全局作用域的引用
    
    #提示:之前我们都是通过参数将外部的值传给函数,闭包提供了另外一种思路,包起来喽,包起呦,包起来哇
    
            def counter():
                n=0
                def incr():
                    nonlocal n
                    x=n
                    n+=1
                    return x
                return incr
    
            c=counter()
            print(c())
            print(c())
            print(c())
            print(c.__closure__[0].cell_contents) #查看闭包的元素

      2.闭包的意义与作用

    #闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
    #应用领域:延迟计算(原来我们是传参,现在我们是包起来)
        from urllib.request import urlopen
    
        def index(url):
            def get():
                return urlopen(url).read()
            return get
    
        baidu=index('http://www.baidu.com')
        print(baidu().decode('utf-8'))
    # 作用域关系,在函数定义阶段就被固定了,与调用位置无关(请看下图解释)

  • 相关阅读:
    React开发入门
    API爬虫--Twitter实战
    网页爬虫--scrapy入门
    爬虫入门(实用向)
    随谈10年的技术生涯和技术成长
    html元素的显示和隐藏
    Ubuntu下用cue文件对ape和wav文件自动分轨
    Bash内置命令exec和重定向
    Bash提示符
    Bash启动选项
  • 原文地址:https://www.cnblogs.com/JetpropelledSnake/p/8665201.html
Copyright © 2011-2022 走看看