Python:用于语句行为
我的问题涉及这项声明的产出:Python:用于语句行为,python,syntax,Python,Syntax,我的问题涉及这项声明的产出: for x in range(4), y in range(4): print x print y 结果: [0, 1, 2, 3] 2 True 2 这似乎是一个比较,我只是不明白为什么输出是这样的结构。你在那里创造了一个奇怪的东西 >>> y = 2 >>> range(4), y in range(4) ([0, 1, 2, 3], True) 范围(4)中的y是一个成员资格测试 范围(4),范围(4)
for x in range(4), y in range(4):
print x
print y
结果:
[0, 1, 2, 3]
2
True
2
这似乎是一个比较,我只是不明白为什么输出是这样的结构。你在那里创造了一个奇怪的东西
>>> y = 2
>>> range(4), y in range(4)
([0, 1, 2, 3], True)
范围(4)中的y是一个成员资格测试
范围(4),范围(4)中的y
是一对项目;元组
变量x
设置为范围(4),然后是范围(4)
中y的结果
变量y
仅仅是一个值;它不是由for
语句设置的
这只适用于在命令行中输入任意内容,并在左下角放置y
这根本不是明智的Python代码
[是的,
中的一词有两种含义。
()和其他几段语法也是如此。在运行此代码之前,您似乎已经定义了y
。您正在迭代的是一个两项元组:第一项是range
生成的列表,第二项是True
,它是范围(4)中y的结果:
我怀疑您试图做的是迭代两个列表中的两个变量。用于此操作。我猜您正在从交互式控制台运行此操作,并且已使用值2定义了y
(否则,您将得到NameError:未定义名称“y”
)。这将导致您观察到的输出
这是由于对于范围(4)中的x,范围(4)中的y:
在计算时实际上等于以下值:
for x in (range(4), y in range(4)):
这减少到
for x in ([0,1,2,3], 2 in range(4)):
for x in ([0,1,2,3], True):
这又归结为
for x in ([0,1,2,3], 2 in range(4)):
for x in ([0,1,2,3], True):
这将导致
循环的迭代2次,因为它迭代元组的每个元素:
x=[0,1,2,3]
x=True
(当然,y
仍然是2。)Dav完美地确定了您编写的语法不起作用的原因。
下面是一些语法,它们对您可能要做的事情起作用:
如果希望x和y的所有4 x 4组合,则需要2个嵌套循环:
for x in range(4):
for y in range(4):
print x, y
或者,如果您确实想使用一个循环:
import itertools
for (x, y) in itertools.product(range(4), range(4)):
print x, y
生成所有可能的组合:
在这种简单的情况下,它的可读性不如2个循环,但itertools模块还有许多其他强大的功能,值得了解
如果希望x
和y
在两个序列上并行前进(也称为“锁步”迭代):
[背景:名称zip
来自Haskell;想想拉链是如何从这里取一颗牙,从那里取一颗牙的:
zip()?Mine在for
上失败,出现名称错误:未定义名称“y”
。您正在使用哪一版本的Python?您是否正在尝试编写嵌套循环?你在用什么教程?@Marcelo:y在我没注意到的时候被初始化了。见下面的答案@洛特:没有教程。在尝试寻找两个变量上的循环的简短形式时注意到了这一点……也许你应该找到一个好的教程。好的,似乎我初始化了y一些行。我没有注意到that@BandGap:然后您会得到一个名称错误:未定义名称“y”
。所以我很确定它是初始化的。@BandGap,在运行循环之前用另一个打印测试一下怎么样?它不应该用在任何脚本中,我只是想知道这里会发生什么,感谢这个深入的分析zip(范围(4),范围(4))
是一个毫无用处的例子;)我知道拉链是怎么工作的。谢谢我不是一个彻头彻尾的傻瓜,只是因为SilentGhost给问题贴上了“初学者”的标签:我们怎么知道?我认为这是一个很好的答案,他显然花了时间来帮助我。对不起,我并不是有意要表现出居高临下的态度,只是相信一般来说,自足的解释会更好。此外,在某些情况下,可能在谷歌上搜索这个问题的人可能是python noobs。[并把图片放进去,因为我真的很喜欢拉链动画;我现在梦想建立一些动画编程参考…]