MST
星途 面试题库

面试题:Python中*args和**kwargs在传递任意数量实参时的区别及应用场景

阐述*args和**kwargs在Python函数定义中的区别,并分别举例说明它们适用于哪些不同的实际编程场景。另外,编写一个函数,既能接受任意数量的位置实参,又能接受任意数量的关键字实参,函数将这些参数打印出来,并在打印前对它们进行一定的格式处理。
40.8万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
  1. *args**kwargs 的区别
    • *args
      • 在Python函数定义中,*args 用于收集所有位置参数(即没有参数名,按顺序传入的参数),并将它们作为一个元组传递给函数。它的名字 args 可以自定义,但通常习惯用 args
      • 例如:
def print_args(*args):
    for arg in args:
        print(arg)


print_args(1, 'hello', [1, 2, 3])
 - **适用场景**:当你不确定函数会接收到多少个位置参数时,就可以使用 `*args`。比如在实现一个计算多个数之和的函数时:
def sum_numbers(*args):
    total = 0
    for num in args:
        if isinstance(num, (int, float)):
            total += num
    return total


result = sum_numbers(1, 2, 3.5)
print(result)
  • **kwargs
    • **kwargs 用于收集所有关键字参数(即带有参数名的参数),并将它们作为一个字典传递给函数。同样,kwargs 这个名字可以自定义,但通常用它。
    • 例如:
def print_kwargs(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")


print_kwargs(name='Alice', age=30, city='New York')
 - **适用场景**:当你不确定函数会接收到多少个关键字参数,或者你想以一种灵活的方式传递参数时,适合使用 `**kwargs`。比如在实现一个根据不同配置执行不同操作的函数时:
def perform_action(**kwargs):
    if 'action' in kwargs:
        if kwargs['action'] == 'print':
            print(kwargs.get('message', 'No message provided'))
        elif kwargs['action'] == 'add':
            num1 = kwargs.get('num1', 0)
            num2 = kwargs.get('num2', 0)
            print(num1 + num2)


perform_action(action='print', message='Hello, world!')
perform_action(action='add', num1=5, num2=3)
  1. 编写既能接受任意数量位置实参又能接受任意数量关键字实参的函数
def format_and_print(*args, **kwargs):
    print("Position arguments:")
    for index, arg in enumerate(args, start = 1):
        print(f"  Arg {index}: {arg}")
    print("Keyword arguments:")
    for key, value in kwargs.items():
        print(f"  {key}: {value}")


format_and_print(1, 'two', [3], name='John', age=25)