day 09 函数的进阶

01 动态参数 *args **kwargs
  
在函数的定义时,* ** 代表聚合。
def func(**kwargs):
    print(kwargs)
func(**{"name":'alex'}, **{'age': 46})

#  {'name': 'alex', 'age': 46}   聚合
函数的执行(调用)时,* ** 代表打散。
def func(*args,**kwargs):    #* 代表聚合
    print(args)
    print(kwargs)
func(*[1,2,3], *'abfc', **{'name':'alex'}, **{'age': 46})   # *代表打散
def func(*agrs):
    print(agrs)
# func([1,2,3], [4,5,6 ], 'alex')   #  ([1, 2, 3], [4, 5, 6], 'alex')
func(*[1,2,3], *[4,5,6 ], *'alex')  #  (1, 2, 3, 4, 5, 6, 'a', 'l', 'e', 'x')   #  打散
02 形参的顺序
形参顺序: 位置参数 *args 默认参数 **kwargs
def func(a,b,*args,sex='',**kwargs,):
    print(a)
    print(b)
    print(args)
    print(sex)
    print(kwargs)
func(1,2,3,4,5,sex='',name='alex')
03 名称空间(临时,全局,内置)

全局名称空间:存放的是py文件中变量与值的对应关系
局部名称空间:在函数运行时,临时开辟的存放变量名与值得对应关系的空间,函数执行完毕,这块内存空间会被清空。

内置名称空间:内置函数,关键字等等。 print() input()

04 作用域:全局作用域,局部作用域
作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。
全局作用域:
  生效于:内置名称空间,全局名称空间
局部作用域:
  生效于:局部名称空间 (可以用global声明为全局)

05 加载顺序与取值顺序

三种名称空间加载顺序:

  内置名称空间 --->  全局名称空间 ---> 局部名称空间

三种名称空间的取值顺序:

  在全局: 全局名称空间 ---> 内置命名空间

  在局部:(就近原则)LEGB原则,局部名称空间 --- > 全局名称空间 ---> 内置名称空间

print(input)  # <built-in function input>  #第三取值
input = 'alex'   # 第二取值
def func():
    input = 'echo'    #  第一取值
    print(input)   
func()
06 内置函数:globals() locals()
globals() 返回全局作用于的所有内容
locals() 返回当前作用于的所有内容
def func():
    a = 12
    b = 20
    print(locals())    # 返回一个字典:当前作用域的所有内容 {'b': 20, 'a': 12}
    print(globals())   # 返回一个字典:包含全局作用域所有的内容 {'__name__': '__main__', '__doc__': None,
    # '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002503C91B470>, 
    # '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>,
    # '__file__': 'D:/study/day 10/00 代码草稿.py', '__cached__': None, 'func': <function func at 0x000002503C813EA0>}
07 关键字:global nonlocal

global:

  1,声明一个全局变量。

  2,局部作用域不能对全局作用域的变量进行修改,只能引用,通过设置global可以修改(限于字符串,数字)

def func():
    global a    # 声明 a=3 为全局变量,之后可以在函数为打印a
    a = 3
func()
print(a)


count = 1
def search():
    global count   #  声明后,可以对全局变量进行修改
    count = 2
search()
print(count)

对可变数据类型(list,dict,set)可以直接引用不用通过global。

li = [1,2,3]
dic = {'a':'b'}

def change():
    li.append('a')
    dic['q'] = 'g'
    print(dic)
    print(li)
change()
print(li)
print(dic)
nonlocal:
1、不能操控全局变量
2、在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
def wrapper():
    name = 'alex'
    def inner():
        nonlocal name
        name += 'b'
        # print(name)
        def inner1():
            name = 'echo'
    print('1', name)      # alex
    inner()
    print('2', name)      # alexb
    print('3', name)      # alexb   (修改了inner1里面name变量的值)
wrapper()


























原文地址:https://www.cnblogs.com/echo2019/p/10208944.html