14-2 可变参数
2019-07-16 本文已影响11人
BeautifulSoulpy
贫穷的思维里,写满了算计和抱怨;富裕的思维里,全是付出和感恩。而笑容就是你这辈子最好的风水!
科技(IT界)引领各行各业的发展
每个人的优点和缺点都是套餐,不贪心就好

写函数是为了方便,不是为了找事;按照一定的标准;
函数的可变参数:
在定义函数的时候,有时候会遇到参数比较多或者不确定参数名的情况。这个时候就可以使用可变参数。
可变参数:
1可变参数的形式有
1.1可变位置参数:在参数前加一个*(尽可能的贪婪,收集0-N个参数;)
*args : 元组类型参数
1.可变参数 *args
def add(*nums):
print(type(nums),nums)
sum=0
for x in nums: #for循环是有值才进入;保证了空值也有输出;
sum+=x
return(sum)
add(1,3,5,7,9) | <class 'tuple'> (1, 3, 5, 7, 9) 25
add() #空值返回空元组;
------------------------------------
<class 'tuple'> ()
0
2. 形参+可变位置参数;
def add(a,*nums):
#def add(*nums,a): # 报错,可变参数会尽可能吃掉参数;
#def add(a,*nums,b):
print(type(nums),nums)
sum=0
for x in nums: #for循环是有值才进入;保证了空值也有输出;
sum+=x
return(sum)
dd(1,3,5),add(1)
---------------------------------------------
<class 'tuple'> (3, 5)
<class 'tuple'> ()
(8, 0)
add(1,2,3) #可变参数不允许使用关键字传参数;
add(1,2,3) #可变参数不允许使用关键字传参数;
---------------------------------------------
<class 'tuple'> (2, 3)
5
1.2可变关键字参数:
.可变关键字参数:
kwargs :字典类型参数
形参前使用符号,表示可以接收多个关键字参数
收集的实参名称和值组成一个字典
1.可变关键字参数
def config(**kwargs):
print(type(kwargs))
print(kwargs)
kwargs['a']=1000 #添加元素;
print(kwargs)
config(host='localhost',post=80),config()
-------------------------------------------------------------
<class 'dict'>
{'host': 'localhost', 'post': 80}
{'host': 'localhost', 'post': 80, 'a': 1000}
<class 'dict'>
{}
{'a': 1000}
(None, None)
2.小技巧:字典解构
def showconfig(**kwargs):
for k,v in kwargs.items(): #解构的思想
print('{}={}'.format(k,v)) #确认输出的形式
showconfig(host='127.0.0.1',post='8080',username='wayne',password='magedu')
-------------------------------------------------------------
host=127.0.0.1
post=8080
username=wayne
password=magedu
3.形参+可变位置参数+可变关键字参数
def config(host,*args ,**kwargs): #注意顺序不能错;
print(type(kwargs))
print(args)
print(kwargs)
config('localhost',80,a=1) #
------------------------------------------------------------------------------------------------
<class 'dict'>
(80,)
{'a': 1}
#小技巧——输出可变位置参数的 value
def config(host,port,**kwargs):
print(type(kwargs))
print(kwargs)
print(host,port)
kwargs['host']=host
kwargs['port']=port
config(host=100,port=80)
--------------------------------------------------------
<class 'dict'>
{}
100 80
2 可变参数的特征(要注意的地方):
可变参数不允许使用关键字传参数;是优点也是缺点;
总结
1.有位置可变参数和关键字可变参数
2.位置可变参数在形参前使用一个星号*
3.关键字可变参数在形参前使用两个星号**
4.位置可变参数和关键字可变参数都可以收集若干个实参,位置可变参数收集形成一个tuple,关键字可变参数收集形成一个dict
5.混合使用参数的时候,可变参数要放到参数列表的最后,普通参数需要放到参数列表前面,位置可变参数需要在关键字可变参数之前
可变参数混合使用
配置信息打印
def showconfig(username, password, **kwargs)
def showconfig(username, *args, **kwargs)
def showconfig(username, password, **kwargs, *args)
3. 可变参数实例练习
按照标准写,不要为难别人;
1.
def fn(x,y,*args,**kwargs):
print(x)
print(y)
print(args)
print(kwargs)
# 变量名 x 重复赋值;
fn(3,5,a=1,b=2,x=40,y=69) #x不允许被赋予多个值;
-------------------------------------------------------------------
TypeError:fn() got multiple values for argument 'x'
# 关键字参数y 先从左到右识别;后是字典类型可变参数;
# 关键字传参数随便放位置:关键字参数就靠变量名字;
fn(5,a=1,b=2,y=30)
fn(a=1,b=2,x=5,y=8) #关键字传参数位置随便;注意程序运行的顺序;
-----------------------------------------------------------------------------------
5
30
()
{'a': 1, 'b': 2}
5
8
()
{'a': 1, 'b': 2}
2.
#练习2
def fn(*args,x,y,**kwargs):
print(x)
print(y)
print(args)
print(kwargs)
fn(3,5,7)
----------------------
3
5
(7,)
{}
fn(3,5,a=1,b='Python')
---------------------------------
3
5
()
{'a': 1, 'b': 'Python'}
fn(7,9,y=3,x=5,a=1,b='python')
----------------------------------------------------
TypeError: fn() got multiple values for argument 'y'