当前位置: 首页 > 知识库问答 >
问题:

嵌套for循环:为什么内部循环只执行一次?

陈兴朝
2023-03-14

我对python中双for循环的使用感到困惑,这是我的代码:

import numpy as np

range1 = np.linspace(1,6,10)
range2 = reversed(np.linspace(1,6,10))

for t1 in range1:
    print t1
    for t2 in range2:
        print t1,t2

输出如下:

1.0
1.0 6.0
1.0 5.44444444444
1.0 4.88888888889
1.0 4.33333333333
1.0 3.77777777778
1.0 3.22222222222
1.0 2.66666666667
1.0 2.11111111111
1.0 1.55555555556
1.0 1.0
1.55555555556
2.11111111111
2.66666666667
3.22222222222
3.77777777778
4.33333333333
4.88888888889
5.44444444444
6.0

它只对外循环的第一个值执行内循环,为什么会发生这种情况?我怎样才能让它在第一个和第二个变量的所有组合上循环?

共有3个答案

陆俊捷
2023-03-14

反向返回一个迭代器。一个迭代器只能使用一次。

在第一次迭代中使用该迭代器。

要多次使用迭代器,您可以将其存储在list中:

import numpy as np

range1 = np.linspace(1,6,10)
range2 = list(reversed(np.linspace(1,6,10)))  # store in list

for t1 in range1:
    print t1
    for t2 in range2:
        print t1,t2

迭代器的一个好处是永远不会计算整个列表。您可以在不创建整个[0,1,…,1000000]列表的情况下迭代100万个元素,如果您的算法希望在满足条件时打破循环,这会更好。

在一个简单的例子中,比如在OP中,列表很短,并且你知道你将迭代所有元素,所以使用列表是非常简单和有效的。

黄俊雄
2023-03-14

在每个尊重pythons数据模型的实现中,反转的结果只能耗尽一次(因为它应该返回一个在第一次遍历后耗尽的迭代器)。迭代器耗尽后,它将不再产生任何项目。但是您可以简单地使用切片来反转您的数组:

range2 = np.linspace(1,6,10)[::-1]

for t1 in range1:
    print t1
    for t2 in range2:
        print t1,t2

numpy的基本切片。数组s的性能非常好,它甚至不需要复制原件。

考虑到您使用的是arrays,您应该意识到迭代它们是一个非常缓慢的操作,因为在迭代过程中,每个值都需要取消绑定。如果你真的需要迭代一维数组s(提示:你通常不需要),你应该把它们转换成列表s:

range1 = np.linspace(1,6,10).tolist()
range2 = np.linspace(1,6,10)[::-1].tolist()

因为与for-循环中的(隐式)解装箱相比,tolist在解装箱时更有效。

丁鸿信
2023-03-14

reversed()生成迭代器;一旦到达迭代器的末尾,就不能重复使用它:

>>> it = reversed([1, 2, 3])
>>> list(it)
[3, 2, 1]
>>> list(it)
[]

为嵌套循环创建新的迭代器:

for t1 in range1:
    print t1
    for t2 in reversed(range1):
        print t1,t2

反转()留档链接到迭代器词汇表条目:

当没有更多数据可用时,将引发StopIteration异常。此时,迭代器对象已耗尽,对其__next__()方法的任何进一步调用只需再次引发StopIteration

我的。

 类似资料:
  • 我想在一个并行外部循环中运行一个包含for循环(应该并行运行)的函数。因此看起来如下所示: 给定上面的代码,我希望在函数中为循环创建5个并行线程,并且希望这5个线程中的每个线程创建另一个线程来运行自己的并行for循环。

  • 我试图在for循环中获得for循环,因此输出如下: 我希望输出显示一个正方形 我不知道它为什么不这样做。下面是我的代码:

  • 我发现这样的php代码: 我希望这个循环会执行4次,因为$I变成了对$的引用(对吗?)。然而,循环只执行一次,并输出: a=10,i=10 我不明白为什么它会这样工作。有什么想法吗?

  • 我有一个嵌套的for循环,但是它会减慢一点处理速度,我如何才能使嵌套循环高效。我需要的是对于外循环的每个值,内循环继续其所有迭代。但是,我不认为它会像两个嵌套循环那样影响计算。我的第二个问题是,循环会影响速度还是会支持我的现象? 我的代码:

  • 我一直在读一本面向初学者的书,“第一头HTML5编程”,其中有这样一段代码: 目前,如果我调用,它将返回下一次显示是在下午5:00。我将循环条件更改为“I<=movie.showtimes.length;”但它仍然只运行一次,并且只显示下午5点。循环只迭代一次,即使我重写了这个函数: 不是应该跑两次吗?

  • 和其他编程语言一样, Java 允许循环嵌套。如果把一个循环放在另一个循环体内,那么就可以形成嵌套循环。 嵌套循环既可以是 for循环嵌套 while 循环,也可以是 while 循环嵌套 do-while 循环 …… 即各种类型的循环都可以作为外层循环,也可以作为内层循环。 当程序遇到嵌套循环时,如果外层循环的循环条件允许,则开始执行外层循环的循环体,而内层循环将被外层循环的循环体来执行——只是