Python中的参数解包:`*`表达式和 `**`表达式
1.参数解包:方法调用中的*表达式
和**表达式
如果语法
*表达式
出现在函数调用中,则该表达式必须是可迭代的。
这些可迭代集合的元素被视为附加的位置参数。
对于调用f(x1, x2, *y, x3, x4)
,如果y
等于序列[y1,...,yM]
,则等效于调用f(x1, x2, y1, ..., yM, x3, x4)
。如果函数调用中出现语法
**表达式
,则该表达式的值必须为“映射”,其内容被视为附加的关键字参数。
如果一个关键字已经存在(作为一个明确的关键字参数,或来自另一个解包),则会引发“ TypeError”异常。
关于参数顺序的说明:* 表达式
可以出现在显式关键字参数之后,并在关键字参数和任何** 表达式
参数之前被处理。而在一般函数的显式参数调用中,位置参数必须放在关键字参数之前。例如:
def func(a, b ,c):
print(a, b, c)
func(c=3, 1, 2) # SyntaxError: positional argument follows keyword argument
func(c=3, *(1,2)) # OK. 1 2 3
func(c=3, **dict(a=1,b=2)) # OK. 1 2 3
func(c=3, *(1,), **dict(b=2)) # OK. 1 2 3
2.参数解包:方法定义中的*表达式
和**表达式
如果存在形式
* identifier
,则将其初始化为接收任何其余位置参数的元组,默认为空元组。如果存在形式
** identifier
,则将其初始化为一个新字典,该字典将接收任何其余的关键字参数,默认为一个新的空字典。
所以 *args
其实是一个元组!
让我们来看一个例子:
def func(*args, **kwargs):
print(args)
print(kwargs)
print(locals())
func(1, a=2)
# output:
# (1,)
# {'a': 2}
# {'kwargs': {'a': 2}, 'args': (1,)}
单元素元组的语法看起来有点奇怪。不过习惯就好了。
仅需使用尾部逗号就能创建单个元组(也称为单例);在所有其他情况下,逗号是可选的。没有尾部逗号的单个表达式不会创建元组,而是会产生该表达式的值。
3.在元组,列表,集合和字典中解包
>>> *range(4), 4
(0, 1, 2, 3, 4)
>>> [*range(4), 4]
[0, 1, 2, 3, 4]
>>> {*range(4), 4}
{0, 1, 2, 3, 4}
>>> {'x': 1, **{'y': 2}}
{'x': 1, 'y': 2}
在字典中,后一个值将始终覆盖前一个值。
- 注意,我们也可以这样理解
*
可迭代集合解包算子**
字典解包算子
4.Extended Unpacking
:赋值表达式左边的*表达式
赋值表达式左侧的元组(或列表)至多可以包含一个带有单个星号的表达式(称为“星号”表达式,而列表中的其他表达式则称为“强制性”)。
强制表达式的值将根据赋值表达式右边元组(或列表)中对应的元素位置被分配。
例如,如果seq
是可切分的序列,且seq具有至少2个元素,则以下所有赋值均等效:
a, *b, c = seq
[a, *b, c] = seq
a, b, c = seq[0], list(seq[1:-1]), seq[-1]
seq[0]
保证赋值给a
seq[-1]
保证赋值给c
- 其余元素则赋值给
b
,b
一定是个列表。 - 如果
len(seq)==2
,b
为空列表
如果星号表达式赋值的长列表,那么会报错:
*a = range(5) # SyntaxError: starred assignment target must be in a list or tuple
这样就可以了:
*a, = range(5) # OK
a: [0, 1, 2, 3, 4]
该建议也适用于隐式赋值中的元组,例如在for
语句中:
for a, *b in [(1, 2, 3), (4, 5, 6, 7)]:
print(b)
# output:
# [2, 3]
# [5, 6, 7]
更多的例子可以参考 stack overflow: Unpacking, Extended unpacking, and nested extended unpacking
Ref:
http://yaoyao.codes/python/2016/09/25/python-starred-expression
The Python Language Reference - 6.3.4. Calls
The Python Language Reference - 8.6. Function definitions
The Python Language Reference - 6.14. Expression lists
PEP 448 – Additional Unpacking Generalizations
PEP 3132 – Extended Iterable Unpacking
Python中的参数解包:`*`表达式和 `**`表达式的更多相关文章
- python之参数解包
# 参数解包:将整个list当做参数传给函数 list = [1, 2, 4] def add_fn(a, b, c): return a + b + c sum = add_fn(*list) pr ...
- Python中的参数
Python中的参数 1. python函数参数有多重形式: * test(arg1,arg2,`*args`) * test(arg1,arg2,`*args`,`**kwargs`) 2. 其中比 ...
- python基础之打/解包及运算符与控制流程
python基础之打/解包及运算符与控制流程 python中的解压缩(即序列类型的打包和解包) python提供了两个设计元祖和其他序列类型的处理的便利,也就是自动打包与自动解包功能,比如: data ...
- python中常用的导包的方法和常用的库
python中常用的导包的方法 导入包和包名的方法:1.import package.module 2.from package.module import * 例一: ...
- Python中dict详解
from:http://www.cnblogs.com/yangyongzhi/archive/2012/09/17/2688326.html Python中dict详解 python3.0以上,pr ...
- 从 python 中 axis 参数直觉解释 到 CNN 中 BatchNorm 的工作方式(Keras代码示意)
1. python 中 axis 参数直觉解释 网络上的解释很多,有的还带图带箭头.但在高维下是画不出什么箭头的.这里阐述了 axis 参数最简洁的解释. 假设我们有矩阵a, 它的shape是(4, ...
- (转)python中函数参数中如果带有默认参数list的特殊情况
在python中函数参数中如果带有默认参数list遇到问题 先看一段代码 1 2 3 4 5 6 7 8 9 def f(x,l=[]): for i in range(x): ...
- python中函数参数的引用方式
值传递和引用传递时C++中的概念,在python中函数参数的传递是变量指向的对象的物理内存地址!!! python不允许程序员选择采用传值还是传引用.Python参数传递采用的肯定是“传对象引用”的方 ...
- Python 中的时间处理包datetime和arrow
Python 中的时间处理包datetime和arrow 在获取贝壳分的时候用到了时间处理函数,想要获取上个月时间包括年.月.日等 # 方法一: today = datetime.date.today ...
随机推荐
- P3391 【模板】文艺平衡树
模板题 link Splay 区间翻转,存个代码 旋转时,要注意goal是引用 , 并记得修改 , 有标记的一定记得标记下放 , 还有清空 #include<iostream> #incl ...
- vue学习指南:第十二篇(详细) - Vue的 路由 第二篇 ( 路由按需加载(懒加载))
各位朋友 因 最近工作繁忙,小编停更了一段时间,快过年了,小编祝愿 大家 事业有成 学业有成 快乐健康 2020开心过好每一天.从今天开始 我会抽时间把 Vue 的知识点补充完整,以及后期会带给大家更 ...
- Python调用cmd命令
常用的两种方式: 1.python的OS模块. OS模块调用CMD命令有两种方式:os.popen(),os.system(). 都是用当前进程来调用. os.system是无法获取返回值的.当运行结 ...
- 【网站】网站不能在QQ,微信中访问,申诉办法
使用这个网站申诉即可 https://appeal.anquan.org/
- protel99se无法添加库的解决方法
protel99se是很老也很实用的的一门电类专业需要用到的软件,开发时面向XP,对于win7来说存在一定的不兼容性,导致无法添加新的库,本经验为此介绍解决方法.最全,末尾解决win7 32bit 6 ...
- Allegro 反射仿真--仿真设置
一.打开BRD文件 打开PCB SI,启动Cadence Product Choices界面,如图1-1所示,一般我们选择Allegro PCB SI 630(SPECCTRAQuest),具体如下图 ...
- HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out的解决方法
问题描述: Pycharm创建Django项目提示:HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed o ...
- axios中then不用第二个参数,最好用catch
一般来说,不要在then方法里面定义 Reject 状态的回调函数(即then的第二个参数),总是使用catch方法. // bad promise .then(function(data) { // ...
- Junit +cucumber 运行报错 initiallizationError
step1: 访问 https://search.maven.org/ 搜索下载相关jar包 step2: 访问 http://maven.outofmemory.cn/info.cukes/cuc ...
- 矩阵快速幂 F[n]=F[n-2]*2+F[n-1]+i^4 hdu5950
#include<cstdio> #include<algorithm> #include<math.h> #include<string.h> usi ...