在 Python 中,* 和 ** 是功能强大、用途广泛的符号。它们不仅用于数学运算,还深度参与了函数定义、参数传递、序列解包等多个核心语法机制。

一、* 运算符的 7 种用途

1、数值运算

print(3 * 4)  # 输出:12

最基本的用法,数值之间的乘法运算。

2、序列重复

print("Hi" * 3)      # 输出:HiHiHi
print([1, 2] * 2)    # 输出:[1, 2, 1, 2]
print((0,) * 4)      # 输出:(0, 0, 0, 0)

可用于生成多个重复元素的新序列(字符串、列表、元组)。

3、赋值语句中的序列解包

a, *b, c = [1, 2, 3, 4, 5]
print(a)  # 1
print(b)  # [2, 3, 4]
print(c)  # 5

在赋值语句中使用 * 表示在解包过程中捕获不定数量的中间元素。常用于灵活拆分序列。

4、表达式中序列解包

a = [1, 2]
b = [3, 4]
print([*a, *b])  # 输出: [1, 2, 3, 4]

在表达式中使用 *,表示把可迭代对象的元素解包出来。

5、函数调用中位置参数解包

def greet(a, b, c):
    print(a, b, c)

lst = ["Hello", "Python", "!"]
greet(*lst)  # 相当于 greet("Hello", "Python", "!")

* 可在函数调用中将列表、元组等可迭代对象解包为位置参数,每个元素依次传入函数对应的参数位置。

6、函数定义中的 *args

def add_all(*args):
    return sum(args)

print(add_all(1, 2, 3))  # 输出:6

*args 表示接收任意数量的位置参数,打包成元组。通常用于不定参数函数。

7、函数定义中的仅限关键字参数

在函数定义中,* 单独使用时,表示之后的参数必须通过关键字方式传入,常用于接口更清晰、安全的设计。

def display(*, title, msg):
    print(f"{title}: {msg}")

display(title="提示", msg="操作成功")  # ✅
# display("提示", "操作成功")  ❌ 报错

二、** 运算符的 4 种用途

1、数学运算中的乘方(幂)

print(2 ** 3)  # 输出:8(2 的 3 次方)

a ** b 表示 a 的 b 次幂。

2、表达式中用于字典合并(Python 3.5+)

a = {'x': 1, 'y': 2}
b = {'y': 99, 'z': 3}
c = {**a, **b}
print(c)  # 输出:{'x': 1, 'y': 99, 'z': 3}

**dict 可在字面量中将字典展开。键重复时,后者会覆盖前者。

3、函数调用中的字典解包传参

def greet(name, age):
    print(f"{name} is {age} years old.")

data = {"name": "xiaohong", "age": 18}
greet(**data)  # 相当于 greet(name="xiaohong", age=18)

**data 会将字典中的键值对解包为关键字参数。注意:这不是位置参数,而是以键值对的形式传入。

4、函数定义中的可变关键字参数

def show_info(**kwargs):
    for k, v in kwargs.items():
        print(f"{k} = {v}")

show_info(name="mediaTEA", age=7)

**kwargs 会把所有的关键字参数收集成一个字典。适用于不确定参数名的情况。

提示:

函数定义中若同时使用 *args 与 **kwargs,顺序必须是:*args 在前,**kwargs 在后。

点赞有美意,赞赏是鼓励