*—*—python函数(2),动态参数,名称空间—*—*
一、动态参数
def func(a,b,c,d,e,f,g): pass func(1,2,3,4,5,6,7)
如果有上百个参数怎么办呢?
有没有可能有一个万能的参数,可以接受一切的参数呢?
*args 动态参数,万能参数,了解一下哈
args接收的就是实参所对应的所有的位置参数,并将其放在元祖当中
它不会接收关键字参数
def func(*args): pass func(1,2,3,4,5,6,7)
接下来我们打印 返回值 看看是啥样
def func(*args): print(args) func(1,2,3,4,5,6,7)
执行输出:
(1, 2, 3, 4, 5, 6, 7)
如我们先前所言,结果是一个元组
二、形参对应顺序
动态参数*args 在定义中是聚合 调用时将所有传入的参数传入一个元祖,调用的时候输出这个元祖
def func(*args,a,b,c,d,e='sex'): print(args,a,b,c,d,e) func(1,2,3,4,5)
报错,因为*args接收了所有实参,所以缺少了a,b,c,d参数
TypeError: func() missing 4 required keyword-only arguments: 'a', 'b', 'c', and 'd'
我们修改一下看看
def func(a,b,c,d,*args,e='sex'): print(a,b,c,d,args,e) func(1,2,3,4,5,6,7,8,e='男')
执行输出:
1 2 3 4 (5, 6, 7, 8) 男
形参对应顺序:
位置参数,*args,默认参数
*args参数,可以不传,默认为空()
def func(a,b,c,d,*args,e='sex'): print(a,b,c,d,args,e) func(1,2,3,4,e='男')
执行输出:
1 2 3 4 () 男
*args名字是可以改的,但是约定成俗使用*args
**kwargs也是动态参数,和*args不同的是,它只接收关键字参数
**kwargs动态传参,它将所有的关键字参数(未定义的)放到一个字典中。
def func(a,b,c,**kwargs): print(kwargs) func(1,2,a1=3,b1=4,c1=5,c=7)
执行输出:
{'a1': 3, 'b1': 4, 'c1': 5}
执行没有报错,是因为函数接收参数后,它会从左边到右找,最后找到了c
c=7参数,在a,b,c里面已经定义好了,所以在输出的字典中,并未出现。
因为kwargs返回的是未定义的关键字参数。
**kwargs正确的位置
# def func(a,b,c,*args,e='男',**kwargs): # print(a,b,c,*args,e,kwargs) # func(1,2,a1=3,b1=4,c1=5,e='女',c = 7)
执行输出:
1 2 7 女 {'a1': 3, 'b1': 4, 'c1': 5}
三、*魔法运用
def func(*args): print(args) l1 = [1,2,3] l2 = [11,22,33,44]
若要将2个列表的所有元素赋值给args,如何实现呢?
这个时候需要用到* 在调用时*为打散
def func(*args): print(args) l1 = [1,2,3] l2 = [11,22,33,44] func(*l1) func(*l2)
执行输出:
(1, 2, 3)
(11, 22, 33, 44)
**kwargs 打散
def func(**kwargs): print(kwargs) dic1 = {'name':'小明','age':18} dic2 = {'name1':'小李','age1':20} func(**dic1,**dic2)
执行输出:
{'name': '小明', 'age': 18, 'name1': '小李', 'age1': 20}
**kwargs只限于字典类型
在函数的调用执行时,
*可迭代对象,代表打散(list,tuple,str,dict(键))将元素一一添加到args。
**字典,代表打散,将所有键值对放到一个kwargs字典里。
四、命名空间和作用域
a = 1 b = 2 c = [1,2,3] c1 = {'name':'ethan'} def func1(): name = '大司马' print(name) func1() #执行输出:大司马