python中的*与**用法详解
文章目录
学过C/C++的人总把python中的*
,**
看成与指针相关,其实python中是没有指针的。总的来说,python中*
与 **
的作用一共有四个,分别是数值计算、序列解包、函数声明的时候作为函数形参、函数调用的时候作为函数实参。注意序列解包中没有 **
用法
以下内容基于Python3.13进行执行。
一、*
与 **
用法
* 用法:
1. 作为运算符号乘号使用
2. 在函数定义时,*args 用于接受任意数量的位置参数,并将它们作为一个元组传递给函数体。
3. 在函数调用时,* 可以用于解包可迭代对象,将可迭代对象拆分为单独的位置参数。
4. 在列表、元组等可迭代对象前使用 *,可以将其解包成单独的元素,用于构建新的列表或元组。
** 用法:
1. 在函数定义时,**kwargs 用于接受任意数量的关键字参数,并将它们作为一个字典传递给函数体。
2. 在函数调用时,**可以用于解包字典,将字典中的键值对作为关键字参数传递给函数。
3. 在字典前使用 **,可以将其解包成单独的键值对,用于构建新的字典。
关于位置参数(*args
)与关键字参数(**kwargs
)的用法可以参考另一篇博文《Python参数详解、python参数类型、位置参数、默认参数、可选参数》
二、使用示例
2.1、数值运算
2.1.1、*的用法
*
表示乘法,可以用于两个数字之间的乘法操作,也可以用于重复一个序列或字符串的操作。下面是一些示例:
1、数字乘法示例:
a = 2 * 3
print(a) # 输出: 6
2、序列重复示例:
b = [1, 2, 3] * 2
print(b) # 输出: [1, 2, 3, 1, 2, 3]
3、字符串重复示例:
c = "Hello " * 3
print(c) # 输出: "Hello Hello Hello "
2.1.2、**的用法
**
表示乘方,用于计算一个数字的幂。以下为一个示例:
d = 2 ** 3
print(d) # 输出: 8
2.2、在迭代器(iterator)中使用
*
用于序列(列表、元组)解包、序列解包没有**
2.2.1、*
解包列表、元组
*
的用法通常在函数返回多个值时非常有用。1、在列表(list)或元组(tuple)变量前面加*
, 表示将列表或元组元素拆分成单个值
#拆分列表
list = [1, 2, 3]
print(*list) #输出:1 2 3 # 等同于print(1,2,3)
#拆分元组
list = ('a', 'b', 'c')
print(*list) #输出:a b c # 等同于print(1,2,3)
2、在迭代器解包时,*
用于解包剩余的元素,将它们分配给一个变量。
# 解包列表
list = [1, 2, 3, 4, 5]
a, *b, c = list
print(a) # 输出: 1
print(b) # 输出: [2, 3, 4]
print(c) # 输出: 5
# 解包元组
list = (1, 2, 3, 4, 5)
a, *b, c = list
print(a) # 输出: 1
print(b) # 输出: [2, 3, 4]
print(c) # 输出: 5
在上述示例中,*b
表示解包剩余的元素,将它们分配给变量b
。在这种情况下,b
将是一个列表,包含除了第一个和最后一个元素之外的所有元素。
2.3、扩展序列
2.3.1、扩展列表
*
可以用于扩展列表,将一个列表中的元素拆分后传递给另一个列表。
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1.extend(list2)
print(list1) # 输出 [1, 2, 3, 4, 5, 6]
# 使用 * 扩展列表
list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1 = [*list1, *list2]
print(list1) # 输出 [1, 2, 3, 4, 5, 6]
b = [1, 2, 3] * 2
print(b) # 输出: [1, 2, 3, 1, 2, 3]
注意:使用*扩展列表时,若有元素重复,则不会对重复元素去重。
2.3.2、扩展字典
**
可以用于扩展字典,将一个字典中的键值对拆分后传递给另一个字典。
dict1 = {"name": "张三", "age": 22}
dict2 = {"sex": "男"}
dict1.update(dict2)
print(dict1)
# 输出:{'name': '张三', 'age': 22, 'sex': '男'}
# 使用 ** 扩展字典
dict1 = {"name": "张三", "age": 22}
dict2 = {"sex": "男"}
dict1 = {**dict1, **dict2}
print(dict1)
# 输出:{'name': '张三', 'age': 22, 'sex': '男'}
注意: 使用 **
扩展字典时,若字典的键重复,则后面的会覆盖前面的。
# 使用 ** 扩展字典
dict1 = {"name": "张三", "age": 22}
dict2 = {"name": "李四"}
dict1 = {**dict1, **dict2} #若字典的键重复,后面的覆盖前面的
print(dict1)
# 输出:{'name': '李四', 'age': 22}
2.4、在函数定义和调用中使用
2.4.1、*的用法
*
表示强制关键字参数,在*
后面的参数必须是关键字参数。关于强制关键字参数参考《Python参数详解、python参数类型、位置参数、默认参数、可选参数》
例如:
def my_function(a, b, *, c):
print(a, b, c)
my_function(1, 2, c=3) # 输出: 1 2 3
示例中a和b是仅限位置参数,按顺序指定;c是关键字参数,必须写成key=value的形式。
def my_function(*args):
print(args)
my_function(1,2,3) # 输出:(1,2,3)
可以发现*args默认将元素以元组的方式接收
# 使用 *args 接受任意数量的位置参数
def my_function(*args):
for arg in args:
print(arg)
my_function(1, 2, 3)
# 输出:
1
2
3
# 使用 * 解包序列作为函数参数
def my_function(a, b, c):
print(a, b, c)
# 对列表进行解包
my_list = [1, 2, 3]
my_function(*my_list) # 输出: 1 2 3
# 对元组进行解包
my_list = (1, 2, 3)
my_function(*my_list) # 输出: 1 2 3
2.4.2、**的用法
作为一个字典传递给函数
。# 使用 **kwargs 接受任意数量的关键字参数
def person(**kwargs):
print(kwargs)
for key, value in kwargs.items():
print(key, value)
person(name="张三", age=25)
#执行结果
{'name': '张三', 'age': 25}
name 张三
age 25
上述示例可以看出
**
用于解包字典,将字典中的每个键值对作为关键字参数传递给函数。# 使用 ** 解包字典作为函数参数
def person(name, age):
print(name, age)
my_dict = {"name": "张三", "age": 25}
person(**my_dict) # 输出: 张三 25
上面**的写法等同于
person(name= "张三", age= 25) # 输出: 张三 25
作者:五月天的尾巴