Python中的* args和** kwargs是什么?

功能就是生命。 对不对 如果您刚刚开始学习Python,那么,不管它是您的第一门编程语言,还是使用另一种语言来学习Python,那么您已经知道函数声明中的参数数量与调用该函数时传递的参数数量相对应。



这些是基础。 这可以帮助人们了解周围的世界。 但是,“参数数量等于参数数量”这样的语句在初学者的脑海中放置了一颗定时炸弹,当他在函数声明中看到神秘的*args**kwargs构造后就会触发。

不要让任何徽章将您带入昏迷状态。 这里没有古风。 通常,如果您不熟悉这些设计,建议您使用它们。

位置和命名参数


为了处理*args**kwargs ,我们需要掌握位置参数和命名参数的概念。

首先,让我们谈谈它们的不同之处。 在最简单的函数中,我们仅映射参数和参数的位置。 参数1对应于参数1,参数2对应于参数2,依此类推。

 def printThese(a,b,c):   print(a, "is stored in a")   print(b, "is stored in b")   print(c, "is stored in c") printThese(1,2,3) """ 1 is stored in a 2 is stored in b 3 is stored in c """ 

要调用函数,必须使用所有三个参数。 如果您至少跳过其中之一,则会显示一条错误消息。

 def printThese(a,b,c):   print(a, "is stored in a")   print(b, "is stored in b")   print(c, "is stored in c") printThese(1,2) """ TypeError: printThese() missing 1 required positional argument: 'c' """ 

如果在声明函数时为参数分配默认值,则在调用函数时不再需要指示相应的参数。 该参数变为可选。

 def printThese(a,b,c=None):   print(a, "is stored in a")   print(b, "is stored in b")   print(c, "is stored in c") printThese(1,2) """ 1 is stored in a 2 is stored in b None is stored in c """ 

当使用它们的名称调用函数时,也可以设置可选参数。

在下面的示例中,我们将三个参数设置为默认值None ,看看如何使用它们的名称分配它们,而不关注调用函数时使用的参数的顺序。

 def printThese(a=None,b=None,c=None):   print(a, "is stored in a")   print(b, "is stored in b")   print(c, "is stored in c") printThese(c=3, a=1) """ 1 is stored in a None is stored in b 3 is stored in c """ 

星号运算符


*运算符在人们中通常与乘法运算相关联,但是在Python中它具有另一种含义。

使用此运算符可以“解压缩”其中存储了某些元素的对象。 这是一个例子:

 a = [1,2,3] b = [*a,4,5,6] print(b) # [1,2,3,4,5,6] 

在这里,列表a的内容a取出,拆包并放在列表b

如何使用* args和** kwargs


因此,我们知道Python中的“星号”运算符能够从对象中“拉出”它们的组成元素。 我们也知道有两种类型的参数函数。 您可能已经想到了这一点,但以防万一,我会这样说。 即, *args是“自变量”(arguments)的缩写,而** kwargs是“关键字自变量”(keyword arguments)(命名自变量)的缩写。

这些构造中的每一个都用于解压缩对应类型的参数,从而使您可以调用具有可变长度的参数列表的函数。 例如-创建一个可以显示学生在测试中输入的结果的函数:

 def printScores(student, *scores):   print(f"Student Name: {student}")   for score in scores:      print(score) printScores("Jonathan",100, 95, 88, 92, 99) """ Student Name: Jonathan 100 95 88 92 99 """ 

声明函数时,我没有使用*args构造。 相反,我有*scores 。 这里有错误吗? 这里没有错误。 事实是“ args”只是一组用来表示参数的字符。 这里最重要的是*运算符。 而且,紧随其后的事情并没有发挥特殊作用。 使用*我们根据调用时传递给函数的内容创建了位置参数列表。

在找出*args ,理解**kwargs应该不再有问题。 再次,名称无关紧要。 最主要的是两个字符** 。 多亏了他们,创建了一个字典,其中包含在调用函数时传递给函数的命名参数。

 def printPetNames(owner, **pets):   print(f"Owner Name: {owner}")   for pet,name in pets.items():      print(f"{pet}: {name}") printPetNames("Jonathan", dog="Brock", fish=["Larry", "Curly", "Moe"], turtle="Shelldon") """ Owner Name: Jonathan dog: Brock fish: ['Larry', 'Curly', 'Moe'] turtle: Shelldon """ 

总结


以下是一些技巧,可帮助您避免在使用函数时出现的常见问题并扩展您的知识:

  • 使用常见的*args**kwargs构造捕获位置参数和命名参数。
  • **kwarg不能放在*args之前。 如果执行此操作,将显示一条错误消息。
  • 当计划将值作为**kwarg参数传递但该值的键名与命名参数的名称匹配时,请小心命名参数与**kwargs之间的冲突。
  • *运算符不仅可以在函数声明中使用,还可以在调用它们时使用。

亲爱的读者们! 在声明Python函数时,您最常使用哪些参数?

Source: https://habr.com/ru/post/zh-CN482464/


All Articles