1.Python允许在形参前面添加一个星号(*),这样就意味着该参数可接收多个参数值,多个参数值被当成元组传入。
def test(a,*books):
print(books)
for b in books:
print(b)
print(a)
test(5,"疯狂IOS讲义","疯狂Python讲义")
运行上面的代码,可以看到如下结果:
("疯狂IOS讲义","疯狂Python讲义")
疯狂IOS讲义
疯狂Python讲义
5
2.正常情况下Python形参中最多只能有一个带“*”参数和一个带“**”参数,带“*”参数收集成元组。带“**”参数收集成字典,且采用关键字参数形式。
def test(x,y,z=3,*books,**scores):
print(x,y,z)
print(books)
print(scores)
test(1,2,3,"疯狂IOS讲义","疯狂Python讲义",语文=89,数学=94)
调用函数时,实参中的1,2,3会传给普通参数x,y,z;接下来的两个字符串会由books收集为元组;最后的两个关键字参数会被收集成字典。运行上面的代码,会得到如下结果:
1,2,3
("疯狂IOS讲义","疯狂Python讲义")
{"语文":89,"数学":94}
3.逆向参数收集
- 逆向参数收集是指在程序已有列表、元组、字典等对象的前提下,把他们的元素拆开后传给函数的参数。
- 逆向参数收集需要在传入的列表、元组参数之前添加一个星号,在字典参数之前添加两个星号。
def test(name,message):
print("用户:",name)
print("欢迎消息:",message)
my_list = ["孙悟空","欢迎来到疯狂软件"]
test(*my_list)
- 即使是支持收集的参数,如果程序需要将一个元组传给该参数,那么同样需要使用逆向收集。
def foo(name,*nums):
print("name参数:",name)
print("nums参数:",nums)
my_tuple = (1,2,3)
foo("fkit",*my_tuple)
运行结果为:
name参数:1
nums参数:(1,2,3)
如果不使用逆向收集,整个元组将会作为一个参数,而不是将元组的元素作为多个参数,例如按照以下方式调用foo函数:
foo(my_tuple)
运行结果为:
name参数:(1,2,3)
nums参数:()
my_tuple整体作为参数值传给name参数。
- 字典也支持逆向收集,字典将会以关键字参数的形式传入。
def bar(book,price,desc):
print(book,"这本书的价格是: ",price)
print("描述信息",desc)
my_dict = {"price":89,"book":"疯狂Python讲义","desc":"这是一本系统全面的Python学习图书"}
bar(**my_dict)