Fat*_*ici 6 python tuples list-comprehension python-2.7 python-3.x
众所周知,元组不是用括号定义的,而是用逗号定义的.从文档引用:
元组由许多以逗号分隔的值组成
因此:
myVar1 = 'a', 'b', 'c'
type(myVar1)
# Result:
<type 'tuple'>
Run Code Online (Sandbox Code Playgroud)
另一个惊人的例子是:
myVar2 = ('a')
type(myVar2)
# Result:
<type 'str'>
myVar3 = ('a',)
type(myVar3)
# Result:
<type 'tuple'>
Run Code Online (Sandbox Code Playgroud)
即使是单元素元组也需要逗号,并且总是使用括号来避免混淆.我的问题是:为什么我们不能在列表推导中省略数组的括号?例如:
myList1 = ['a', 'b']
myList2 = ['c', 'd']
print([(v1,v2) for v1 in myList1 for v2 in myList2])
# Works, result:
[('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd')]
print([v1,v2 for v1 in myList1 for v2 in myList2])
# Does not work, result:
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
是不是第二个列表理解只是以下循环的语法糖,哪个确实有效?
myTuples = []
for v1 in myList1:
for v2 in myList2:
myTuple = v1,v2
myTuples.append(myTuple)
print myTuples
# Result:
[('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd')]
Run Code Online (Sandbox Code Playgroud)
Sil*_*olo 12
Python的语法是LL(1),这意味着它在解析时只向前看一个符号.
[(v1, v2) for v1 in myList1 for v2 in myList2]
Run Code Online (Sandbox Code Playgroud)
在这里,解析器看到这样的东西.
[ # An opening bracket; must be some kind of list
[( # Okay, so a list containing some value in parentheses
[(v1
[(v1,
[(v1, v2
[(v1, v2)
[(v1, v2) for # Alright, list comprehension
Run Code Online (Sandbox Code Playgroud)
但是,如果没有括号,它必须在早些时候作出决定.
[v1, v2 for v1 in myList1 for v2 in myList2]
[ # List-ish thing
[v1 # List containing a value; alright
[v1, # List containing at least two values
[v1, v2 # Here's the second value
[v1, v2 for # Wait, what?
Run Code Online (Sandbox Code Playgroud)
回溯的解析器往往很慢,因此LL(1)解析器不会回溯.因此,禁止使用模糊语法.