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中还可以用在数据结构的构造和解构中。

2.1. 列表的构造

如果要在一些数据中间的某个位置插入一个现有的列表,来构造一个新列表的话,
大部分语言只能通过循环来实现。

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个部分:

# 列表解构
first, *lst, last = new_lst
print("列表第一个元素:{}".format(first))
print("列表中间元素:{}".format(lst))
print("列表最后一个元素:{}".format(last)) # 运行结果
列表第一个元素:0
列表中间元素:[1, 2, 3, 4]
列表最后一个元素:5

2.3. 字典的构造

字典的构造是用 两个*号

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

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

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

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

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

3. 函数参数

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

3.1. 不定长参数

不定长参数让函数更加灵活,比如 print函数的参数就是不定长的,传入几个参数,它就打印几个。
再比如,我们构造一个求和的函数,希望可以对任意数量的整数求和,就可以用*来实现。

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

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

# 可以传入任意数目的参数
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

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

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

3.2. 不定长的关键字参数

所谓关键字参数,就是传入参数的时候,不仅传入参数的值,还传入参数的名称。
比如下面一个模拟改变对象属性的函数:

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

通过参数**attr,函数可以修改obj对象的任意属性。
这样的好处是不用定义多个不同的函数来修改obj的不同属性。

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. 限制函数调用

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

先定义一个示例函数:

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

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

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

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

两种方式的效果是是一样的。
方式一也可以叫做位置参数调用法;
方式二也可以叫做关键字参数调用法。

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

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

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

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

# 这样调用会报错
self_introduce("harry", 40) # 可以正常执行
self_introduce(name="harry", age=40)

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

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

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

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

# 可以正常执行
self_introduce("harry", 40) # 这样调用会报错
self_introduce(name="harry", age=40)

彻底掌握Python中 * 号的更多相关文章

  1. python中*号和**号的用法

    1.乘法符号 2.可变长参数 当我们使用函数时,需要传入不定个数的位置参数时,就可以使用*号表示,即*args,以元组形式传入:需要传入不定个数的关键字参数时,使用**表示,即**kwargs,以字典 ...

  2. python中*号用法总结

    python 中有很多地方用到星号,有时候会想知道这个*是干嘛用的,总结如下,有不当之处,还望不吝指出,谢谢.1.乘法: 在很多时候是用作乘法的,例如: In [90]: 2*7 Out[90]: 1 ...

  3. python中的printf:%号拼接字符串和format函数

    在C语言中,我们使用printf("%s","hello")这种形式进行字符串的拼接 在python中,进行这样的拼接有两种实现方式,分别是%号拼接以及使用fo ...

  4. python中获取当前位置所在的行号和函数名(转)

    http://www.vimer.cn/2010/12/%E5%9C%A8python%E4%B8%AD%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8D%E4%BD%8D%E7 ...

  5. python中获取当前位置所在的行号和函数名(转)

    http://www.vimer.cn/2010/12/%E5%9C%A8python%E4%B8%AD%E8%8E%B7%E5%8F%96%E5%BD%93%E5%89%8D%E4%BD%8D%E7 ...

  6. Python中字符串使用单引号、双引号标识和三引号标识,什么是三引号?什么情况下用哪种标识?

    一.三引号是指三个单引号或者三个双引号: 二.Python中字符串如果以单引号.双引号标识和三引号标识开头,则字符串结尾也必须是对应的标识,不能变更: 三.三者的异同: 1.三者都是字符串,大部分情况 ...

  7. python2.7高级编程 笔记二(Python中的描述符)

    Python中包含了许多内建的语言特性,它们使得代码简洁且易于理解.这些特性包括列表/集合/字典推导式,属性(property).以及装饰器(decorator).对于大部分特性来说,这些" ...

  8. python中的参数问题

    python中的有默认参数和可变参数之分 默认参数arg 可变参数args, kargs 默认参数arg就是调用指定参数 可变参数*arg调用时传入的的参数会被python自动包装为列表 可变参数ka ...

  9. [转载]python中的sys模块(二)

    #!/usr/bin/python # Filename: using_sys.py import sys print 'The command line arguments are:' for i ...

  10. Python爬虫学习(4): python中re模块中的向后引用以及零宽断言

    使用小括号的时候,还有很多特定用途的语法.下面列出了最常用的一些: 表4.常用分组语法 分类 代码/语法 说明 捕获 (exp) 匹配exp,并捕获文本到自动命名的组里 (?<name>e ...

随机推荐

  1. MyBatis(RowBounds)分页了解内容

    RowBounds 不在使用SQL实现分页 1.接口 List<User> getUserByRowBounds(); 2.mapper.xml <select id="g ...

  2. 打造原生 WebGL 2D 引擎:一场创意与技术的融合

    打造原生 WebGL 2D 引擎:一场创意与技术的融合 1.引言 在当今数字化时代,网页的功能越来越丰富,已经远远超越了传统的文本和图片呈现.我们生活在一个充满交互性和视觉魅力的网络世界.每天都会遇到 ...

  3. javascript报错: TypeError: (0 , _api_music.default) is not a function

    报错截图 错误原因 从其他文件引入变量时,未添加花括号 错误写法 解决方案 效果图 至此问题解决

  4. protolator - Protobuf <==> json

    github.com/hyperledger/fabric-config/protolator 是 Hyperledger Fabric 中的一个 Go 包,用于将 Protocol Buffers( ...

  5. VMware虚拟机的安装与配置

    一.VMware简介 VMware Workstation Pro 是业界标准的桌面 Hypervisor,用于在 Linux 或 Windows PC 上运行虚拟机. Workstation 16 ...

  6. Health Kit基于数据提供专业方案,改善用户睡眠质量

    什么是CBT-I? 中国社科院等机构今年发布的<中国睡眠研究报告2023>内容显示,2022年,受访者的每晚平均睡眠时长为7.40小时,近半数受访者的每晚平均睡眠时长不足8小时(47.55 ...

  7. [ABC146F] Sugoroku

    2023-02-27 题目 题目传送门 翻译 翻译 难度&重要性(1~10):5 题目来源 AtCoder 题目算法 贪心 解题思路 对于第 ii 个点,只要到达 \(s_{i+1}\cdot ...

  8. 用了好几年的IDEA主题及配置,拿去吧不谢。

    前言 最近这几年一直用一套IDEA的主题及配置,分享给各位,如果符合你的口味,可以下载了玩玩. 我个人是非常喜欢的,不管是观感还是敲代码都很爽的. 附上一张代码的主题色,大概就是这样子,我个人喜欢清爽 ...

  9. 《小白WEB安全入门》02. 开发篇

    @ 目录 初识HTML潜在漏洞 初识CSS潜在漏洞 初识JS潜在漏洞 初识后端潜在漏洞 后端能做什么 后端种类 后端框架 潜在漏洞 本系列文章只叙述一些超级基础理论知识,极少有实践部分 本文涉及到的语 ...

  10. python 获取本周 ,上周,本月,上月,本季,上季,今年, 去年的第一天和最后一天

    import datetime from datetime import timedelta now = datetime.datetime.now()# 获取当前月的天数 month = 2days ...