本章将详细介绍python中*与**操作符的使用场景以及注意事项,并给出示例demo。
1.作为运算符
*表示乘法运算
**表示乘方运算
代码 示例:
#1.* ** 作为运算符 print('\n------运算符测试------') a = 3*2 #乘法 b = 3**2 #乘方 print("a = ", a) #输出6 print("b = ", b) #输出9
执行结果:
2.作为函数形参
*在python中做函数形参,表示的是一个可变长度的序列,类型为tuple,即将所有参数放入一个元组(tuple)中,被函数使用。
**在python中做函数形参,表示的是一个可变长度的序列,类型为dict,即将所有的关键字参数,放入一个字典(dict)中, 被函数使用。
*与**作为形参同时出现时,**必须在最后面.
代码示例:
#2.作为形参 print('\n------形参测试------') def printx(*arg1, **arg2): print("arg1={0}, type:{1}".format(arg1, type(arg1))) print("arg2={0}, type:{1}".format(arg2, type(arg2))) #调用 P1 = printx(1,2, key1=1, key2=2)
代码执行结果:
3.作为函数实参
在list/tuple/set前加*,会把序列中的所有元素解包成位置参数
在dict前加*,会把dict的键变成位置参数;加**,把字典的键值对变成关键字参数。
A = (a,b,c)
B = {“key1” :1, “key2”:2}
P3 = Printx(*A) # 等同于printx(a,b,c)
P3 = Printx(*A, *B) #等同于printx(a,b,c,key1,key2)
P3 = Printx(*A, **B) #等同于printx(a,b,c,key1=1,key2=2)
代码示例:
def printx(*arg1, **arg2): print("arg1={0}, type:{1}".format(arg1, type(arg1))) print("arg2={0}, type:{1}".format(arg2, type(arg2))) #3.实参测试 print('\n------实参测试------') A = (1,2,3) K1 = {'key1':1, 'key2':2} P2 = printx(*A, *K1) #注意在dict前加一个*,只把dict的 '键' 作为位置参传递 print('') P3= printx(*A, **K1)
执行结果:
4. 作为序列解包
注意序列解包时*解包为list,不再是tuple了
1. 先对不带*的变量解包,剩余的数据在划分给带*的变量
x,y,*z = 1,2,3,4,5 #等同于 x=1, y = 2, z= [3,4,5]
X,*y,z = 1,2,3,4,5 #等同于 x=1, y = [2,3,4], z= 5
2. 如果左值比右值要多,那么带 * 的变量默认为空列表
x,y,*z = 1,2 #等同于 x=1, y = 2, z= []
x,*y,z = 1,2 #x=1, y = [], z= 2
3. 单*只解包dict的键, **解包dict键值对
key_A = {‘key1’:1, ‘key2’:2}
key_B = {“key3” :3, “key4”:4}
X = {*key_A} #等同于x= {‘key1’, ’key2’}
X = {**key_A} #等同于x= {‘key1’:1, ‘key2’:2}
X = {**key_A, **key_B} #等同于组包,x={‘key1’:1, ‘key2’:2, “key3” :3, “key4”:4}
注意:组包时,若键相同,则用后面的键值替换前面的,即最终合并后,为后面的键值对。
代码示例:
#4.解包测试 print('\n------解包测试------') x,y,*z = 1,2,3,4,5 print("x={0}, y= {1}, z={2}".format(x,y,z)) x,*y,z = 1,2,3,4,5 print("x={0}, y= {1}, z={2}".format(x,y,z)) x,*y,z = 1,2 print("x={0}, y= {1}, z={2}".format(x,y,z)) x,y,*z = 1,2 print("x={0}, y= {1}, z={2}".format(x,y,z)) #解包&组包 K2 = {'key3':3, 'key4':4} K3 = {'key5':5, 'key6':6} k4 = {**K2, **K3} print("k4=", k4)
执行结果:
注意
在Python中默认的函数参数顺序是:必选参数、默认参数、*args和**kwargs。如下所示:
def testFunc(name, age=10, *agrs, **kwargs):
pass
整体测试代码:
import torch #1.* ** 作为运算符 print('\n------运算符测试------') a = 3*2 #乘法 b = 3**2 #乘方 print("a = ", a) #输出6 print("b = ", b) #输出9 #2.作为形参 print('\n------形参测试------') def printx(*arg1, **arg2): print("arg1={0}, type:{1}".format(arg1, type(arg1))) print("arg2={0}, type:{1}".format(arg2, type(arg2))) #调用 P1 = printx(1,2, key1=1, key2=2) #3.实参测试 print('\n------实参测试------') A = (1,2,3) K1 = {'key1':1, 'key2':2} P2 = printx(*A, *K1) #注意在dict前加一个*,只把dict的 '键' 作为位置参传递 print('') P3= printx(*A, **K1) #4.解包测试 print('\n------解包测试------') x,y,*z = 1,2,3,4,5 print("x={0}, y= {1}, z={2}".format(x,y,z)) x,*y,z = 1,2,3,4,5 print("x={0}, y= {1}, z={2}".format(x,y,z)) x,*y,z = 1,2 print("x={0}, y= {1}, z={2}".format(x,y,z)) x,y,*z = 1,2 print("x={0}, y= {1}, z={2}".format(x,y,z)) #解包&组包 K2 = {'key3':3, 'key4':4} K3 = {'key5':5, 'key6':6} k4 = {**K2, **K3} print("k4=", k4)
运行结果: