zoukankan      html  css  js  c++  java
  • 函数的全局变量和局部变量

    一.定义

    '''
    局部变量: 在函数内部定义的变量(局部命名空间)
    全局变量: 在函数外部定义的或者使用global在函数内部定义(全局命名空间)
    
    作用域: 作用的范围
    局部变量作用域: 在函数的内部
    全局变量作用域: 横跨整个文件
    
    声明周期:
         内置函数  ->  全局变量   -> 局部变量
           
    '''

    1. 局部变量

    # 1.局部变量
    def func():
        # 定义局部变量
        a = 5
        # 获取局部变量
        print(a)
        # 修改局部变量
        a = 10
        print(a)
    
    func()
    # print(a) error 不能再全局调用局部变量

    2. 全局变量

    # 定义全局变量
    b = 10
    # 获取全局变量
    print(b)
    # 修改全局变量
    b = 20
    
    def func():
        # 可以在函数内部获取全局变量
        print(b)
    func()

    3. 使用global在函数内部创建全局变量

    def func():
        global c
        c = 200
    func()
    print(c)

    4. 使用global在函数内部修改全局变量

    d = 300
    def func():
        global d
        d = 400
    func()
    print(d)
    """
        可以使用global 关键字在函数内部定义一个全局变量
        也可以使用global关键字在函数内部修改一个全局变量
    """

    二. 函数名的使用

    def func():
        print("我是func函数")
        return 1111
    
    # 1.函数名是个特殊的变量,可以当做变量赋值
    a = "你好"
    print(a)
    a = func
    a()
    
    # 函数可以像变量一样销毁
    del a
    # a()

    1. 函数名可以作为容器类型数据的元素

    def func1():
        print("我是func1函数")
        
    def func2():
        print("我是func2函数")    
        
    def func3():
        print("我是func3函数")
        
    lst = [func1,func2,func3]
    for i in lst:
        print(i)
        i() # func1() func2() func3()

    2. 函数名可以作为函数的参数

    def func4(f):
        f()
    
    func4(func3)

    3. 函数名可作为函数的返回值

    def func(f):
        return f
        
    res = func(func2) # f <=> func2 =>  res = func2()
    res()
    
    # ### __doc__ 或者 help查看文档
    
    def eat_bigchang(something):
        """
        功能: 大肠刺身
        参数: 肠子名字
        返回值: 吃的状态    
        """
    
    
        print("先把{}洗一洗".format(something))
        print("找出肠子头放嘴里")
        print("嘬!!")
        return "吃完了,满意的放下肠子,擦擦嘴"
    
    res = eat_bigchang("猪肠子")
    print(res)
    help(eat_bigchang)
    res = eat_bigchang.__doc__
    print(res)

    三. 函数的嵌套

    """
    函数之间可以互相嵌套
    外层的叫做外函数
    内层的叫做内函数
    """
    def outer():
        
        def inner():
            print("我是inner函数")
        inner()
            
    outer()

    1、 LEGB 原则

    """
    #找寻变量的调用顺序采用LEGB原则(即就近原则)
    B —— Builtin(Python);Python内置模块的命名空间      (内建作用域)
    G —— Global(module); 函数外部所在的命名空间        (全局作用域)
    E —— Enclosing function locals;外部嵌套函数的作用域(嵌套作用域)
    L —— Local(function);当前函数内的作用域            (局部作用域)
    依据就近原则,从下往上 从里向外 依次寻找
    """

    四. nonlocal 修改局部变量

    """
    nonlocal遵循LEGB就近找变量原则
        (1)找当前空间上一层的局部变量进行修改
        (2)如果找不到,会继续向上寻找
        (3)最后什么也没有,直接报错
    """

    1、找当前空间上一层的局部变量进行修改

    def outer():
        a = 100
        def inner():
            nonlocal a
            a = 200
            print(a)
        
        inner()
        print(a)
    
    outer()

    2、如果找不到,会继续向上寻找

    def outer():
        a = 100
        def inner():
            
            def smaller():
                nonlocal a 
                a = 400
                print(a)
            smaller()
            print(a)
        inner()
        print(a)
    outer()

    注意点:nonlocal只能修改局部变量

    """
    a = 100
    def outer():
        
        def inner():
            def smaller():
                nonlocal a 
                a = 400
                print(a)
            smaller()
            print(a)
        inner()
        print(a)
    outer()
    """

    3、不使用nonlocal 修改局部变量

    def func():
        lst = [1,2,3,4]
        def inner():
            lst[-1] = 10
        inner()
        print(lst)
    func()

    五、locals 和 globals

    locals 获取当前作用域中所有变量

    """
    locals 如果在全局,调用locals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域
    locals 如果在局部,调用locals之后,获取的是调用之前的所有变量,返回字典,局部空间作用域
    """

    1、globals 只获取全局空间中所有变量

    """
    globals 如果在全局,调用globals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域
    globals 如果在局部,调用globals之后,获取的是调用之前的所有变量,返回字典,全局空间作用域
    """

    2、动态批量创建全局变量

    2.1、用字符串定义全局变量

    dic = globals()
    print(dic) # 返回的是系统的字典
    # 在全局的字典当中,通过添加键值对,自动创建全局变量
    # 对应的键时变量名,对应的值是变量指向的值
    dic["name"] = "致和"
    
    print(name)

    2.2、批量定义全局变量

    def func():
        dic = globals()
        # 通过在全局系统字典当中,添加键值对,批量创建变量
        for i in range(1,6):
            # "a%d" % (1) => "a1"  "a%d" % (2) => "a2"  
            dic["a%d" % (i)] = i #  1~5 
            
    func()
  • 相关阅读:
    BEC listen and translation exercise 44
    中译英12
    BEC listen and translation exercise 43
    中译英11
    BEC listen and translation exercise 42
    中译英10
    BEC listen and translation exercise 41
    中译英9
    BEC listen and translation exercise 40
    中译英8
  • 原文地址:https://www.cnblogs.com/whc6/p/14076701.html
Copyright © 2011-2022 走看看