Python星号与双星号用法:函数参数匹配与对象解包详解

Dylan
Dylan
发布时间:2026-10-12 | 4人浏览过
原创

本文系统讲解Python中单星号(*)与双星号(**)的核心语法。涵盖其在数学计算中的基础定义,作为动态参数收集器捕获不定长位置与关键字参数,限制函数调用仅接受关键字传参的规范作用,以及结合列表、字典进行高效解包与扩展赋值的完整实操案例。

数学运算基础

在开始高级用法前,明确两者最基础的算术含义:* 用于乘法运算,** 用于求幂运算。理解底层逻辑有助于避免在复杂表达式中产生歧义。

>>> 2 * 3
6
>>> 2 ** 3
8

函数动态参数捕获机制

当函数需要接收数量不确定的输入时,可使用星号作为参数前缀进行动态打包。这分为两种标准形态:

  • *args:以单个星号开头的形参,会将所有超出常规命名的位置参数自动收集为一个元组(tuple)。
  • **kwargs:以双星号开头的形参,会将所有未匹配的关键字参数自动收集为一个字典(dict),键名为参数名,值为传入数据。

强制后续参数仅支持关键字形式

在定义函数签名时,可以在普通位置参数后添加单独的 *。此标记充当分水岭,规定其后的所有参数必须且只能通过 key=value 的形式传入,严禁使用位置传参。这在构建稳定接口、防止参数顺序错位时非常有效。

def genius(age, *, first_name, last_name):
    print(first_name, last_name, 'is', age)

genius(28, first_name='Li', last_name='Bai')
# 输出: Li Bai is 28

可迭代对象的快速解包与合并

利用 * 操作符可以直接展开列表、元组或集合中的元素,常用于多数据结构拼接或批量赋值:

A = [1, 2, 3]
B = (4, 5, 6)
C = {7, 8, 9}
L = [*A, *B, *C]
print(L)
# 输出: [1, 2, 3, 4, 5, 6, 8, 9, 7]

需注意集合的无序特性,合并后元素的排列顺序取决于各容器内部的哈希分布规律。

字典键值对的差异化解包

字典解包时,单星号与双星号的取值目标截然不同。掌握差异可避免常见的 TypeError:

D = {'first': 1, 'second': 2, 'third': 3}

print(*D)
# 仅解包键名(keys):first second third

# print(**D) 
# 此处若直接调用 print(**D) 会抛出 TypeError
# 因为 print() 函数并未定义名为 'first' 的关键字参数,无法接收映射实参

# 正确演示:使用能识别对应参数名的方法接收
'{first},{second},{third}'.format(**D)
# 输出: 1,2,3

** 的核心作用是“拆包传参”,将字典的键值对直接映射为目标函数签名中完全匹配的命名实参。

扩展切片式解包语法

Python 支持类似序列切片的解包赋值,可通过 * 捕获剩余的所有元素至单一变量中,非常适合数据清洗或结构化拆分:

L = [1, 2, 3, 4, 5, 6, 7, 8]
a, *b = L
print(a)  # 输出: 1
print(b)  # 输出: [2, 3, 4, 5, 6, 7, 8]

该语法在左侧声明了要固定提取的头部元素,中间带星号的变量会自动吞并中间段,末尾也可预留尾部收集位。只要结构合法,解释器会在赋值阶段自动完成分片。

以上就是Python星号(*)与双星号(**)在函数参数匹配及对象解包中详细应用的全部内容,更多关于Python高阶语法技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表