参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战
里边出现的英文都来自于python官网的开发者指南PEP 448 – Additional Unpacking Generalizations | Python.org
本文主要就是介绍*
和**
对此展开详细介绍。
Unpacking is proposed to be allowed inside tuple, list, set, and dictionary displays.
解包操作可以应用于元组、列表、集合、字典。
*args
:argument用于列表、元组、集合**kwargs
:kwargument用于字典
首先先回顾一下range
,以及用range
生成元组、列表和集合。
1 | py复制代码li = list(range(7)) |
1 | scss复制代码[0, 1, 2, 3, 4, 5, 6] |
可用位置
*
和**
可以用于任意位置的解包。
Specifically, in function calls, in comprehensions and generator expressions, and in displays.
- function calls:函数调用
- comprehensions and generator expressions:生成器推导式
- displays:显示(我的理解是直接输出?)
display
所谓的用于显示我觉得就是直接输出,(总不可能是直接输出😶)。
1 | py复制代码li = list(range(7)) |
1 | 复制代码0 1 2 3 4 5 6 0 1 2 3 4 5 6 0 1 2 3 4 5 6 |
上边是*
直接完成了列表、元组和集合的解包。
但是不能用**
对字典解包,print(**{"name":"sian","name":25})
会报错SyntaxError: invalid syntax
。
虽然不能用于直接输出,但是可以切片。
1 | py复制代码dic = {"name":"sian","name2":"sian"} |
1 | css复制代码{'a':0,"name":"sian","name2":"sian",'c':1} |
**
都可以切片了,那*
也可以:
1 | py复制代码li = [1,2,3] |
1 | csharp复制代码[1, 1, 2, 3, 0] |
Comprehensions and generator expressions
生成器推导式就是:
1 | py复制代码print(i for i in range(7)) |
1 | csharp复制代码<generator object <genexpr> at 0x000002502D43A510> |
输出告诉你这是一个生成器对象。
可以用生成器对象创建列表和集合,但是直接无法创建元组。
1 | py复制代码li = [i for i in range(7)] |
1 | csharp复制代码[0, 1, 2, 3, 4, 5, 6] {0, 1, 2, 3, 4, 5, 6} |
用*
解包生成器对象就是:
1 | py复制代码print(*[i for i in range(7)]) |
1 | 复制代码0 1 2 3 4 5 6 |
直接连变量名都省了:clap:。
Function call
用于函数调用就很常见了。
1 | py复制代码def function(num,*args): |
1 | css复制代码1 |
*args
用于接收任意长度的参数并将其打包存储在元组中。
但是位置不够灵活,它会接收从*args
开始位置到最后的所有参数。
- 比如
def function(first,*args,last):
,last会接收不到参数,报错function() missing 1 required keyword-only argument: 'last'
但是你可以手动指定参数来解决这个问题。比如这样强行给last一个值。
1 | python复制代码def function(first,*args,last="c"): |
1 | makefile复制代码first: 1 |
*args
之前的参数无法手动指定。
1 | py复制代码def function(first='a',*args): |
1 | makefile复制代码first: 1 |
再看一下**
接收参数将其打包为字典。
1 | py复制代码def function(first='a',**kwargs): |
1 | css复制代码first: 1 |
参数列表的位置有一点和*
一样,也是之后不能有参数。会报错SyntaxError: invalid syntax
。但是前面的参数可以指定了。
本文转载自: 掘金