Python star 2.7版解包

Python star 2.7版解包,python,iterable-unpacking,Python,Iterable Unpacking,如前所述,您可以使用star来解包未知数量的变量(如函数中的变量),但仅在python 3中: >>> a, *b = (1, 2, 3) >>> b [2, 3] >>> a, *b = (1,) >>> b [] 在Python2.7中,我能想到的最好的方法是(不可怕,但令人讨厌): 是否有一种方法可以从类似于“未来”的除法中导入此项,或者我需要自己的函数在python 2.7中执行未知长度的解包?在python 2.

如前所述,您可以使用star来解包未知数量的变量(如函数中的变量),但仅在python 3中:

>>> a, *b = (1, 2, 3)
>>> b
[2, 3]
>>> a, *b = (1,)
>>> b
[]
在Python2.7中,我能想到的最好的方法是(不可怕,但令人讨厌):


是否有一种方法可以从类似于“未来”的除法中导入此项,或者我需要自己的函数在python 2.7中执行未知长度的解包?

在python 2.X中,您可以执行以下操作:

c = (1, 2, 3)
a, b = c[0], c[1:]
只要
c
至少有一个成员,它就会工作,因为如果
c
中只有一个东西
c[1://code>是
[]

不过,您可能应该确保
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
也是处理c为空序列的情况的一个选项,尽管它不会在分配给a、b时区分[None]和[]。所以小心使用它,try/except可能是最好的

在处理空容器时,我看不出Python3和2.7之间有什么真正的区别,但Python3的优点是它可以处理任何iterable

如果您知道c是一个生成器,那么它在2.7中起作用

a,b = c.next(), c
但解包的全部好处似乎需要Python3。

回答ex13.py
不。这是Py3k仅有的几个特性之一。如果
c
是一个序列,则称为扩展解包。解包可以与任何iterable一起使用,因此要获得完整的解决方案,请首先执行
c=tuple(c)
。这完全模拟了行为,包括挂在无限多个iterables上。但是对于
a,*b,c=range(10)
,您仍然需要更加努力地工作;但是没有真正的解决方法。打印ImageFileList iflt=tuple(ImageFileList)for x,y在iflt[0],iflt[1:]:为什么我仍然收到错误?ValueError:太多的值无法解包ImageFileList只是一个文件名列表,而此代码可能会回答此问题,并提供有关此代码为什么和/或如何回答此问题的其他上下文,从而提高其长期价值。
(a,b) = (None, []) if not len(c) else (c[0], c[1:])
a,b = c.next(), c
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')