我试图从一个序列解压缩一组电话号码,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
>>>
请解释一下。有没有其他方法可以做同样的事情?
答案 0 :(得分:17)
您在Python 2中使用Python 3特定语法。
Python 2中没有用于赋值中的扩展可迭代解包的*
语法。
请参阅Python 3.0, new syntax和PEP 3132。
使用带有*
splat参数解包的函数来模拟Python 2中的相同行为:
def unpack_three(arg1, arg2, *rest):
return arg1, arg2, rest
name, email, phone_numbers = unpack_three(*user_record)
或使用列表切片。
答案 1 :(得分:14)
这个新语法是introduced in Python 3。因此,它会在Python 2中引发错误。
相关PEP:PEP 3132 -- Extended Iterable Unpacking
name, email, *phone_numbers = user_record
Python 3:
>>> a, b, *c = range(10)
>>> a
0
>>> b
1
>>> c
[2, 3, 4, 5, 6, 7, 8, 9]
Python 2:
>>> a, b, *c = range(10)
File "<stdin>", line 1
a,b,*c = range(10)
^
SyntaxError: invalid syntax
>>>
答案 2 :(得分:7)
该功能仅在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