34

如此处所述,您可以使用星号来解压缩未知数量的变量(如在函数中),但仅限于 python 3:

>>> a, *b = (1, 2, 3)
>>> b
[2, 3]
>>> a, *b = (1,)
>>> b
[]

在 python 2.7 中,我能想到的最好的方法是(不可怕,但很烦人):

c = (1, 2, 3)
a, b = c[0], c[1:] if len(c) > 1 else []

有没有办法像除法一样从 __future__ 导入它,还是我需要自己的函数在 python 2.7 中进行未知长度的解包?

4

3 回答 3

31

在 python 2.X 中,你可以这样做:

c = (1, 2, 3)
a, b = c[0], c[1:]

只要c至少有一个成员,它就可以工作,因为如果它只有c1 个东西。c[1:][]

您可能应该确保至少有一件事c,否则c[0]会引发异常。

您可以执行以下操作:

try:
    c = tuple(c)
    a, b = c[0], c[1:]
except TypeError, IndexError:
    # c is not iterable, or c is iterable, but it doesn't have any stuff in it.
    # do something else
    pass
于 2012-05-29T04:16:45.613 回答
2
(a,b) = (None, []) if not len(c) else (c[0], c[1:])

也是处理 c 为空序列的情况的一种选择,尽管它不会区分 [None] 和 [] 作为对 a、b 的赋值。所以小心使用它,try / except 可能是最好的。

在处理空容器时,我看不出 Python 3 和 2.7 之间没有真正的区别,但这里 Python 3 的好处是它适用于任何可迭代对象。

如果您知道 c 是生成器,这在 2.7 中有效。

a,b = c.next(), c

但是解包的全部美感似乎需要 Python 3。

于 2013-10-04T22:31:01.577 回答
-1

回答 ex13.py

from sys import argv

script=argv

def Fun(arg1, *argv): 
    print "First argument :", script 

    for arg in argv: 
        print"Your variable is:", arg

Fun('scrpit', 'first', 'second', 'third')
于 2019-03-29T02:14:26.970 回答