zoukankan      html  css  js  c++  java
  • python开发学习day13 (函数嵌套;名称空间与作用域;闭包函数)

    2020-06-17                           目录:

    一、函数嵌套

    1.1  定义

    1.2  函数嵌套的调用

    二、名称空间与作用域

    2.1  名称空间

    2.1.1  内置名称空间

    2.1.2  全局名称空间

    2.1.3  局部名称空间

    2.2  名称空间的查找顺序

    2.3  作用域

    2.4  函数的参数传递

    三、闭包函数

    3.1  介绍

    3.2  函数体代码传参的方式

    一、函数嵌套

    1.1  定义

    在一个函数内又定义了另一个函数
    如:
    def f1():
        def f2():
            print('from f2')
    
        f2()
     f1()

    1.2  函数嵌套的调用

    在调用一个函数的过称中又调用了另一个函数
    如取四个值的中的最大值:
    def max2(x, y):
        if x > y:
            return x
        else:
            return y
    
    
    def max4(a, b, c, d):
        res1 = max2(a, b)
        res2 = max2(res1, c)
        res3 = max2(res2, d)
        return res3
    
    
    print(max4(1, 2, 3, 4))      

    二、名称空间与作用域

    2.1  名称空间

    名称空间:即内存中存放名字的地方

    2.1.1  内置名称空间

    存放的是python解释器自带的名字,如:print、int、input等
    生命周期:自解释器打开就创建直到关闭,期间一直存在,解释器关闭就清除

    2.1.2  全局名称空间

    除内置和函数内的名字之外,所有的存放于全局名称空间
    生命周期:运行顶级代码(主流水线)则创建,顶级代码(主流水线)结束则清除

    2.1.3  局部名称空间

    存放函数内定义的名字
    生命周期:函数调用时创建,函数调用完毕就立即清除

    2.2  名称空间的查找顺序

    基于现在的位置向上找。
    具体的:局部—>外层套的局部—>外层套的局部—>...—>全局—>内置

    示范① :站在全局进行查找

    input = 333
    def f1():
        input = 4444
    
    f1()
    print(input)  # >>>333

    示范② :站在局部进行查找

    def f1():
        input = 444
        print(input)
    
    input = 333
    
    f1()  # >>>444

    示范③:

    def f1():
        print(input)
    
    def f2():
        input = 555
        print(input)
    
    input = 333
    
    f1()  # >>>333   (f1函数调用前的全局名称都要查找)
    f2()  # >>>555   (优先查找当前局部位置)

    示范④:

    def f1():
        input = 444  # 查找优先级第二
        def inner():
            input = 555  # 查找优先级第一
            print(input)
        inner()
    input = 333  # 查找优先级第三
    f1()         # >>>555

    ps:名称空间的嵌套关系是函数定义阶段(检测语法的时候)就已经确定好的,与调用无关

    示范⑤ :

    x = 111
    
    def f1():
        print(x)  
    
    def f2():
        x = 222
        f1()
    
    f2()  # >>>111

    2.3  作用域

    ① 全局作用域:内置名称空间、全局名称空间
          特点:全局存活、全局有效
    ② 局部作用域:局部名称空间
    特点:临时存活,局部有效

    2.4  函数的参数传递

    ① 对全局定义的不可变类型,不可以在函数内直接修改
    x = 10
    
    def func(a):  # a=10的内存地址
        a = 123   # 123的存地址绑定给a
    
    func(x)   # x=10的内存地址
    print(x)  # >>>10
    
    ② 对全局定义的可变类型,可以在函数内直接修改
    x = []
    
    def func(a):  # a=列表的内存地址
        a.append(1111)
    
    func(x)   # x=列表的内存地址
    print(x)  #>>>[1111]
    
    ③ 在函数中修改全局的不可变类型
    x = 10
    
    def func():
        global x
        x = 666
        
    func()
    print(x)  #>>> 666
    
    ④ nonlocal(了解)
    x = 10
    
    def f1():
        x = 11
    
        def f2():
            nonlocal x
            x = 666
    
        f2()
        print(x)
    
    
    f1()      # >>>666
    print(x)  # >>>10

    三、闭包函数

    3.1  介绍

    闭包函数=》函数对象+函数嵌套定义+名称空间与作用域
    闭:是指定义函数内的函数
    包:是指内函数引用了外函数的变量
    作用:可以将内部的函数打破层级的限制,返回到全局来使用
    
    def outter():
        x = 1111
    
        def inner():
            print(x)
    
        return inner   # 不要加括号
    
    
    f = outter()  # f=inner
    print(f)      # >>> <function outter.<locals>.inner at 0x0000019A2114A4C0>
    
    def f3():
        x = 222222
        f()
    
    f3()          # >>>1111

    3.2  函数体代码传参的方式

    方式一:直接通过参数的方式传入

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

    方式二:用闭包函数

    def outter(x):
    
        def func():
            print(x)
    
        return func  # 一定不要加括号
    
    f1 = outter(111)
    f2 = outter(222)
    f3 = outter(333)
    
    f1()  # >>>111
    f2()  # >>>222
    f3()  # >>>333
  • 相关阅读:
    MySQL集群搭建(4)-MMM+LVS+Keepalived
    MySQL集群搭建(3)-MMM高可用架构
    MySQL集群搭建(2)-主主从模式
    MySQL集群搭建(1)-主备搭建
    MySQL 安装(二进制版)
    Nginx缓存了DNS解析造成后端不通--代理
    开启tcp_timestamps和tcp_tw_recycle造成NAT转发连接不上
    tcp_tw_recycle参数引发的故障
    记一次TIME_WAIT网络故障
    TCP服务端收到syn但是不回复syn ack问题分析
  • 原文地址:https://www.cnblogs.com/cui-cheng/p/13154800.html
Copyright © 2011-2022 走看看