公zhong号:小白的大数据之旅

在Python中,*args 和 **kwargs 是用于函数定义中的特殊语法,它们允许函数接收可变数量的参数。*args 用于接收任意数量的位置参数(非关键字参数),而 **kwargs 用于接收任意数量的关键字参数。

如何运用Python中函数的魔法参数,*args 和 **kwargs 真的很重要!!!_参数

*args

*args 允许你将不定长度的参数列表传递给一个函数。这些参数在函数内部被打包成一个元组(tuple)。使用 *args 时,你可以向函数传递任意数量的位置参数。

参考链接:

定义:

*args用于接收不定数量的位置参数,这些参数在函数内部被存储在一个元组中。

用法:

在函数定义时,使用*args作为参数名(虽然args是习惯用法,但实际上可以使用任何名称),函数就可以接收任意数量的位置参数。

工作原理

*args用于接收任意数量的非关键字(位置)参数,这些参数在函数内部被存储为一个元组(tuple)。当函数被调用时,所有传入的位置参数都会被收集到这个元组中,并在函数体内以元组的形式进行访问和处理。

使用场景

  1. 函数需要接收任意数量的位置参数:
  • 当函数需要处理不确定数量的位置参数时,可以使用*args。这些参数在函数内部被存储为一个元组,从而允许函数进行迭代或其他操作。
  • 例如,编写一个计算任意数量数字总和的函数时,可以使用*args来接收这些数字。
  1. 与默认参数、关键字参数混合使用:
  • 在函数定义中,*args通常位于默认参数和关键字参数之前,以接收所有未明确指定的位置参数。
  • 这种灵活性使得函数能够同时处理固定数量的默认参数、可选的关键字参数以及任意数量的位置参数。
  1. 简化函数调用:
  • 在某些情况下,使用*args可以简化函数调用,尤其是当需要传递大量位置参数时。
  • 例如,在调用一个需要多个参数的API时,可以使用*args将参数列表解包为位置参数。

示例

def my_function(*args):
    for arg in args:
        print(arg)

my_function(1, 2, 3)

输出:

1
2
3

在这个例子中,my_function 接收了三个位置参数,这些参数在函数内部被打包成了元组 args。然后,函数通过循环遍历并打印这些参数。

案例

计算任意数量数字的和

# 定义一个函数,使用*args接收任意数量的位置参数
def sum_numbers(*args):
    total = 0  # 初始化总和为0
    for number in args:  # 遍历args元组中的每个数字
        total += number  # 将数字加到总和中
    return total  # 返回总和

# 调用函数,传入任意数量的数字
result = sum_numbers(1, 2, 3, 4, 5)
print(f"The sum of the numbers is: {result}")  # 输出结果

运行结果

The sum of the numbers is: 15
  • def sum_numbers(args)::定义一个名为sum_numbers的函数,使用args接收任意数量的位置参数。
  • total = 0:初始化一个名为total的变量,用于存储数字的总和。
  • for number in args::遍历args元组中的每个元素(即传入的数字)。
  • total += number:将每个数字加到total中。
  • return total:返回数字的总和。
  • result = sum_numbers(1, 2, 3, 4, 5):调用sum_numbers函数,传入5个数字,并将返回的结果存储在result变量中。
  • print(f"The sum of the numbers is: {result}"):打印结果。

动态参数传递和计算

# 定义一个加法函数,使用*args接收任意数量的位置参数
def add(*nums):
    return sum(nums)  # 使用sum函数计算总和

# 定义一个乘法函数,使用*args接收任意数量的位置参数
def multiply(*nums):
    result = 1
    for num in nums:
        result *= num  # 遍历每个数字并相乘
    return result

# 调用加法函数
print(add(1, 2, 3, 4, 5))  # 输出15

# 调用乘法函数
print(multiply(2, 3, 4, 5))  # 输出120

运行结果

15
120
  • def add(*nums): 和 def multiply(nums)::分别定义加法和乘法函数,使用args接收任意数量的位置参数。
  • return sum(nums) 和 result *= num:分别计算总和和乘积。
  • print(add(1, 2, 3, 4, 5)) 和 print(multiply(2, 3, 4, 5)):调用函数并打印结果。

与默认参数结合使用

# 定义一个函数,使用*args接收任意数量的位置参数,并有一个默认参数
def greet(*args, greeting="Hello"):
    print(greeting, " ".join(map(str, args)))  # 将args转换为字符串并用空格连接

# 调用函数,传入不同数量的位置参数
greet("Alice", "Bob")  # 输出Hello Alice Bob
greet("Charlie", greeting="Hi")  # 输出Hi Charlie

运行结果

Hello Alice Bob
Hi Charlie
  • def greet(args, greeting=“Hello”)::定义一个函数,使用args接收任意数量的位置参数,并有一个默认参数greeting。
  • print(greeting, " ".join(map(str, args))):将args转换为字符串列表,用空格连接,并与greeting一起打印。
  • greet(“Alice”, “Bob”) 和 greet(“Charlie”, greeting=“Hi”):调用函数并传入不同数量的位置参数和关键字参数。

注意事项

  1. 位置:args必须放在函数参数列表的最后面,因为它会接收所有剩余的位置参数。如果在它之后还有其他参数,Python解释器将无法判断哪些参数应该传递给args。
  2. 命名:虽然习惯上使用“args”作为参数名,但实际上可以使用任何名称。但无论使用什么名称,前面的星号(*)是必不可少的,它表示该参数将接收任意数量的位置参数。
  3. 可读性:使用args会降低代码的可读性,因为调用者需要知道函数接收哪些参数,以及如何传递这些参数。因此,在编写函数时,应该尽量避免使用args,除非确实需要接收任意数量的位置参数。
  4. 性能:在函数调用时,使用args会导致额外的计算开销,因为需要将所有的位置参数打包成元组。因此,在性能敏感的场景中,应该谨慎使用args。

**kwargs

**kwargs 允许你将不定长度的关键字参数传递给一个函数。这些参数在函数内部被打包成一个字典(dictionary)。使用 **kwargs 时,你可以向函数传递任意数量的关键字参数(即形式为 key=value 的参数)。

参考链接

如何运用Python中函数的魔法参数,*args 和 **kwargs 真的很重要!!!_python_02

定义:

**kwargs用于接收不定数量的关键字参数,这些参数在函数内部被存储在一个字典中。

用法:

在函数定义时,使用**kwargs作为参数名(同样,kwargs是习惯用法,实际上可以使用任何名称),函数就可以接收任意数量的关键字参数。

工作原理

**kwargs用于接收任意数量的关键字参数,这些参数在函数内部被存储为一个字典(dictionary)。当函数被调用时,所有传入的关键字参数都会被收集到这个字典中,并在函数体内以字典的形式进行访问和处理。

使用场景

  1. 函数需要接收任意数量的关键字参数:
  • 当函数需要处理不确定数量的关键字参数时,可以使用**kwargs。这些参数在函数内部被存储为一个字典,从而允许函数进行键值对访问或其他操作。
  • 例如,编写一个打印学生信息的函数时,可以使用**kwargs来接收学生的姓名、年龄、专业等任意数量的关键字参数。
  1. 提供灵活的函数接口:
  • **kwargs允许函数具有非常灵活的接口,可以接受任意数量的可选参数。
  • 这对于编写可配置性高的函数或方法非常有用,因为调用者可以传递任意数量的关键字参数来定制函数的行为。
  1. 处理动态参数:
  • 在某些情况下,函数的参数可能是动态的,即在函数定义时无法确定具体的参数名称和数量。
  • 使用**kwargs可以方便地处理这种情况,因为函数可以接收任意数量的关键字参数,并在函数内部根据需要进行处理。
  1. 与类构造函数结合使用:
  • 在面向对象编程中,**kwargs常用于类的构造函数中,以提供灵活的初始化方式。
  • 通过使用**kwargs,类的实例化时可以传递任意数量的关键字参数,并在构造函数内部将其设置为对象的属性。

示例

def my_function(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

my_function(name="Alice", age=30, city="New York")

输出:

name: Alice
age: 30
city: New York

案例

打印学生的信息

# 定义一个函数,使用**kwargs接收任意数量的关键字参数
def print_student_info(**kwargs):
    for key, value in kwargs.items():  # 遍历kwargs字典中的每个键值对
        print(f"{key.capitalize()}: {value}")  # 输出键(首字母大写)和值

# 调用函数,传入任意数量的关键字参数
print_student_info(name="Alice", age=20, major="Computer Science")

运行结果

Name: Alice
Age: 20
Major: Computer Science
  • def print_student_info(kwargs)::定义一个名为print_student_info的函数,使用kwargs接收任意数量的关键字参数。
  • for key, value in kwargs.items()::遍历kwargs字典中的每个键值对。
  • print(f"{key.capitalize()}: {value}"):输出键(使用capitalize()方法将首字母大写)和值。
  • print_student_info(name=“Alice”, age=20, major=“Computer Science”):调用print_student_info函数,传入3个关键字参数(name、age和major),并打印它们。

动态配置参数

# 定义一个函数,使用**kwargs接收任意数量的关键字参数
def configure_settings(**kwargs):
    for key, value in kwargs.items():
        print(f"{key.upper()}: {value}")  # 将键转换为大写并打印

# 调用函数,传入不同数量的关键字参数
configure_settings(theme="dark", fontsize=12, language="en")

运行结果

THEME: dark
FONTSIZE: 12
LANGUAGE: en
  • def configure_settings(kwargs)::定义一个函数,使用kwargs接收任意数量的关键字参数。
  • for key, value in kwargs.items()::遍历kwargs字典中的每个键值对。
  • print(f"{key.upper()}: {value}"):将键转换为大写并打印键值对。
  • configure_settings(theme=“dark”, fontsize=12, language=“en”):调用函数并传入不同数量的关键字参数。

与位置参数和默认参数结合使用

# 定义一个函数,使用位置参数、默认参数和**kwargs接收参数
def process_data(filename, mode="r", **kwargs):
    print(f"Filename: {filename}")
    print(f"Mode: {mode}")
    for key, value in kwargs.items():
        print(f"{key}: {value}")

# 调用函数,传入位置参数和关键字参数
process_data("data.txt", encoding="utf-8", newline="\n")

输出结果

Filename: data.txt
Mode: r
encoding: utf-8
newline:
  • def process_data(filename, mode=“r”, kwargs)::定义一个函数,使用位置参数filename、默认参数mode和kwargs接收参数。
  • print(f"Filename: {filename}“) 和 print(f"Mode: {mode}”):打印位置参数和默认参数。
  • for key, value in kwargs.items()::遍历kwargs字典中的每个键值对。
  • print(f"{key}: {value}"):打印键值对。
  • process_data(“data.txt”, encoding=“utf-8”, newline=“\n”):调用函数并传入位置参数和关键字参数。

注意事项

  1. 位置:与*args类似,**kwargs也必须放在函数参数列表的最后面,因为它会接收所有剩余的关键字参数。
  2. 命名:虽然习惯上使用“kwargs”作为参数名,但实际上可以使用任何名称。但无论使用什么名称,前面的双星号(**)是必不可少的,它表示该参数将接收任意数量的关键字参数。
  3. 可读性:与*args一样,使用kwargs也会降低代码的可读性。因此,在编写函数时,应该尽量避免使用kwargs,除非确实需要接收任意数量的关键字参数。
  4. 参数覆盖:当kwargs与其他关键字参数一起使用时,需要注意避免参数覆盖的问题。如果函数已经定义了与kwargs中某个键相同的关键字参数,那么**kwargs中的该键的值将不会被传递给函数,而是会被忽略。
  5. 性能:与*args类似,在函数调用时使用kwargs也会导致额外的计算开销,因为需要将所有的关键字参数打包成字典。因此,在性能敏感的场景中,应该谨慎使用kwargs。