Python中的星号(*)与双星号(**)运算符

452 阅读4分钟

Python编程语言中并没有像c/c++编程语言有指针运算符,那么Python中的*号是如何使用的呢?

Python本身作为一种简洁且强大的编程语言,提供了许多独特的特性来简化代码的编写和阅读。其中*号作为运算符同时,星号*和双星号**的解包机制是Python中非常实用的特性之一。它们不仅可以用于解包序列和字典,还可以在函数参数传递中发挥重要作用。

乘法运算符

* 作为运算符时,和其它编程语言一样,当作乘法运算符如下:

a = 1
b = 2
c = a *b

作为乘法运算符时非常简单,也不是这里讨论的重点。下面详细说明作为解包和函数参数时的使用技巧。

基本解包

序列解包

序列解包是指将一个序列(如列表、元组)中的元素分配给多个变量

a, b, c = [1, 2, 3]

列表[1, 2, 3]中的元素被分别赋值给变量abc

元组解包

元组解包与列表解包类似

a, b, c = (1, 2, 3)
字符串解包

字符串也可以被解包,每个字符会被分配给一个变量

a, b, c, d, e = "hello"

在这个例子中,字符串"hello"中的每个字符被分别赋值给变量abcde

高级解包

使用星号*进行解包
# 元组使用*号解包
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

注:元组和列表的解包,剩余参数be都是列表类型

解包到函数参数

解包也可以用于函数参数传递。例如,可以将一个列表或元组解包后传递给函数:

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'}

在这个例子中,defaultsuser_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学习之路提供帮助!