• Python之函数进阶


     

    一、命名空间

    命名空间一共分为三种:

      全局命名空间

      局部命名空间

      内置命名空间

    全局命名空间:代码在运行伊始,创建的存储“变量名与值的关系”的空间

    局部命名空间:在函数的运行中开辟的临时的空间

    内置命名空间:Python中内置的,存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用

    三种命名空间之间的加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

    三种命名空间之间的取值顺序:在局部调用,局部命名空间->全局命名空间->内置命名空间

                  在全局调用,全局命名空间->内置命名空间

    二、作用域

    作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。

    全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效

    局部作用域:局部名称空间,只能在局部范围内生效

    三、小知识点

    global关键字声明全局变量

          对于不可变数据类型 在局部可是查看全局作用域中的变量
          但是不能直接修改
          如果想要修改,需要在程序的一开始添加global声明
          如果在一个局部(函数)内声明了一个global变量,那么这个变量在局部的所有操作将对全局的变量有效

    globals : 在全局调用 

         永远打印全局的名字

    locals : 在全局调用

        输出什么 ,根据locals所在的位置

    四、函数的嵌套

    函数的嵌套调用

    def max2(x,y):
        m  = x if x>y else y
        return m
    
    def max4(a,b,c,d):
        res1 = max2(a,b)
        res2 = max2(res1,c)
        res3 = max2(res2,d)
        return res3
    
    # max4(23,-7,31,11)
    
    函数的嵌套调用

    函数的嵌套定义:内部函数可以使用外部函数的变量

    def f1():
        print("in f1")
        def f2():
            print("in f2")
    
        f2()
    f1()
    
    函数的嵌套定义

     函数的作用域链 :

    def f1():
        a = 1
        def f2():
            def f3():
                print(a)
            f3()
        f2()
    
    f1()
    
    作用域链

    nonlocal关键字 :

    只能用于局部变量 找上层中离当前函数最近一层的局部变量

    声明了nonlocal的内部函数的变量修改会影响到 离当前函数最近一层的局部变量

    对全局无效

    对局部 也只是对 最近的 一层 有影响

    def f1():
        a = 1
        def f2():
            nonlocal a
            a = 2
        f2()
        print('a in f1 : ',a)
    
    f1()
    
    nonlocal关键字

     五、函数名的本质

    函数名本质上就是函数的内存地址

    1、可以被引用,被赋值

    2、可以被当作容器类型的元素

    3、可以当作函数的参数和返回值

    第一类对象(first-class object)

    1、可在运行期创建

    2、可用作函数参数或返回值

    3、可存入变量的实体。

    六、闭包

    闭包函数:内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数
         #函数内部定义的函数称为内部函数

    闭包函数最常用的用法

    def func():
        name = 'eva'
        def inner():
            print(name)
        return inner
    
    f = func()
    f()

    闭包函数的嵌套

    def wrapper():
        money = 1000
        def func():
            name = 'eva'
            def inner():
                print(name,money)
            return inner
        return func
    
    f = wrapper()
    i = f()
    i()

    判断闭包函数的方法__closure__

    #输出的__closure__有cell元素 :是闭包函数
    def func():
        name = 'eva'
        def inner():
            print(name)
        print(inner.__closure__)
        return inner
    
    f = func()
    f()
    
    #输出的__closure__为None :不是闭包函数
    name = 'egon'
    def func2():
        def inner():
            print(name)
        print(inner.__closure__)
        return inner
    
    f2 = func2()
    f2()
  • 相关阅读:
    装饰者设计模式
    Base64技术:把对象转变成字符串
    Android获取网络数据进行GZIP解压
    自定义Button成进度条
    Android:TextView最小行数设置
    介绍两个Android不常用的Drawable:GradientDrawable和 StateListDrawable
    Json介绍
    Android自定义XML属性
    Android手机图片适配问题
    AsyncTask
  • 原文地址:https://www.cnblogs.com/DI-DIAO/p/8127210.html
Copyright © 2020-2023  润新知