12

我试图从一个序列中解压缩一组电话号码,python shell 又会抛出一个无效的语法错误。我正在使用 python 2.7.1。这是片段

 >>> record = ('Dave', 'dave@example.com', '773-555-1212', '847-555-1212')
 >>> name, email, *phone-numbers = record
 SyntaxError: invalid syntax
 >>>

请解释。有没有其他方法可以做同样的事情?

4

3 回答 3

19

您在 Python 2 中使用 Python 3 特定的语法。

*Python 2 中不提供在赋值中扩展可迭代解包的语法。

请参阅Python 3.0、新语法PEP 3132

使用带有*splat 参数解包的函数来模拟 Python 2 中的相同行为:

def unpack_three(arg1, arg2, *rest):
    return arg1, arg2, rest

name, email, phone_numbers = unpack_three(*user_record)

或使用列表切片。

于 2013-05-15T11:18:17.110 回答
14

这种新语法是在 Python 3 中引入的。因此,它会在 Python 2 中引发错误。

相关 PEP:PEP 3132 -- 扩展的可迭代拆包

name, email, *phone_numbers = user_record

蟒蛇 3:

>>> a, b, *c = range(10)
>>> a
0
>>> b
1
>>> c
[2, 3, 4, 5, 6, 7, 8, 9]

蟒蛇2:

>>> a, b, *c = range(10)
  File "<stdin>", line 1
    a,b,*c = range(10)
        ^
SyntaxError: invalid syntax
>>> 
于 2013-05-15T11:18:09.277 回答
8

该功能仅在 Python 3 中可用,另一种方法是:

name, email, phone_numbers = record[0], record[1], record[2:]

或类似的东西:

>>> def f(name, email, *phone_numbers):
        return name, email, phone_numbers

>>> f(*record)
('Dave', 'dave@example.com', ('773-555-1212', '847-555-1212'))

但那是相当hacky IMO

于 2013-05-15T11:20:11.940 回答