day3-函数的非固定参数

背景

前面我们介绍了几种固定参数,传入的参数不管形参为默认还是标准都要一一对应,如果数目不固定怎么办?

参数组

  1. 非固定位置参数传参(*args)
  2. 非固定关键字传参(**kwargs)

1.非固定位置参数传参(*args)

用法:接收N个位置参数,转换成元组的方式

def test(*args): # *表示传的实际参数是不固定的,args为形参名,最好不要改成别的名字
     print(args)


test(1,2,3,4,5,7,6)    #传入多个位置参数
#输出
(1, 2, 3, 4, 5, 7, 6)     

1.1传入列表

def test(*args): 
     print(args)


test()
test(*[1,2,3,4,5,7,6])   #在传入的列表前加*,输出的结果为元组args = tuple([1,2,3,4,5,7,6])
test([1,2,3,4,5,7,6])   #在传入的列表前不加*,则列表被当做单个位置参数,所以输出的结果是元组中的一个元素
#输出
()           #空元组
(1, 2, 3, 4, 5, 7, 6)  
([1,2,3,4,5,7,6],)     

1.2位置参数和非固定位置参数组合

def test(x,*args):
    print(x)   #位置参数
    print(args)  #非固定位置参数

test(11,2,3,44,55,6,7,8,9)

#输出
11
(2, 3, 44, 55, 6, 7, 8, 9)

1.3关键字参数和非固定位置参数组合

def test(x,*args):
    print(x)
    print(args)
 
test(x=11,2,3,4,5,6)  

#输出
  File "/usercode/file3.py", line 6
    test(x=11,2,3,4,5,6)
             ^
SyntaxError: non-keyword arg after keyword arg #提示非关键字参数在关键字参数后面

#更正为
def test(*args,x):
    print(x)
    print(args)
 
test(2,3,4,5,6,x=11)  
#输出
11
(2, 3, 4, 5, 6)

上面的报错是因为x=1是关键字参数,*args是位置参数,而关键字参数不能在位置参数前面的,所以报错,我们更正为(位置参数 关键字参数)过来就没问题了。

2.非固定关键字传参(*args)

用法:把N个关键字参数,转换成字典的方式

def test(**kwargs):  # **表示传的实际参数是不固定的关键字参数,kwargs为形参名,最好不要改成别的名字
    print(kwargs)
    print(kwargs["name"])
    print(kwargs["age"])

 
test(name="dick",age=8)   #传入多个关键字参数

#输出
{'name': 'dick', 'age': 8}    #多个关键字参数转换成字典
dick
8

2.1传入字典

def test(**kwargs):
    print(kwargs)

test(**{'name': 'dick', 'age': 8})   #在传入字典时,一定要在字典前面加**,否则就会报错
#输出
{'name': 'dick', 'age': 8}

2.2位置参数和非固定关键字参数组合

def test(name,**kwargs):   #参数组一定放后面,否则报错!
      print(name)
      print(kwargs)

 
test("dick")  #1个位置参数
print("==============")
test("dick",age=18,sex='M') #2个位置参数
#输出
dick
{}   #如果没有传入关键字参数,kwargs就是一个空字典
==============
dick
{'sex': 'M', 'age': 18}

2.3非固定关键字参数和关键字及位置参数组合(参数组一定放后面,否则报错!

def test(name,age=18,**kwargs):
      print(name)
      print(age)
      print(kwargs)

print("第1种方式:")
test("dick") #1个位置参数

print("第2种方式:")
test("dick",28,sex='M',hobby='swimming')  #2个位置参数,2个关键字参数

print("第3种方式:")
test("dick",sex='M',hobby='swimming',age=28) #1个位置参数,3个关键字参数, age关键字参数放后面,也可以

#输出

第1种方式:
dick
18
{}

第2种方式:
dick
28
{'hobby': 'swimming', 'sex': 'M'}

第3种方式:
dick
28
{'hobby': 'swimming', 'sex': 'M'}

2.4非固定关键字参数**kwargs和位置参数及*args组

def test(name,*args,**kwargs):
     print(name)  
     print(args)    #传入非固定位置参数
     print(kwargs)  #传入字典

 
test("dick",age=18,sex='M')

#输出
dick
()   
{'age': 18, 'sex': 'M'}

小结

  1. 函数的参数有位置参数、关键字参数、默认参数、非固定位置参数(*args)和非固定关键字参数(**kwargs)
  2. 位置参数:须以正确的顺序传入参数。调用时的数量必须和声明时的一样
  3. 关键字参数:关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
  4. 默认参数:调用函数时,缺省参数的值如果没有传入,则被认为是默认值。
  5. 非固定位置参数(*args)和非固定关键字参数(**kwargs):本质是位置参数和关键字参数,遵循参数顺序原则:(位置参数 关键字参数)
posted @ 2017-08-07 11:28  Mr.hu  阅读(164)  评论(0编辑  收藏  举报