Python中 * 号有什么用?

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
云数据库 PolarDB MySQL 版,列存表分析加速 8核16GB
简介: `Python`中的`*`号不仅仅用于乘法运算,还涉及数据结构构造与解构、函数参数处理等。它可以用于列表的展开构造和解构,例如在列表中插入或拆分子列表。在字典构造时,`**`用于合并字典。在函数参数中,`*`用于接收不定长位置参数,`**`用于接收不定长关键字参数。此外,`*`和`/`还能限制函数调用的方式,如`*`使后续参数必须为关键字参数,`/`则限制只能使用位置参数。

Python中的 *是一个特殊的符号,在其他编程语言中,它最广为人知的用途就是作为乘法运算的符号。

而在Python中,它的用途远不止如此。

本文总结了Python中*的所有用途,以供参考。

1. 算术运算

*用来做算术运算几乎是所有编程语言采用的方法,

在Python中,*可作为乘法运算和指数运算。

比如:

python

复制代码

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

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

2. 构造与解构

除了基本的算术运算,*在Python中还可以用在数据结构的构造和解构中。

2.1. 列表的构造

如果要在一些数据中间的某个位置插入一个现有的列表,来构造一个新列表的话,

大部分语言只能通过循环来实现。

Python中的*,可以让我们用一行代码就实现。

python

复制代码

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. 列表的解构

简单来说,解构就是将列表中的元素分配给几个变量。

比如下面的代码,利用*,可以迅速将一个列表中的元素分为3个部分:

python

复制代码

# 列表解构
first, *lst, last = new_lst
print("列表第一个元素:{}".format(first))
print("列表中间元素:{}".format(lst))
print("列表最后一个元素:{}".format(last))

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

2.3. 字典的构造

字典的构造是用 两个*号

python

复制代码

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

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

这样,就把已有字典中的key/value展开到新的字典中去了。

注意,字典类型的变量如果不加双*号,是会报错的,比如:

python

复制代码

new_dict = { "gender": "male", dict}
# 这样写会报语法错误

字典只有构造的方法,没有类似列表的解构方法。

3. 函数参数

*用在函数参数中,可以定义更加灵活的参数形式。

3.1. 不定长参数

不定长参数让函数更加灵活,比如 print函数的参数就是不定长的,传入几个参数,它就打印几个。

再比如,我们构造一个求和的函数,希望可以对任意数量的整数求和,就可以用** *号**来实现。

python

复制代码

# 求和函数
def add(*numbers):
    sum = 0
    for number in numbers:
        sum += number

    return sum

使用此函数时,可以传入任意数量的参数:

python

复制代码

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

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

当然,对于有 * 的参数,也可以传入列表变量作为参数,不过列表变量前要加 *

python

复制代码

lst = [1, 2, 3]
sum = add(*lst)  # 变量 lst 前不加 *号 会报错
print(sum)

3.2. 不定长的关键字参数

所谓关键字参数,就是传入参数的时候,不仅传入参数的值,还传入参数的名称。

比如下面一个模拟改变对象属性的函数:

python

复制代码

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

通过参数**attr,函数可以修改obj对象的任意属性。

这样的好处是不用定义多个不同的函数来修改obj的不同属性。

python

复制代码

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

4. 限制函数调用

最后的这个*的用途比较罕见,如果你知道这个用途的话,我会对你很佩服。

先定义一个示例函数:

python

复制代码

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

这个函数很简单,传入nameage两个参数,然后打印一段简单的自我介绍。

Python中,我们可以用下面两种方式调用这个函数:

python

复制代码

# 方式一
self_introduce("harry", 40)
# 运行结果
大家好,我是 harry, 今年 40 岁。

# 方式二
self_introduce(name="harry", age=40)
# 运行结果
大家好,我是 harry, 今年 40 岁。

两种方式的效果是是一样的。

方式一也可以叫做位置参数调用法;

方式二也可以叫做关键字参数调用法。

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

如果我们想限制self_introduce只能用方式二(关键字参数)来调用,可以:

python

复制代码

# 函数的第一个参数用 * 号
def self_introduce(*, name, age):
    print("大家好,我是 {}, 今年 {} 岁。".format(name, age))

这样调用时,只能使用方式二了。

python

复制代码

# 这样调用会报错
self_introduce("harry", 40)

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

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

如果想限制self_introduce只能用方式一(位置参数)来调用,可以:

python

复制代码

# 函数的最后一个参数用 / 号
def self_introduce(name, age, /):
    print("大家好,我是 {}, 今年 {} 岁。".format(name, age))

这样调用时,只能使用方式一了。

python

复制代码

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

# 这样调用会报错
self_introduce(name="harry", age=40)


转载来源:https://juejin.cn/post/7291211972876550196

相关文章
|
5月前
|
人工智能 前端开发 机器人
阿里云百炼 AI 聊天机器人 | Aliyun Bailian ChatBot for WordPress
一款强大的WordPress插件,集成阿里云百炼(Model Studio)AI聊天机器人,支持模型直连与应用API双模式,适用于客服、知识库等场景,具备流式输出、多轮对话、推理显示等功能,轻松通过短代码嵌入网站。
|
2月前
|
弹性计算 人工智能 前端开发
2026年阿里云新用户购买云服务器有没有优惠?新用户专属优惠政策及活动价格参考
2026年,阿里云为新用户提供多项优惠政策:新用户可抢购轻量应用服务器,2核2G配置仅38元/年,2核4G配置9.9元/月起;云服务器ECS特惠,2核2G配置99元/年,2核4G配置199元/年;通用算力型u2i实例享低至3折优惠。本文还为大家解释了新用户、老用户、产品新用户的定义,助用户精准把握优惠。建议用户购买前确认身份、按需选择产品、并关注活动规则,以更实惠的价格选购适合自己需求的云服务器。
524 6
|
7月前
|
前端开发 容器
CSS 的弹性布局
CSS弹性布局通过`display:flex`实现,可灵活控制容器内子元素的排列、对齐与分布。支持主轴与交叉轴方向设置、伸缩比例(flex-grow/shrink)、换行及多行对齐方式,大幅提升网页布局灵活性与响应性。
|
消息中间件 存储 监控
RabbitMQ 死信队列
RabbitMQ的死信队列(DLQ)是存储无法正常消费消息的特殊队列,常见于消息被拒绝、过期或队列满时。DLQ用于异常处理、任务调度和监控,通过绑定到普通队列自动路由死信消息。通过监听死信队列,可以对异常消息进行补偿和进一步处理,提升系统稳定性和可维护性。
617 1
|
安全 应用服务中间件 网络安全
部署SSL证书
部署SSL证书
1473 5
|
机器学习/深度学习 算法框架/工具 Python
基于深度学习的手写数字识别项目GUI(Deep Learning Project – Handwritten Digit Recognition using Python)
基于深度学习的手写数字识别项目GUI(Deep Learning Project – Handwritten Digit Recognition using Python)
842 0
|
运维 监控 Python
自动化运维:使用Python脚本简化日常任务
【8月更文挑战第34天】在数字化时代,高效运维成为企业竞争力的关键。本篇文章将引导你通过Python脚本实现自动化运维,从而提升工作效率和减少人为错误。我们将从简单的文件备份脚本开始,逐步深入到系统监控和自动报告生成,让你的日常工作更加轻松。
|
Linux
PXE+Kickstart实现rocky9批量自动装机
使用PXE+Kickstart实现rocky9批量自动装机
3288 0
|
存储 安全 索引
「Python系列」Python元组
Python中的元组(Tuple)是一种不可变的有序序列类型,它允许你存储多个不同类型的元素,并且这些元素在元组中是按照特定的顺序排列的。一旦一个元组被创建,你就不能修改它(即不能添加、删除或更改元组中的元素),这使得元组成为一种非常安全的数据结构,因为一旦它们被创建,就不
335 1