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