括号的用法是否对Python for循环的变量声明语法有任何影响?
示例1:基本声明i
没有括号的循环
>>> for i in range(0,10): print(i)
...
0
1
2
3
4
5
6
7
8
9
使用任意括号声明i
的基本循环
for (((((i))))) in range(0,10): print(i)
...
0
1
2
3
4
5
6
7
8
9
for循环,解包两个值,没有括号声明
>>> for x,y in zip(range(0,10), range(0,10)): print(x,y)
...
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
同样的事情,但在x,y和两者都有括号。
>>> for ((x),(y)) in zip(range(0,10), range(0,10)): print(x,y)
...
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
所以似乎圆括号没有效果 - 它们不会被解释为创建,例如,元组。我是否正确,或者是否有任何理由在for循环变量声明中使用括号?
显然,你甚至可以这样说:
>>> for [x,y] in zip(range(0,10), range(0,10)): print(x,y)
...
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
...并且列表符号(括号)似乎也没有效果。
答案 0 :(得分:5)
仅括号仅用于对表达式进行分组(覆盖运算符优先级,能够跨越多行等)。
如果您想创建元组,请使用逗号:
>>> 1
1
>>> 1,
(1,)
答案 1 :(得分:2)
除了空元组()
之外,它不是定义元组的括号,而是逗号。括号只是将元组项与周围的代码分开。
# These are all identical: x is a tuple with 2 elements.
x = (1, 2)
(x) = (1, 2)
x = 1, 2
(x) = 1, 2
# These are all identical: x is assigned the first element of the tuple (1, 2)
x, = (1, 2)
(x,) = (1, 2)
x, = 1, 2
(x,) = 1, 2
答案 2 :(得分:1)
是否有任何理由在for循环变量中使用括号 声明?
是的,您需要它们来解压缩更复杂的迭代。具体来说,嵌套的iterables,例如:
enumerate(zip(range(10), range(10, 20)))
使用括号,一切正常:
>>> for x, (y, z) in enumerate(zip(range(10), range(10, 20))):
... print("x=", x, "y=", y, "z=", z)
...
x= 0 y= 0 z= 10
x= 1 y= 1 z= 11
x= 2 y= 2 z= 12
x= 3 y= 3 z= 13
x= 4 y= 4 z= 14
x= 5 y= 5 z= 15
x= 6 y= 6 z= 16
x= 7 y= 7 z= 17
x= 8 y= 8 z= 18
x= 9 y= 9 z= 19
>>>
因为x, (y, z)
匹配由以下内容返回的可迭代结构:
enumerate(zip(range(10), range(10, 20)))
但是,如果没有括号,您将引发ValueError
:
>>> for x, y, z in enumerate(zip(range(10), range(10, 20))):
... print("x=", x, "y=", y, "z=", z)
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: need more than 2 values to unpack
>>>
因为Python看到x, y, z
因此需要:
enumerate(zip(range(10), range(10, 20)))
返回三项迭代,只返回两项迭代(带有数字和另外两项元组的元组):
>>> for item in enumerate(zip(range(10), range(10, 20))):
... print(item)
...
(0, (0, 10))
(1, (1, 11))
(2, (2, 12))
(3, (3, 13))
(4, (4, 14))
(5, (5, 15))
(6, (6, 16))
(7, (7, 17))
(8, (8, 18))
(9, (9, 19))
>>>