Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coding style 元组解包:虚拟变量与索引_Coding Style_Python - Fatal编程技术网

Coding style 元组解包:虚拟变量与索引

Coding style 元组解包:虚拟变量与索引,coding-style,python,Coding Style,Python,用Python编写这篇文章的通常/最清晰的方式是什么 value, _ = func_returning_a_tuple() 或: 对于提取单个项目,索引更为惯用。当您提取两个或多个项目时,解包变得更为惯用。这只是我的经验观察;我不知道有哪一个风格指南推荐或要求任何一个选择 value=func\u returning\u a\u tuple()[0]似乎更清晰,也可以推广 如果函数返回的元组值超过2个怎么办? 如果程序逻辑对无数元组的第四个元素感兴趣怎么办? 如果返回的元组大小不同怎么办?

用Python编写这篇文章的通常/最清晰的方式是什么

value, _ = func_returning_a_tuple()
或:


对于提取单个项目,索引更为惯用。当您提取两个或多个项目时,解包变得更为惯用。这只是我的经验观察;我不知道有哪一个风格指南推荐或要求任何一个选择

value=func\u returning\u a\u tuple()[0]
似乎更清晰,也可以推广

如果函数返回的元组值超过2个怎么办?
如果程序逻辑对无数元组的第四个元素感兴趣怎么办?
如果返回的元组大小不同怎么办?


这些问题都不会影响基于子脚本的习惯用法,但在多赋值习惯用法的情况下会有影响。

如果您希望在python3.x中找到一种简便的方法,请查看python增强建议(PEP)3132:

可扩展的可拆卸包装。您现在可以编写类似
a,b,*rest=some\u sequence
。甚至
*rest,a=stuff
。rest对象始终是一个(可能为空)列表;右手边可以是任何可折叠的。例如:

(a,*rest,b)=范围(5)


这将
a
设置为
0
b
设置为
4
rest
设置为
[1,2,3]
,对于具有键/值对的列表/生成器理解,我认为虚拟变量的使用可以非常简洁,尤其是在需要多次使用未打包的值的情况下(避免重复索引),例如:

与:

s = [x[0] * (1.0 - x[0]) * (2.0 - x[0]) for x in l]
另一件需要注意的事情是,虽然解包和索引的成本大致相当,但扩展解包似乎要慢一个数量级

对于在IPython中使用%timeit的Python 3.2:

定期拆包:

>>> x = (1, 2)
>>> %timeit y, _ = x
10000000 loops, best of 3: 50 ns per loop

>>> %timeit y, _ = x
10000000 loops, best of 3: 50.4 ns per loop
>>> x = (1, 2, 3)
>>> %timeit y, *_ = x
1000000 loops, best of 3: 1.02 us per loop

>>> %timeit y = x[0]
10000000 loops, best of 3: 68.9 ns per loop
扩展解包:

>>> x = (1, 2)
>>> %timeit y, _ = x
10000000 loops, best of 3: 50 ns per loop

>>> %timeit y, _ = x
10000000 loops, best of 3: 50.4 ns per loop
>>> x = (1, 2, 3)
>>> %timeit y, *_ = x
1000000 loops, best of 3: 1.02 us per loop

>>> %timeit y = x[0]
10000000 loops, best of 3: 68.9 ns per loop