跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
Python算法

Python 中星号 (*) 运算符的全面用法解析

综述由AI生成Python 中星号 (*) 的多种用途。包括算术运算中的乘方、数据结构构造与解构(列表展开、字典合并)、函数参数定义(不定长参数 args/kwargs)以及调用限制(关键字仅传、位置仅传)。通过示例代码展示了具体语法和运行结果,帮助开发者深入理解该符号在不同场景下的行为,并补充了函数调用解包及最佳实践注意事项。

佛系玩家发布于 2025/2/6更新于 2026/5/79 浏览
Python 中星号 (*) 运算符的全面用法解析

Python 中的星号(*)是一个特殊符号,在其他编程语言中,它最广为人知的用途是作为乘法运算的符号。而在 Python 中,它的用途远不止于此,涵盖了算术运算、数据结构操作以及函数参数处理等多个方面。

1. 算术运算

星号用于算术运算是所有编程语言的通用做法。在 Python 中,单星号 * 表示乘法,双星号 ** 表示幂运算(指数运算)。

a = 3
b = 5
print("乘法:3×5 = {}".format(a * b))
print("指数:3 的 5 次方 = {}".format(a**b))

# 运行结果
# 乘法:3×5 = 15
# 指数:3 的 5 次方 = 243

注意运算符优先级,幂运算通常高于乘除,但在实际使用中建议显式使用括号以确保逻辑清晰。

2. 构造与解构

除了基本的算术运算,星号在 Python 中还可以用在数据结构的构造和解构中,这是 Python 特有的语法糖,极大地简化了代码。

2.1. 列表的构造与展开

如果要在一些数据中间的某个位置插入一个现有的列表来构造一个新列表,大部分语言只能通过循环来实现。而 Python 中的星号可以让我们用一行代码实现序列解包(Unpacking)。

lst = [1, 2, 3]
new_lst = [0, lst, 4, 5]
print("不使用*号,构造后的列表:{}".format(new_lst))

new_lst = [0, *lst, 4, 5]
print("使用*号,构造后的列表:{}".format(new_lst))

# 运行结果
# 不使用*号,构造后的列表:[0, [1, 2, 3], 4, 5]
# 使用*号,构造后的列表:[0, 1, 2, 3, 4, 5]

使用星号,可以自动将现有列表中的元素展开到当前列表中。这在合并多个列表时非常有用。

2.2. 列表的解构

简单来说,解构就是将列表中的元素分配给几个变量。利用星号,可以迅速将一个列表中的元素分为固定部分和可变部分。

# 列表解构
first, *middle, last = [0, 1, 2, 3, , ]
(.(first))
(.(middle))
(.(last))





4
5
print
"列表第一个元素:{}"
format
print
"列表中间元素:{}"
format
print
"列表最后一个元素:{}"
format
# 运行结果
# 列表第一个元素:0
# 列表中间元素:[1, 2, 3, 4]
# 列表最后一个元素:5

在此示例中,first 接收第一个元素,last 接收最后一个元素,而 middle 接收中间所有的剩余元素,并作为一个列表存储。

2.3. 字典的构造与合并

字典的构造和解构通常使用两个星号 **。这主要用于字典合并。

dict_a = {"name": "harry", "age": 40}
dict_b = {"gender": "male", **dict_a}
print("构造后的字典:{}".format(dict_b))

# 运行结果
# 构造后的字典:{'gender': 'male', 'name': 'harry', 'age': 40}

这样,就把已有字典中的 key/value 展开到了新的字典中。如果两个字典中存在相同的键,后出现的键值对会覆盖先前的值。

dict_c = {"name": "jack", **dict_a}
print("键冲突时的结果:{}".format(dict_c))
# 输出:{'name': 'harry', 'age': 40} (注意:这里 dict_a 在后,覆盖了 name)

注意,字典类型的变量如果不加双星号直接放入花括号中,是会报错的,例如 {"key": value, dict} 会导致语法错误。

3. 函数参数

星号用在函数参数定义和调用中,可以定义更加灵活的参数形式,支持不定长参数和参数限制。

3.1. 不定长位置参数 (*args)

不定长参数让函数更加灵活。例如 print 函数的参数就是不定长的。我们可以用星号来实现对任意数量整数求和的函数。

def add(*numbers):
    total = 0
    for number in numbers:
        total += number
    return total

# 可以传入任意数目的参数
print("1~3 求和:{}".format(add(1, 2, 3)))
print("1~4 求和:{}".format(add(1, 2, 3, 4)))

# 运行结果
# 1~3 求和:6
# 1~4 求和:10

当然,对于有星号的参数,也可以传入列表或元组变量作为参数,但变量前需要加星号进行解包。

lst = [1, 2, 3]
print(add(*lst))  # 等价于 add(1, 2, 3)

3.2. 不定长的关键字参数 (**kwargs)

所谓关键字参数,就是传入参数的时候,不仅传入参数的值,还传入参数的名称。双星号 ** 用于收集多余的关键字参数。

def change(obj, **attrs):
    for key, val in attrs.items():
        obj[key] = val

person = {"name": "harry", "age": 30, "gender": "male"}
print("修改前:{}".format(person))

change(person, age=40, name="jack")
print("修改后:{}".format(person))

# 运行结果
# 修改前:{'name': 'harry', 'age': 30, 'gender': 'male'}
# 修改后:{'name': 'jack', 'age': 40, 'gender': 'male'}

通过参数 **attrs,函数可以动态修改对象的属性,无需定义多个不同的函数。

3.3. 函数调用时的解包

在调用函数时,星号同样可以用于将列表或字典解包为参数传递。

def greet(name, age):
    print("大家好,我是 {}, 今年 {} 岁。".format(name, age))

info = ["harry", 40]
greet(*info)  # 等价于 greet("harry", 40)

info_dict = {"name": "harry", "age": 40}
greet(**info_dict)  # 等价于 greet(name="harry", age=40)

4. 限制函数调用方式

星号和斜杠 / 可以用来限制函数参数的传递方式,增强接口的健壮性。

4.1 只能用关键字参数方式调用

如果我们想限制函数只能用关键字参数来调用,可以在普通参数之后、可变参数之前放置一个单独的星号 *。

def self_introduce(*, name, age):
    print("大家好,我是 {}, 今年 {} 岁。".format(name, age))

# 这样调用会报错:TypeError: self_introduce() takes 0 positional arguments but 2 were given
# self_introduce("harry", 40)

# 可以正常执行
self_introduce(name="harry", age=40)

4.2 只能用位置参数方式调用

如果想限制函数只能用位置参数来调用,可以在参数列表末尾放置一个斜杠 /。

def self_introduce(name, age, /):
    print("大家好,我是 {}, 今年 {} 岁。".format(name, age))

# 可以正常执行
self_introduce("harry", 40)

# 这样调用会报错:TypeError: self_introduce() got some positional-only arguments passed as keyword arguments
# self_introduce(name="harry", age=40)

5. 最佳实践与注意事项

  1. 参数顺序:在函数定义中,参数的顺序应遵循以下规则:位置参数 -> *args -> 关键字仅传参数(* 后) -> **kwargs。违反此顺序会引发 SyntaxError。
  2. 命名冲突:在使用 **dict 解包时,如果字典中的键与函数形参名冲突,可能会覆盖默认值或导致意外行为,建议检查键名。
  3. 性能考虑:虽然解包语法简洁,但在循环中频繁创建新列表可能会影响性能,对于大数据量场景需权衡内存开销。
  4. 版本兼容性:位置参数 / 和关键字仅传 * 特性主要存在于 Python 3.8+ 版本中,旧版本可能不支持。

总结

Python 中的星号运算符功能强大且灵活。掌握它在算术、数据结构解包、函数参数定义及调用中的应用,能够显著提升代码的可读性和开发效率。在实际开发中,合理运用这些特性可以编写出更简洁、健壮的 Python 程序。

目录

  1. 1. 算术运算
  2. 运行结果
  3. 乘法:3×5 = 15
  4. 指数:3 的 5 次方 = 243
  5. 2. 构造与解构
  6. 2.1. 列表的构造与展开
  7. 运行结果
  8. 不使用*号,构造后的列表:[0, [1, 2, 3], 4, 5]
  9. 使用*号,构造后的列表:[0, 1, 2, 3, 4, 5]
  10. 2.2. 列表的解构
  11. 列表解构
  12. 运行结果
  13. 列表第一个元素:0
  14. 列表中间元素:[1, 2, 3, 4]
  15. 列表最后一个元素:5
  16. 2.3. 字典的构造与合并
  17. 运行结果
  18. 构造后的字典:{'gender': 'male', 'name': 'harry', 'age': 40}
  19. 输出:{'name': 'harry', 'age': 40} (注意:这里 dict_a 在后,覆盖了 name)
  20. 3. 函数参数
  21. 3.1. 不定长位置参数 (*args)
  22. 可以传入任意数目的参数
  23. 运行结果
  24. 1~3 求和:6
  25. 1~4 求和:10
  26. 3.2. 不定长的关键字参数 (**kwargs)
  27. 运行结果
  28. 修改前:{'name': 'harry', 'age': 30, 'gender': 'male'}
  29. 修改后:{'name': 'jack', 'age': 40, 'gender': 'male'}
  30. 3.3. 函数调用时的解包
  31. 4. 限制函数调用方式
  32. 4.1 只能用关键字参数方式调用
  33. 这样调用会报错:TypeError: self_introduce() takes 0 positional arguments but 2 were given
  34. self_introduce("harry", 40)
  35. 可以正常执行
  36. 4.2 只能用位置参数方式调用
  37. 可以正常执行
  38. 这样调用会报错:TypeError: self_introduce() got some positional-only arguments passed as keyword arguments
  39. self_introduce(name="harry", age=40)
  40. 5. 最佳实践与注意事项
  41. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 大模型拒绝采样技术实践与训练方法对比
  • 医疗 AI 中的模型融合与集成策略实战
  • 无人机开源 RemoteID 身份识别方案与部署指南
  • VSCode Copilot 登录失败常见原因与解决方案
  • Visual C++ Release 模式使用 Win32 API 导出崩溃堆栈
  • 大模型开发基本功:模型转换、推理优化与训练监控实战
  • 易语言界面组件高级应用:常用组件优化、事件处理与自定义组件
  • 基于 FPGA 的快速傅里叶变换实现
  • LLM 对齐方案升级:WizardLM、BackTranslation 与 Self Alignment
  • 网络安全入门学习路线与核心技能详解
  • Ubuntu 24.04 安装 OpenClaw 完整指南
  • TRAE 与 VSCode 中的 Git 项目管理实战
  • VR + 具身智能 + 人形机器人:通往现实世界的智能接口
  • 百度否认大模型泡沫论,AI 业务持续盈利
  • 本地 AI 绘画工具 Z-Image-Turbo UI 实测与使用指南
  • Stable Diffusion WebUI 高效提示词插件推荐与使用指南
  • RK3588 结合 FPGA 实现 BT1120 转 3G-SDI 方案解析
  • Spring Web MVC 核心概念与实战
  • CATE 条件平均处理效应估计:五大方法原理详解与实战
  • 利用 Coze 构建企业级知识库与 AI Agent 开发指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online