【问题标题】:Python star unpacking for version 2.72.7版的Python星解包
【发布时间】:2012-06-03 07:29:15
【问题描述】:

正如here 所提到的,您可以使用星号来解压未知数量的变量(例如在函数中),但仅限于 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 中进行未知长度的解包?

【问题讨论】:

  • 没有。这是为数不多的 Py3k only 功能之一。
  • 这叫扩展解包

标签: python iterable-unpacking


【解决方案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')

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关 why 和/或 如何 此代码回答问题的附加上下文可提高其长期价值.
【解决方案2】:

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

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

只要c 至少有一个成员,它就可以工作,因为如果c 里面只有一件东西,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

【讨论】:

  • 仅当c 是一个序列时。解包适用于任何可迭代对象,因此要获得完整的解决方案,请先执行c = tuple(c)。这准确地模拟了行为,包括挂在无限迭代上。但是你还是要为a, *b, c = range(10)加倍努力;但没有真正的解决办法。
  • print ImageFileList iflt = tuple(ImageFileList) for x,y in iflt[0], iflt[1:]:为什么我仍然收到错误消息? ValueError:解压的值太多 ImageFileList 只是文件名列表
【解决方案3】:
(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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 2014-11-19
    • 1970-01-01
    相关资源
    最近更新 更多