*和**在Python中意味着什么?它与指针和地址有关吗?

*和**有很多用途:

  • (* )是乘法运算符(或者在字符串的情况下是重复运算符)。其他库中的类可能出于其他原因使用’*’,但几乎总是以某种形式乘法。
  • (**)是一个指数运算符,在正常数字中是计算的数学方法x ** yXÿ
    但这些都是不足为奇的用法 - 每个开发人员都可能知道的用法; 但我认为问题几乎肯定与常见但最不期望的地方有关(至少对于初学者来说):

函数中的变量参数

运算符*和**出现在函数定义中 - 例如:

def func (* args ,** kwargs ): 
	print(args ,kwargs )

要了解它们的作用,您需要了解位置和关键字参数。

函数的关键字参数是最容易解释的,因为传递给表单中函数的任何参数都是关键字参数。接下来,位置参数是函数调用的所有参数,而不是关键字参数。 <argument_name>=

回到我们的函数定义(如上所述)是将所有位置参数收集到单个元组(被调用)中的指令,并且是将所有关键字参数一起收集到一个名为的单个字典中的指令。名称和常见约定 - 您可以将它们称为任何您想要的。*argsargs**kwargskwargsargskwargs

调用此函数的一个示例是:

>>> FUNC (1 ,2 ,3 ,一个= 4 ,b = 5 ,C ^ = 6 )
(1 ,2 ,3 ){ 'A' :4 ,'B' :5 ,'C' :6 }  		

正如您所看到的,参数1,2和3被收集到被调用的元组中args,并且关键字参数a,b和c被收集到名为的字典中kwargs。

您甚至可以混合和正常位置和关键字参数一起:*args**kwargs

def func2 (a ,b ,* args ,c = None ,d = None ,** kwargs ):  
	print(a ,b ,args )
	print ('c =' ,c ,'d =' ,d ,kwargs )  

这里前两个位置参数分别传递给a&b- 并且任何剩余的位置参数都被打包到args元组中。
此外,c&dkeywords参数被正常捕获(如果未提供,则使用默认值),并且任何其他关键字参数都将打包到kwargs字典中。

例如 :

>>> FUNC2 (1 ,2 ,3 ,4 ,Ç = 6 ,d = 7 ,ë = 8 ,˚F = 9 )   
1 2 (3 ,4 )  	 
c = 6   d = 7 { 'e' :8 ,'f' :9 }

在所有情况下args和kwargs(或任何你称之为的)都可以为空 - 例如 - 使用上面的func2函数:

>>> FUNC2 (1 ,2 ,Ç = 6 ,d = 7 ) 
1 2 ()   
c = 6 d = 7 {}  	

在这个调用中,只有两个位置参数,它们是在参数a&中捕获的b,因此没有可以打包到args元组中。类似地,只有两个关键字参数(c&d),因此没有额外的关键字参数可以打包到kwargs字典中。

开箱

正如您可以在函数定义中使用*和**运算符将函数的参数打包到元组或字典中(如上所述),您也可以使用它们将元组或字典解包为函数参数。例如,使用此功能:

def func3 (a ,b ):
	print(a ,b )

这个函数需要两个位置参数 - 如果你已经在元组中有这两个参数,你可以做两件事之一:

>>> T0 = (0 ,1 ) 
>>> func3 (t0 [ 0 ],t0 [ 1 ])
0 1	
>>> func3 (* t0 ) 
0 1	 

这里的运算符将元组解压缩为位置参数。尽管两者在功能上是等价的,但使用运算符的方法大约是另一个版本执行时间的60%,并且更具可读性(也不太可能出错)。

类似地,可以将字典解压缩为关键字参数 - 使用此函数接受关键字参数:

DEF FUNC4 (KW1 = 0 ,KW2 = 1 ): 
	print(KW1 ,KW2 }

如果您有一个包含所需值的字典,则还有两个选项:

>>> D0 = { 'KW1' :10 ,'KW2' :11 }  
>>> FUNC4 (KW1 = D0 [ 'KW1' ],KW2 = D0 [ 'KW2' ])
10 11 	
>>> func4 (** d0 )
10 11	

第二个选项 - 使用字典解包更容易阅读,不太可能出错,并且快70%左右。
微信公众号“全栈学习窝”

猜你喜欢

转载自blog.csdn.net/gzyiCG/article/details/91957863
今日推荐