在 Python 3 中,我可以执行以下操作(另请参阅PEP3132 on Extended Iterable Unpacking):
a, *b = (1, 2, 3)
# a = 1; b = (2, 3)
我该怎么做才能在 Python 2.x 中实现同样的优雅?
我知道我可以使用单元素访问和切片操作,但我想知道是否有更Pythonic的方式。到目前为止我的代码:
a, b = (1, 2, 3)[0], (1, 2, 3)[1:]
# a = 1; b = (2, 3)
在 Python 3 中,我可以执行以下操作(另请参阅PEP3132 on Extended Iterable Unpacking):
a, *b = (1, 2, 3)
# a = 1; b = (2, 3)
在 Python 3 中,我可以执行以下操作(另请参阅PEP3132 on Extended Iterable Unpacking):
a, *b = (1, 2, 3)
# a = 1; b = (2, 3)
我该怎么做才能在 Python 2.x 中实现同样的优雅?
我知道我可以使用单元素访问和切片操作,但我想知道是否有更Pythonic的方式。到目前为止我的代码:
a, b = (1, 2, 3)[0], (1, 2, 3)[1:]
# a = 1; b = (2, 3)
我可能错了,但据我所知
a, *b = (1, 2, 3)
只是用于切片和索引元组的语法糖。我觉得它很有用,但不是很明确。
我发现相关的PEP3132 也提供了一些 Python 2.x 的示例:
许多算法需要将序列拆分为“第一个,其余”对:
first, rest = seq[0], seq[1:]
[...]
此外,如果右边的值不是一个列表,而是一个可迭代的,则必须先将其转换为列表,然后才能进行切片;为了避免创建这个临时列表,必须求助于
it = iter(seq) first = it.next() rest = list(it)
这个问题的答案中给出的其他方法:
函数参数列表解包方法
需要额外的函数定义/调用:
def unpack(first, *rest):
return first, rest
first, rest = unpack( *seq )
我想知道为什么它是在解包函数参数列表中实现的,而不是在正常的元组解包中实现的。
生成器方法
学分。还需要自定义函数实现。关于第一个变量的数量更灵活一些。
def unpack_nfirst(seq, nfirst):
it = iter(seq)
for x in xrange(nfirst):
yield next(it, None)
yield tuple(it)
first, rest = unpack_nfirst(seq, 1)
我猜最pythonic可能是上面PEP中提到的那些?
我可能错了,但据我所知
a, *b = (1, 2, 3)
只是用于切片和索引元组的语法糖。我觉得它很有用,但不是很明确。
我有这个方便的小功能:
def just(n, seq):
it = iter(seq)
for _ in range(n - 1):
yield next(it, None)
yield tuple(it)
例如:
a, b, c = just(3, range(5))
print a, b, c
## 0 1 (2, 3, 4)
也适用于更少的参数:
a, b, c = just(3, ['X', 'Y'])
print a, b, c
## X Y ()
作为对评论的回应,您还可以定义:
def take2(a, *rest): return a, rest
def take3(a, b, *rest): return a, b, rest
def take4(a, b, c, *rest): return a, b, rest
... etc
并像这样使用它:
p = (1,2,3)
a, b = take2(*p)
print a, b
## 1 (2, 3)
我认为没有比您发布的更好的方法了,但这里有一种替代方法iter
>>> x = (1,2,3)
>>> i = iter(x)
>>> a,b = next(i), tuple(i)
>>> a
1
>>> b
(2, 3)
不确定上下文,但是 .pop(0) 呢?
我看到你的例子中有元组,但如果你想做你所做的那种事情,我认为列表会更合适?(除非有充分的理由让它们在问题中不可变。)
b = [1,2,3]
a = b.pop(0)