Python中星号的五种用法小结
作者:赵卓不凡 发布时间:2022-12-06 16:17:23
1. 引言
星号* 往往被称为乘法运算符,是所有程序中最为常用的运算符号之一,在Python 中,星号还有很多隐藏的强大功能。
本文将用最容易理解的例子来解释星号*的 五个使用场景,从初级用法到高阶用法。
闲话少说,我们直接开始吧!
2. 乘法和幂运算符
最简单的用法是利用星号作为基本的运算符:
单个 * 用于乘法运算
两个 ** 表示幂运算
相关样例用例代码如下:
>>> 2*3
>>> 6
>>> 2**3
>>> 8
3. 函数接收数量不固定的入参
一般来说,函数往往接收固定数量的参数;但是如果我们需要更大的灵活性,比如当不确定将传递多少个参数时,此时将是星号* 发挥作用的时候。
def print_genius(*names):
print(type(names))
for n in names:
print(n)
print_genius('Elon Mask', 'Du Fu ', 'Li Bai')
# <class 'tuple'>
# Elon Mask
# Du Fu
# Li Bai
def top_genius(**names):
print(type(names))
for k, v in names.items():
print(k, v)
top_genius(Top1="Elon Mask", Top2="Du Fu", Top3="Li Bai")
# <class 'dict'>
# Top1 Elon Mask
# Top2 Du Fu
# Top3 Li Bai
如上例所示,在定义函数时,我们可以定义一个以一个或两个星号为前缀的参数,以捕获不限制数量的参数输入。总结如下:
以 一个 * 为前缀的参数可以将任意数量的参数以元组形式传入
以两个 ** 为前缀的参数可以将任意数量的参数以字典形式传入
按照惯例,当我们定义的函数接收不定数量的参数时,我们一般采用以下函数定义形式:
def func(*args, **kwargs):
pass
4. 限制函数入参仅以关键字形式输入
星号* 的一个非常酷的用法是使函数只能接收关键字参数。
很难理解,我们举例来说明:
def genius(*, first_name, last_name):
print(first_name, last_name)
# genius('Li','Bai')
# TypeError: genius() takes 0 positional arguments but 2 were given
genius(first_name='Li', last_name='Bai')
# Li Bai
上述代码采用了星号* 限制了星号之后的参数必须采用关键字形式来调用上述函数。
实际上,如果我们只是想将一些参数限制为仅以关键字形式输入同时另一部分参数依旧按照位置形式输入,此时我们可以将位置参数放置在星号之前。
样例代码如下:
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
5. 可迭代对象解包操作
我们可以使用星号* 来解包可迭代对象,这将使我们的程序更加清晰且优雅。
例如,如果我们要将不同的可迭代对象(例如一个列表,一个元组和一个集合)组合成一个新列表,哪种方法最好?
显然,我们可以使用 for 循环来迭代所有元素并将它们逐一添加到新列表中,样例代码如下:
A = [1, 2, 3]
B = (4, 5, 6)
C = {7, 8, 9}
L = []
for a in A:
L.append(a)
for b in B:
L.append(b)
for c in C:
L.append(c)
print(L)
# [1, 2, 3, 4, 5, 6, 8, 9, 7]
上述实现方式虽然可以完成我们的目的,但是代码看起来太冗长了,而且不是很Pythonic 。
推荐的改进方式是使用列表生成式,如下所示:
A = [1, 2, 3]
B = (4, 5, 6)
C = {7, 8, 9}
L = [a for a in A] + [b for b in B] + [c for c in C]
print(L)
# [1, 2, 3, 4, 5, 6, 8, 9, 7]
上述代码中,我们将三个 for 循环减少为一行列表生成式。它已经是Pythonic了,但不一定是最简单的!
是时候看看星号的强大之处啦。
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]
如上所述,我们可以使用星号作为可迭代项的前缀来解包它们的元素。
顺便说一句,如果我们利用一个*作为dict 的前缀,它的key 将被解包;如果我们使用双星号** 作为前缀,其value 将被解包;此时我们必须显示使用key 来接收解包后的value 。
样例如下:
D = {'first': 1, 'second': 2, 'third': 3}
print(*D)
# first second third
# print(**D)
# TypeError: 'first' is an invalid keyword argument for print()
print('{first},{second},{third}'.format(**D))
# 1,2,3
6. 扩展可迭代对象解包
解包的语法可以让我们的代码更加简洁,样例如下:
L = [1, 2, 3, 4, 5, 6, 7, 8]
a, *b = L
print(a)
# 1
print(b)
# [2, 3, 4, 5, 6, 7, 8]
7. 结论
星号* 是程序中最常用的运算符之一。除了用作乘法运算符之外,它在Python中还有一些优雅而强大的用法,这将帮助我们的代码变得更加Pythonic 。
本文重点讲解了星号的五种用法,并给出了相应的代码示例,您学废了嘛?
来源:https://blog.csdn.net/sgzqc/article/details/128261430


猜你喜欢
- 直接pip install impala 是不行滴,按照以下步骤安装就会成功!一路安装就可以1、pip install six2、pip i
- 背景:今天同事写代码,用python读取一个四五百兆的文件,然后做一串逻辑上很直观的处理。结果处理了一天还没有出来结果。问题出在哪里呢?解决
- 构建网络ResNet由一系列堆叠的残差块组成,其主要作用是通过无限制地增加网络深度,从而使其更加强大。在建立ResNet模型之前,让我们先定
- 安装刚接触Pillow的朋友先来看一下Pillow的安装方法,在这里我们以Mac OS环境为例:(1)、使用 pip 安装 Python 库
- MySQL是一个关系型数据库管理系统,官方网站是http://www.mysql.com/,分为MySQL Enterprise Editi
- 关于投票系统怎么样怎么样的引言就不多说,这不是毕业设计,主要说一下使用php实现投票系统,与其他普通系统一样,分为两部分,一个是管理员部分,
- 昨天又翻了下前段时间WD内部培训的幻灯片,发现了kejun推荐的一篇好文:Javascript Closures,看了之后受益匪浅。这篇文章
- 由于工作需要,在做最优分箱的时候,始终写不出来高效的代码,所以就找到了R语言中的最优分箱的包,这个时候考虑到了在python中调用R语言,完
- 建造者模式建造者模式用于创建复杂的对象。使用建造者模式可以使复杂的过程层次明了、清晰,把对象的创建以及使用进行了解耦。实际上从代码的角度上看
- 如何用ADO批量更新记录?是的,ADO有这项功能,不过好像用的人不太多(不了解还是不会用呢?):<HTML> &nbs
- asp+access用户登录代码,loginnew.asp网面包含了登录框及验证用户的代码an.mdb数据库名fd表名y_username用
- 理由:jquery简单,兼容性好且容易封装。废话不多说,马上开始我们的Jquery插件编写吧。应该有很多人写过类似的插件,我也是有些模仿fl
- 这节介绍接口测试工具postman的基本使用方法, 测试系统就是2.8节自己开发的具有用户增删改查操作的web应用程序——[FirstJav
- --******************************************************* --* 清空所有表中的数
- 所以爱微网现在讲解先php内置函数 有大小写转换相关函数 文本html标签处理函数大小写有关函数 strtolower() strtoupp
- <%'**************************************************'函数名:g
- 一、TensorFlow模型保存和提取方法1. TensorFlow通过tf.train.Saver类实现神经网络模型的保存和提取。tf.t
- 轮播图功能安装依赖模块图片处理模块pip install pillow上传文件相关配置由于我们需要在后台上传我们的轮播图图片,所以我们需要在
- 前言和Word、Excel承载数据的能力相比,PPT的应用重点在于表演。比如一场发布会、一场演说、一次产品展示、一次客户沟通&hel
- 导语无论家用电脑还是公司的电脑,定时开关机都是一个非常实用的功能,只是一般都不太受关注。定时关机不仅能延长电脑的使用寿命,还能节约超多的电费