3.29 day9 动态参数

动态传参:

万能参数:*args,接受的就是实参对应的所有位置参数,并放在元组里

形参对应顺序:位置参数,*args,默认参数


def
func(a,b,c,d,*args,e='male'): print(a) print(b) print(c) print(d) print(args) print(e) func(1,2,3,4,5,10,5,6,7,8,e='female')

**kwargs:接收所有的关键字参数(无意义的)并放在一个字典中

def func(a,b,c,**kwargs):
    print(kwargs)
func(1,2,c=3,r=4,b1=5,c1=6,d=7)

{'c1': 6, 'b1': 5, 'r': 4}

所有参数的顺序:位置参数,*args,默认参数,**kwargs

**的魔法作用

1.*可迭代对象,代表打散(list,tuple,字符串,字典的键)

2.**字典,代表打散,将所有的键值对防盗一个kwargs字典里

def func(*args):
    print(args)
l1=[1,2,30]
l2=[1,2,33,21,45,66]
print(func(*l1,*l2))
在函数定义时,*args,**kwargs代表的是聚合

def
func(*args,**kwargs): print(args) print(kwargs) dic1={'name1':'alex','age1':46} dic2={'name2':'wusir','age2':64} func(*[1,2,3,4],*'asdfsad',**dic1,**dic2)

(1, 2, 3, 4, 'a', 's', 'd', 'f', 's', 'a', 'd')
{'name2': 'wusir', 'name1': 'alex', 'age1': 46, 'age2': 64}

我们首先回忆一下Python代码运行的时候遇到函数是怎么做的,从Python解释器开始执行之后,就在内存中开辟里一个空间,每当遇到一个变量的时候,就把变量名和值之间对应的关系记录下来,但是当遇到函数定义的时候,解释器只是象征性的将函数名读如内存,表示知道这个函数存在了,至于函数内部的变量和逻辑,解释器根本不关心。

  等执行到函数调用的时候,Python解释器会再开辟一块内存来储存这个函数里面的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量回储存在新开辟出来的内存中,函数中的变量只能在函数内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。

我们给这个‘存放名字与值的关系’的空间起了一个名字-------命名空间

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

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

def f1():
    print('in f1')
    def f2():
        print('in f2')
    f2()
f1()


def f1():
    def f2():
        def f3():
            print('in f3')
        print('in f2')
        f3()
    print('in f1')
    f2()
f1()
a=2
b=3
def func1():
    c=5
    d=6
    print(globals()) #全局变量放入到一个字典中
    print(locals())
func1()

{'__file__': '/Users/lixinwei/PycharmProjects/untitled1/3.29/3.29知识点.py', '__doc__': None, 'a': 2, '__package__': None, '__cached__': None, '__spec__': None, 'func1': <function func1 at 0x1021748c8>, '__name__': '__main__', '__builtins__': <module 'builtins' (built-in)>, 'b': 3, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x1006a5cc0>}
{'c': 5, 'd': 6}
 
a=4
def func1():
    global a
    a=5
func1()
print(a)

a=5 如果去掉global a=4

globals:全局名称空间的所有变量。

  作用:1.在局部空间内生命一个全局变量

     2.在局部空间内改变一个全局变量

nonlocal:

  1.不能改变全局变量,但能修改聚部变量

  2.在局部作用域中,对父级作用域(或更外层作用域非全部作用域)的变量进行修改,并且引的哪层,从哪层及以下此变量全部发生改变

def add_b():
    b = 42
    def do_global():
        b = 10
        print(b)
        def dd_nonlocal():
            nonlocal b
            b = b + 20
            print(b)
        dd_nonlocal()
        print(b)
    do_global()
    print(b)
add_b()

10,30,30,42

函数在调用的时候执行

代码从上倒下依次执行,调用函数,函数里面从上倒下依次执行

原文地址:https://www.cnblogs.com/kateli/p/8671974.html