Python:用于语句行为

时间:2010-05-05 10:16:29

标签: python syntax

我的问题涉及本声明的输出:

for x in range(4), y in range(4):
    print x
    print y

结果:

[0, 1, 2, 3]
2
True
2

似乎涉及到比较,我只是无法弄清楚为什么输出的结构是这样的。

4 个答案:

答案 0 :(得分:6)

我的猜测是你从交互式控制台运行它,并且已经定义y值为2(否则,你得到NameError: name 'y' is not defined)。这将导致您观察到的输出。

这是因为for x in range(4), y in range(4):在评估时实际上等同于以下内容:

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循环的2次迭代,因为它迭代元组的每个元素:

  1. x = [0,1,2,3]
  2. x = True
  3. (当然,y仍为2。)

答案 1 :(得分:3)

你在那里创造了一个奇怪的,奇怪的东西。

>>> y = 2
>>> range(4), y in range(4)
([0, 1, 2, 3], True)

y in range(4)是会员资格测试。

range(4), y in range(4)是一对物品;一个元组。

变量x设置为范围(4),然后设置为y in range(4)的结果。

变量y只是带着一个值;它不是由for语句设置的。

这只能在命令行上进行黑客攻击,并在y左右放置随机内容。

这根本不是合理的Python代码。

[是的,单词in有两个含义。 ()和其他几种语法也是如此。]

答案 2 :(得分:3)

在运行此代码之前,您似乎已定义y。您要迭代的是两项元组:第一项是range - 生成列表,第二项是True,这是y in range(4)的结果:

>>> y = 2
>>> for x in range(4), y in range(4):
    print x, 'x'
    print y, 'y'


[0, 1, 2, 3] x
2 y
True x
2 y

我怀疑你试图做的是迭代两个列表中的两个变量。请使用zip

答案 3 :(得分:1)

达文完全确定了为什么你写的语法不起作用。 以下是适用于您可能尝试执行的操作的语法:


如果你想要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

itertools.product()生成所有可能的组合:

alt text

在这个简单的情况下,这比2个循环的可读性差,但是itertools模块还有许多其他强大的功能,值得了解......


如果您希望xy在两个序列上并行前进(也称为“锁步”迭代):

for (x, y) in zip(range(4), range(4)):
    print x, y
# `zip(range(4), range(4))` is silly since you get x == y;
# would be useful for different sequences, e.g.
# zip(range(4), 'abcd')

[背景:名称zip来自Haskell;想想拉链如何从这里拿出一颗牙齿,从那里拿出一颗牙齿:
link text

zip()切断最短序列的长度; itertools模块有其他变体......]