x,y,z = [1,2,3], [4,5,6], [7,8,9]
for a,b,c in x,y,z:
print(a,b,c)
输出是:这段代码是怎么回事?
1 2 3
4 5 6
7 8 9
我不能精神上导航任何逻辑是怎么回事这里产生这种输出。我知道压缩函数使得这个代码按照我明确打算的方式工作;但我只是试图了解为什么它在你不使用zip函数时以这种方式工作。
这是一个故意的功能,一个功能,你可以连续迭代多个列表这种方式吗?有点?
x,y,z = [1,2,3], [4,5,6], [7,8,9]
for a,b,c in x,y,z:
print(a,b,c)
输出是:这段代码是怎么回事?
1 2 3
4 5 6
7 8 9
我不能精神上导航任何逻辑是怎么回事这里产生这种输出。我知道压缩函数使得这个代码按照我明确打算的方式工作;但我只是试图了解为什么它在你不使用zip函数时以这种方式工作。
这是一个故意的功能,一个功能,你可以连续迭代多个列表这种方式吗?有点?
你有很好的答案了,但我认为考虑到这相当于变化将有助于更清楚:
x,y,z = [1,2,3], [4,5,6], [7,8,9]
for t in x,y,z:
a, b, c = t
print(a,b,c)
你并不感到惊讶,t
连续势必x
,y
和z
,对不对?正是同样的事情也发生在你的原代码,不同之处在于:
a, b, c = t
部分就没有那么明显。 “我明确打算的方式”是什么?
我不得不像三次阅读'a,b,c = t'(这听起来很奇怪),但之后它被点击了。 – Aerovistae
太棒了!我认为这是混淆的真正根源,所以把它分解出来。现在,您再也不会对任何事情感到惊讶;-) –
永远,在任何我选择探索的知识领域。我会永远记得今晚,这一切都为我转身。 – Aerovistae
哦,这人是一团糟。这只是使用python的iterable unpacking。声明a, b, c = iterable
只是将iterable
的元素分配给变量a
,b
和c
。在这种情况下iterable
必须有3个元素。
首先,你必须:
x,y,z = [1,2,3], [4,5,6], [7,8,9]
# Which is:
x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
,那么你必须:
for a, b, c in x, y, z:
print(a, b, c)
# Which is:
temp = (x, y, z)
for item in temp:
a = item[0]
b = item[1]
c = item[2]
print(a, b, c)
还有一点要注意的是,声明mytuple = 1, 2, 3
相同mytuple = (1, 2, 3)
。
这个答案与蒂姆彼得斯的答案一起使它很清楚,谢谢。 – Aerovistae
真的很直接的代码。
这三个列表分配给x
,y
和z
。
x,y,z = [1,2,3], [4,5,6], [7,8,9]
这创建的(x,y,z)
的元组,并且将各元素迭代。
for a,b,c in x,y,z:
然而,a,b,c
指iterables预期具有3个对象
然后,该打印a
,b
和c
。
print(a,b,c)
如果你想看看发生了什么,我建议改变的要素之一y
:
x,y,z = [1,2,3], [3,4,5,6], [7,8,9]
for a,b,c in x,y,z:
print(a,b,c)
1 2 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
或者通过移除一个从x
:
x,y,z = [1,2], [4,5,6], [7,8,9]
for a,b,c in x,y,z:
print(a,b,c)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: need more than 2 values to unpack
随着蒂姆的回答,我最好清楚,最后一个例子非常有帮助。 –
看起来你有3个阵列
x = [1,2,3]
y = [4,5,6]
z = [7,8,9]
和a,b,c代表每个阵列中的元素。所以它看起来像for循环遍历3个数组并将元素映射到a,b和c。然后打印出来。再说,我不知道蟒蛇
一切都在这里解释:http://docs.python.org/2/tutorial/datastructures.html#tuples-and-sequences
第一部分是认识到逗号隐式创建的元组。因此,第一行是等同于:
x,y,z = ([1,2,3], [4,5,6], [7,8,9])
这也意味着你的for循环相当于:
for a,b,c in ([1,2,3], [4,5,6], [7,8,9]):
第二部分理解的是序列拆封。这意味着如果您分配了一个长度为n
到n
变量的序列,Python会适当地分配序列中的项目。所以第一部分实际上是:
x = [1,2,3]
y = [4,5,6]
z = [7,8,9]
而且for循环是一样的:
for t in (x,y,z):
a = t[0]
b = t[1]
c = t[2]
print(a,b,c)
x,y,z = [1,2,3], [4,5,6], [7,8,9]
是等于说
x = [1,2,3]
y = [4,5,6]
z = [7,8,9]
下一页
for a,b,c in x,y,z:
相当于
for a,b,c in [x,y,z]:
这只是说:“取反过来x
,y
和z
。将其内容分别分配到a
,b
和c
;即a=x[0]
,b=x[1]
,c=x[2]
。
最终,这变成
a,b,c = x
print(a,b,c)
a,b,c = y
print(a,b,c)
a,b,c = z
print(a,b,c)
很有帮助,但我认为'对于a,b,c in [x,y,z]:'应该被写为'for a,b,c in(x,y,z):',我的意思是元组而不是列表,不是? –
这是一个不寻常的蟒蛇的事情。隐式创建元组。
a, b = 1, 2
是一样的::
在这里,你在正确的
x,y,z = [1,2,3], [4,5,6], [7,8,9]
这是一个类似的代码创建一个匿名元组
a, b = (1, 2)
或
a = 1
b = 2
它允许一个普通的python trick(idiom)。您可以交换价值没有一个临时变量:
a, b = b, a
同样的情况,互动的词典的键和值:
for i, j in my_dict.items():
print i, j
在代码中,在创建for循环的另一个临时元组:
for a,b,c in (x,y,z):
print(a,b,c)
这意味着:
for a, b,c in ([1,2,3], [4,5,6], [7,8,9]):
print(a,b,c)
换句话说:重写这段代码更清晰。 Python并没有遵循自己的口头禅:显式比隐式更好。。
顺便说一句,请参阅有趣的Python Zen在Python shell中输入import this
。
“我明确打算的方式”?大声笑 - 我不知道你打算在这里;-) –
我猜OP要'1 4 7'等 –