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()
  • 相关阅读:
    Linux系统格式化磁盘+挂载分区
    ELK日志处理
    memcached安装+绑定访问ip
    Redis安装+密码认证
    linux安全
    Mysql备份与恢复
    MySql binlog
    gitlab自动备份
    Rabbitmq安装与配置
    Hadoop实战-Flume之Source interceptor(十一)(2017-05-16 22:40)
  • 原文地址:https://www.cnblogs.com/whc6/p/14076701.html
Copyright © 2011-2022 走看看