欢迎访问宙启技术站
智能推送

Python中如何使用不定数量的参数定义函数?

发布时间:2023-06-14 10:41:57

Python中,我们可以使用*args和**kwargs两个特殊的符号来定义不定数量的参数。其中,*args表示任意数量的位置参数,而**kwargs则表示任意数量的关键字参数。

使用*args定义函数

下面是一个使用*args定义函数的例子:

def say_hello(*names):
    for name in names:
        print(f'Hello, {name}!')

say_hello('Alice', 'Bob', 'Charlie')

运行上面代码后,将得到如下输出:

Hello, Alice!
Hello, Bob!
Hello, Charlie!

可以看到,我们在函数定义时使用了*names来定义函数参数,表示函数可以接受任意数量的位置参数。在函数体中,我们使用for循环遍历了所有传入的参数,并逐一打印出问候语句。

使用**kwargs定义函数

下面是一个使用**kwargs定义函数的例子:

def make_cookie(**ingredients):
    print('Making cookies with the following ingredients:')
    for name, amount in ingredients.items():
        print(f'{name}: {amount}')

make_cookie(flour=2, sugar=1, eggs=2)

运行上面代码后,将得到如下输出:

Making cookies with the following ingredients:
flour: 2
sugar: 1
eggs: 2

可以看到,我们在函数定义时使用了**ingredients来定义函数参数,表示函数可以接受任意数量的关键字参数。在函数体中,我们使用items()方法遍历了所有传入的参数,并逐一打印出每个参数的名字和值。

同时使用*args和**kwargs定义函数

有时候,我们需要同时使用*args和**kwargs来定义函数。如果同时使用这两个符号,那么*args需要放在**kwargs之前,否则程序会报错。下面是一个同时使用*args和**kwargs定义函数的例子:

def send_email(*recipients, subject='', body=''):
    print(f'Sending email to: {", ".join(recipients)}')
    print(f'Subject: {subject}')
    print(f'Body:
{body}')

send_email('alice@example.com', 'bob@example.com', 
           subject='Meeting tomorrow', 
           body='Hi there, we have a meeting tomorrow at 10am in room 203.')

运行上面代码后,将得到如下输出:

Sending email to: alice@example.com, bob@example.com
Subject: Meeting tomorrow
Body:
Hi there, we have a meeting tomorrow at 10am in room 203.

可以看到,我们在函数定义时既使用了*recipients来表示任意数量的位置参数,又使用了**kwargs来表示任意数量的关键字参数。在函数体中,我们使用join()方法将所有接收者的列表转换为字符串,并逐一打印出邮件的主题和正文。注意到我们在调用函数时,只传入了位置参数和关键字参数,并没有指定参数名,这是因为位置参数和关键字参数的顺序已经在函数定义时规定好了。

总结

在Python中,使用*args和**kwargs可以方便地定义接受任意数量的位置参数和关键字参数的函数。使用*args时,函数会把所有传入的位置参数封装为一个元组并传递给函数;使用**kwargs时,函数会把所有传入的关键字参数封装为一个字典并传递给函数。同时使用这两个符号时,需要将*args放在**kwargs之前。在函数体中,我们可以使用for循环来遍历所有传入的参数,并执行相应的操作。