所谓逆向参数收集,指的是在程序已有列表、元组、字典等对象的前提下,把它们的元素“拆开”后传给函数的参数。
逆向参数收集需要在传入的列表、元组参数之前添加一个星号,在字典参数之前添加两个星号
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/01
# @Author : Laopi
def test(name,course):
print("name的参数:",name)
print("course的参数是:",course)
listdemo = ["测试划水老师傅","软件测试"]
test(*listdemo)
上面test(name,course)代码定义了一个需要两个参数的函数,而程序中的listdemo列表包含两个元素,为了让程序将 listdemo列表的两个元素传给 test()函数,程序在传入的listdemo参数之前添加了一个星号。实际上,即使是支持收集的参数,如果程序需要将一个元组传给该参数,那么同样需要使用逆向收集。例如如下代码
def test1(name,*course):
print("name的参数:",name)
print("course的参数是:",course)
listdemo = ["语文","数学","英语"]
test1("测试划水老师傅",*listdemo)
上面test1("测试划水老师傅",*listdemo)代码调用将测试划水老师傅传给test1()函数的name参数,然后使用逆向收集将listdemo包含的多个元素传给course参数,course再将listdemo的多个元素收集成元组。
运行完之后如下:
此外也可以用下面的方式调用test1()函数
#使用逆向手机,将listdemo的第一个元素传给name参数,剩下的传给course
test1(*listdemo)
运行结果如下:
如果不使用逆向收集(不在元组参数之前添加星号),整个元组将会作为一个参数,而不是将元组的元素作为多个参数。例如按如下方式调用test1()函数
#不使用逆向收集,listdemo整体作为参数值传给name参数。
test1(listdemo)
上面调用没有使用逆向收集,因此my tuple整体作为参数值传给name参数。运行上面代码
将看到如下输出结果
字典也支持逆向收集,字典将会以关键字参数的形式传入。例如如下代码(程序清单同上)。
def msg(name,course,score):
print(name,course,"的成绩是",score)
dictdemo = {'name':'测试划水老师傅','course':'语文','score':90}
#按逆向收集的方式将listdemo的多个key-value对传给msg()函数
msg(**dictdemo)
上面def msg(name,course,score):代码定义的msg()需要三个参数。接下来程序定义了一个dictdemo字典,该字典正好包含三个key-value对程序使用逆向收集即可将mydict包含的三个key-value对以关键字参数的形式传给msg()函数。