for循环变量声明中括号的行为

时间:2014-07-09 15:31:09

标签: python python-3.x

括号的用法是否对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

...并且列表符号(括号)似乎也没有效果。

3 个答案:

答案 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))
>>>