2

所以我有点好奇为什么这不起作用。

代码怎么来的:

for a in range(10) and b in range(10):
  print a + b

生成一个错误,显示“b 未定义”?

此外,代码如下:

for a,b in range(10):
  print a + b

生成错误:'int 对象不可迭代'。

为什么?我没有事先确定它们的值,那么 Python 怎么知道它们是 int 对象呢?另外,我知道您可以改用 while 循环,但是有没有办法单独使用 for 循环来执行我正在执行的那种操作?

4

3 回答 3

3
for a,b in zip(range(10),range(10)):
    print a + b

应该很好用......假设我正确理解了你的问题,如果不是那么

for a in range(10):
    for b in range(10):
        print a+b

甚至[a+b for a in range(10) for b in range(10)]

于 2013-06-21T00:05:38.857 回答
2

其他答案解释了正确的方法,但没有人解释你所做的事情有什么问题。

for a in range(10) and b in range(10):
  print a + b

这是一些直观语法的好主意,但 Python 不知道。你编程的优先级实际上是这样的:

for a in ((range(10)) and (b in range(10))):

Python 认为您正在尝试创建一个复杂的表达式来生成一个迭代的可迭代对象。第一个错误发生在它尝试评估 b 以构建值时。如果定义了 b,那么b in range(10)将导致Trueor False。与它的结果range(10)也将是一个布尔值。然后你会在尝试迭代布尔值时遇到另一个错误。

for a,b in range(10):
  print a + b

如果右侧的枚举包含 2 元组的元素,则这种语法有效。这个 for 循环的第一步相当于尝试a,b = 0。它试图通过迭代来“解包”右侧。但是你不能迭代一个整数。a 和 b 尚未定义,但 range(10) 的第一个元素已定义。那是您无法迭代的整数。

于 2013-06-21T04:57:18.280 回答
1

您只能在循环中一次迭代一个可迭代for对象,您的问题中的代码实际上是无效的。我相信这就是您的意图 -同时迭代两个范围:

for a, b in zip(range(10), range(10)):
    print a + b

zip函数创建一个迭代的 2 元素元组,从每个范围中获取一个元素,然后我们可以将元组中的每个元素解包到单独的变量中。

编辑:

如果您试图将一个循环嵌套在另一个循环中,那么标准的做法是:

for a in range(10):
    for b in range(10):
        print a + b

但是我们可以通过 using 实现相同的效果itertools.product,它看起来更接近您最初的想法:

import itertools as it
for a, b in it.product(range(10), range(10)):
    print a + b
于 2013-06-21T00:05:47.687 回答