Python编程语言中并没有像c/c++编程语言有指针运算符,那么Python中的*号是如何使用的呢?
Python本身作为一种简洁且强大的编程语言,提供了许多独特的特性来简化代码的编写和阅读。其中*号作为运算符同时,星号*和双星号**的解包机制是Python中非常实用的特性之一。它们不仅可以用于解包序列和字典,还可以在函数参数传递中发挥重要作用。
乘法运算符
* 作为运算符时,和其它编程语言一样,当作乘法运算符如下:
a = 1
b = 2
c = a *b
作为乘法运算符时非常简单,也不是这里讨论的重点。下面详细说明作为解包和函数参数时的使用技巧。
基本解包
序列解包
序列解包是指将一个序列(如列表、元组)中的元素分配给多个变量
a, b, c = [1, 2, 3]
列表[1, 2, 3]中的元素被分别赋值给变量a、b和c。
元组解包
元组解包与列表解包类似
a, b, c = (1, 2, 3)
字符串解包
字符串也可以被解包,每个字符会被分配给一个变量
a, b, c, d, e = "hello"
在这个例子中,字符串"hello"中的每个字符被分别赋值给变量a、b、c、d和e
高级解包
使用星号*进行解包
# 元组使用*号解包
a, *b, c = (1, 2, 3, 4, 5)
print(a) # 1
print(b) # [2, 3, 4]
print(c) # 5
# 列表使用*号解包
d, *e, f = [1, 2, 3, 4, 5]
print(d) # 1
print(e) # [2, 3, 4]
print(f) # 5
注:元组和列表的解包,剩余参数b和e都是列表类型
解包到函数参数
解包也可以用于函数参数传递。例如,可以将一个列表或元组解包后传递给函数:
def add(a, b, c):
return a + b + c
items = [1, 2, 3]
sum = add(*items)
print(sum) # 输出:6
在这个例子中,列表items被解包后传递给函数add进行了求和
使用双星号**进行解包
双星号**用于解包字典,将其键值对传递给函数的参数或在字典中进行拼接
defaults = {"color": "red", "size": "medium"}
user_preferences = {"size": "large", "material": "cotton"}
combined = {**defaults, **user_preferences}
print(combined) # 输出:{'color': 'red', 'size': 'large', 'material': 'cotton'}
双星号**还可以用于字典拼接:
defaults = {"color": "red", "size": "medium"}
user_preferences = {"size": "large", "material": "cotton"}
combined = {**defaults, **user_preferences}
print(combined) # 输出:{'color': 'red', 'size': 'large', 'material': 'cotton'}
在这个例子中,defaults和user_preferences两个字典被拼接成一个新的字典combined
函数参数中的应用
单星号*收集额外位置参数
单星号*用于收集额外的位置参数到一个元组中
def func(*args):
for arg in args:
print(arg)
func(1, 2, 3)
# 输出:1 2 3
上例中,*args收集了所有传递给函数的位置参数
def func(a, b, *c):
print(a) # 1
print(b) # 2
print(c) # (3, 4)
func(1, 2, 3, 4)
# 输出
1
2
(3, 4)
上例中,带星号的形参只能有一个,可以和其他参数配合使用。
可变参数不是必须写在最后,如下:
def func(a, *b, c):
print(a) # 1
print(b) # (2, 3)
print(c) # 4
func(1, 2, 3, c=4)
# 输出
1
(2, 3)
4
注意:带*的参数后的所有参数,必须以关键字参数的形式传递
双星号**收集额外关键字参数
双星号**用于收集额外的关键字参数到一个字典中
def func(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
func(name="Alice", age=25)
# 输出:name: Alice age: 25
在这个例子中,**kwargs收集了所有传递给函数的关键字参数
单星号*和双星号**可以同时出现在一个函数中
def func(a, b=10, *c, **d):
print(a) # 1
print(b) # 2
print(c) # (3, 4)
print(d) # {'e': 5, 'f': 6, 'g': 7}
func(1, 2, 3, 4, e=5, f=6, g=7)
# 输出
1
2
(3, 4)
{'e': 5, 'f': 6, 'g': 7}
注意:双星号(**)形参中能有一个,并且必须写在所有参数的最后
总结:
星号*和双星号**解包机制是Python中非常实用的特性,它们可以大大简化代码的编写和阅读。通过本文的讲解和相关示例,相信读者已经掌握了它们的用法和实际应用场景。希望本文能为你的Python学习之路提供帮助!