一文带你精通Python中*args和**kwargs的应用技巧

 更新时间:2024年03月13日 14:53:05   作者:python慕遥  
如果能在Python中创建适应不同场景的函数,而无需每次都重写它们,会使得操作简洁方便,这就是*args和**kwargs的魔力所在,下面我们就来看看它们的具体一些应用技巧吧

大家好,如果能在Python中创建适应不同场景的函数,而无需每次都重写它们,会使得操作简洁方便,这就是*args和**kwargs的魔力所在。就像为函数准备了一个神奇的袋子,可以装下任意多的参数——使代码更整洁、更灵活。

为了帮助大家更好地理解Python中的*args和**kwargs,接下来展示一下如果没有这些概念,代码将会是什么状态。

这里展示一个简单的函数simple_sum,用于将两个数字相加:

def simple_sum(a, b):
    return a + b
 
result = simple_sum(3, 7)
print(result)

想象一下如果想创建一个将三个数字相加的函数,最终可能会以如下方式重写这个函数:

def simple_sum_three(a, b, c):
    return a + b + c
 
result_three = simple_sum_three(3, 7, 5)
print(result_three)

如果想将更多的数字相加,不得不为每种情况创建新函数,这既不优雅也不灵活。为了解决这个问题,有一个称为“参数打包”的概念,可以在函数定义语句中使用*符号,将一个参数转换为超级参数,它可以作为一个袋子,并在调用函数时容纳/打包传递它的所有值,存储在一个变量中。

同样,符号*也可以用于解包数据结构,具体取决于它的使用方式,本文将在后面介绍如何做到这一点。

1.使用*args进行参数打包

在Python中,当在函数定义中看到一个星号(*)紧跟在一个参数前面时,这是参数打包的信号。这意味着可以向函数传递任意数量的参数,它们将被整洁地打包成一个元组。就像为函数准备了一个神奇的袋子,使它能够适应不同的情况,而无需不断地重写函数。

def magic_sum(*args):
    result = sum(args)
    return result
 
# 三个数字相加
result1 = magic_sum(3, 7, 5)
print("Result 1:", result1)  # 预期输出:15(3+7+5)
 
# 五个数字相加
result2 = magic_sum(1, 2, 3, 4, 5)
print("Result 2:", result2)  # 预期输出:15(1+2+3+4+5)
 
# 相加更多数字
result3 = magic_sum(10, 20, 30, 40, 50, 60)
print("Result 3:", result3)  # 预期输出:210(10+20+30+40+50+60)

在这个示例中,magic_sum函数使用*args进行参数打包。可以使用不同数量的参数调用这个函数,它会将这些参数整洁地打包成一个元组进行加法运算。在这种情况下,变量args就变成了一个元组。就像有了一个可以处理任意数量输入的计算器,而无需更改其公式。

2.参数解包

另一方面,在调用函数时,可以使用星号(*)表示正在解包一个值序列(元组、列表、集合、字符串),并将其元素作为单独的值传递。这种方法适用于将数据保存在集合(例如元组)中,但希望从集合中提取每个值,并将其作为单独参数传递给函数的情况。

def display_values(a, b, c):
    print("Value of a:", a)
    print("Value of b:", b)
    print("Value of c:", c)
 
# 解包一个元组并将其元素作为单独的值传递
tuple_values = (7, 14, 21)
display_values(*tuple_values) # 等同于 display_values(7, 14, 21)

可以使用此方法从多个集合类型数据中提取值:

def display_values(a, b, c):
    print("Value of a:", a)
    print("Value of b:", b)
    print("Value of c:", c)
 
# 解包一个元组并将其元素作为单独的值传递
tuple_values = (7, 14, 21)
display_values(*tuple_values)  # 等同于 display_values(7, 14, 21)
 
# 解包一个列表
list_values = [30, 40, 50]
display_values(*list_values)  # 等同于 display_values(30, 40, 50)
 
# 解包一个字符串(每个字符成为单独的参数)
string_values = "XYZ"
display_values(*string_values)  # 等同于 display_values('X', 'Y', 'Z')
 
# 解包一个集合
set_values = {60, 70, 80}
display_values(*set_values)  # 顺序可能会有变化,等同于 display_values(60, 70, 80)
 
# 解包一个范围
range_values = range(3, 6)
display_values(*range_values)  # 等同于 display_values(3, 4, 5)

还可以将函数定义部分的a、b、c更改为values以接收可变数量的参数。values将成为传递的所有参数的元组。这可以理解为同时进行打包和解包。

def display_values(*values): # 将数值打包到一个变量中。
    print("Values:", values)
 
# 解包一个元组并将其元素作为单独的值传递
tuple_values = (7, 14, 21)
display_values(*tuple_values)

3.使用**进行关键字参数打包

接下来,本文将使用双星号(**),这是Python的一个运算符,它将字典的打包和解包引入其中。当一个函数参数以“**”为前缀时,它表示相应的参数应该是键值对,并整齐地打包成一个字典。这与元组参数的打包相同,但用于函数参数为关键字参数的情况。

def display_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")
 
# 在函数调用中直接传递关键字参数
display_info(name='Alice', age=25, city='Wonderland')

4.关键字参数解包

解包字典,并将其内容作为单独的关键字参数传递给函数。这种方法适用于将数据保存在字典中,但又想从字典中提取每个键值对,并将其作为单独的关键字参数传递给函数的情况:

def display_person_info(name, age, city):
    print("Name:", name)
    print("Age:", age)
    print("City:", city)
 
# 解包一个包含预期键值对的字典
person_info = {'name': 'Alice', 'age': 25, 'city': 'Wonderland'}
display_person_info(**person_info)

5.结合使用*args和**kwargs

结合*args和**kwargs的力量,将它们分别视为长度可变的位置参数列表和关键字参数列表。

def display_information(*args, **kwargs):
    print("Positional Arguments (*args):")
    for arg in args:
        print(arg)
 
    print("\nKeyword Arguments (**kwargs):")
    for key, value in kwargs.items():
        print(f"{key}: {value}")
 
# 使用位置参数和关键字参数的混合调用函数
display_information(1, 'apple', name='Alice', age=25, city='Wonderland')

在此示例中,display_information函数接收*args以处理任意数量的位置参数,接收**kwargs以处理任意数量的关键字参数,然后该函数分别打印每种类型的参数。

6.一次性进行多次解包

Python中的另一个有趣功能是能够在单个函数调用中执行多次解包。

def display_values(*args):
    for value in args:
        print(value)
 
# 在单个函数调用中进行多次解包
list_values = [1, 2, 3]
tuple_values = (4, 5, 6)
set_values = {7, 8, 9}
 
display_values(*list_values, *tuple_values, *set_values)

在此示例中,display_values函数使用多次解包以单行方式调用三种不同的可迭代类型(列表、元组和集合)。在函数调用期间,通过多次解包(*list_values,*tuple_values,*set_values)收集所有值,存储在单个args参数中。

到此这篇关于一文带你精通Python中*args和**kwargs的应用技巧的文章就介绍到这了,更多相关Python *args **kwargs内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python提取特定时间段内数据的方法实例

    Python提取特定时间段内数据的方法实例

    今天小编就为大家分享一篇关于Python提取特定时间段内数据的方法实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • python批量替换多文件字符串问题详解

    python批量替换多文件字符串问题详解

    批量替换是我们在日常工作中经常会遇到的一个问题,下面这篇文章主要给大家介绍了关于python批量替换多文件字符串问题的相关资料,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • python中类的输出或类的实例输出为<__main__类名 object at xxxx>这种形式的原因

    python中类的输出或类的实例输出为<__main__类名 object at xxxx>这种形式的原因

    在本篇文章里小编给大家分享了关于python中类的输出或类的实例输出为何是<__main__类名 object at xxxx>这种形式,需要的朋友们可以参考下。
    2019-08-08
  • Python数据结构与算法之字典树实现方法示例

    Python数据结构与算法之字典树实现方法示例

    这篇文章主要介绍了Python数据结构与算法之字典树实现方法,可实现针对单词出现次数的统计功能,涉及Python树结构的定义、遍历及统计等相关操作技巧,需要的朋友可以参考下
    2017-12-12
  • python无序链表删除重复项的方法

    python无序链表删除重复项的方法

    这篇文章主要介绍了python无序链表删除重复项的方法,本文给大家介绍的非常详细,具体一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • Python简单生成8位随机密码的方法

    Python简单生成8位随机密码的方法

    这篇文章主要介绍了Python简单生成8位随机密码的方法,结合实例形式分析了2种简单生成随机密码的方法,非常简单实用,需要的朋友可以参考下
    2017-05-05
  • django 利用Q对象与F对象进行查询的实现

    django 利用Q对象与F对象进行查询的实现

    这篇文章主要介绍了django 利用Q对象与F对象进行查询的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Python类继承及super()函数使用说明

    Python类继承及super()函数使用说明

    这篇文章主要介绍了Python类继承及super()函数使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Python中threading库实现线程锁与释放锁

    Python中threading库实现线程锁与释放锁

    threading用于提供线程相关的操作,为了保证安全的访问一个资源对象,我们需要创建锁。那么Python线程锁与释放锁如何实现,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Python数据结构与算法之使用队列解决小猫钓鱼问题

    Python数据结构与算法之使用队列解决小猫钓鱼问题

    这篇文章主要介绍了Python数据结构与算法之使用队列解决小猫钓鱼问题,结合实例形式分析了Python使用队列实现小猫钓鱼游戏的算法操作技巧,代码中备有较为详尽的注释便于读者理解,需要的朋友可以参考下
    2017-12-12

最新评论