Sha*_* Xu 289 python tuples list-comprehension dictionary-comprehension set-comprehension
众所周知,有列表理解,比如
[i for i in [1, 2, 3, 4]]
Run Code Online (Sandbox Code Playgroud)
并且有字典理解,比如
{i:j for i, j in {1: 'a', 2: 'b'}.items()}
Run Code Online (Sandbox Code Playgroud)
但
(i for i in (1, 2, 3))
Run Code Online (Sandbox Code Playgroud)
将最终成为一个发电机,而不是tuple
理解.这是为什么?
我的猜测是a tuple
是不可变的,但这似乎不是答案.
Mar*_*ers 413
您可以使用生成器表达式:
tuple(i for i in (1, 2, 3))
Run Code Online (Sandbox Code Playgroud)
但括号已被用于..生成器表达式.
che*_*ner 68
Raymond Hettinger(Python核心开发人员之一)在最近的一条推文中有关于元组的说法:
#python提示:通常,列表用于循环; 结构的元组.列表是同质的; 元组异构.列表可变长度.
这(对我来说)支持这样的想法,即如果序列中的项目足够相关以由生成器生成,那么它应该是一个列表.虽然元组是可迭代的,看起来就像一个不可变列表,但它实际上是C语言的Python等价物:
struct {
int a;
char b;
float c;
} foo;
struct foo x = { 3, 'g', 5.9 };
Run Code Online (Sandbox Code Playgroud)
变成了Python
x = (3, 'g', 5.9)
Run Code Online (Sandbox Code Playgroud)
czh*_*heo 47
从Python 3.5开始,您还可以使用splat *
unpacking语法来解压缩生成器表达式:
*(x for x in range(10)),
Run Code Online (Sandbox Code Playgroud)
Inb*_*ose 23
理解通过循环或迭代项目并将它们分配到容器中来工作,元组无法接收任务.
创建元组后,无法附加,扩展或分配.修改元组的唯一方法是,如果其中一个对象本身可以分配给(是非元组容器).因为元组只持有对那种物体的引用.
另外 - 元组有自己的构造函数tuple()
,你可以给任何迭代器.这意味着要创建一个元组,你可以这样做:
tuple(i for i in (1,2,3))
Run Code Online (Sandbox Code Playgroud)
小智 20
正如另一张海报所macm
提到的,从发电机创建元组的最快方法是tuple([generator])
.
列表理解:
$ python3 -m timeit "a = [i for i in range(1000)]"
10000 loops, best of 3: 27.4 usec per loop
Run Code Online (Sandbox Code Playgroud)列表理解中的元组:
$ python3 -m timeit "a = tuple([i for i in range(1000)])"
10000 loops, best of 3: 30.2 usec per loop
Run Code Online (Sandbox Code Playgroud)来自发电机的元组:
$ python3 -m timeit "a = tuple(i for i in range(1000))"
10000 loops, best of 3: 50.4 usec per loop
Run Code Online (Sandbox Code Playgroud)拆包时的元组:
$ python3 -m timeit "a = *(i for i in range(1000)),"
10000 loops, best of 3: 52.7 usec per loop
Run Code Online (Sandbox Code Playgroud)我的python版本:
$ python3 --version
Python 3.6.3
Run Code Online (Sandbox Code Playgroud)
因此,除非性能不是问题,否则应始终从列表推导中创建元组.
mgi*_*son 12
我最好的猜测是,他们用完了括号,并且认为它不足以增加一个"丑陋"的语法......
归档时间: |
|
查看次数: |
91529 次 |
最近记录: |