【问题标题】:Python while loop not breaking when condition met条件满足时Python while循环不会中断
【发布时间】:2019-12-18 12:33:14
【问题描述】:

我意识到我可能犯了一些非常基本的语法错误,但我在修复或谷歌搜索时遇到了麻烦。

我希望进程在达到某个限制时停止。似乎是 while 循环的完美用例。不过……

test_list = []

integers = list(range(40))

while len(test_list) < 20:
    for i in integers:
        test_list.append(i)

这将贯穿整个integers 列表,而不是中途停止。

len(test_list) &lt; 20 现在返回 false。达到条件时循环不应该中断吗?

【问题讨论】:

  • 您有一个嵌套的 for 循环,它将填充 test_list,而 while 循环将在第二次迭代时退出。如果您不明白,请在 while 下方和 test_list.append() 下方添加一条打印语句
  • while 包含for,因此for 将运行一个完整的周期,然后while 将检查条件(再次)。您应该至少摆脱其中一个循环。查找 slicing 以了解如何在不使用循环的情况下完成此操作。

标签: python while-loop syntax


【解决方案1】:

while-loop 的第一次迭代中执行整个for-loop 时发生错误。这会填充列表,然后检查 while 循环的第二次迭代中的条件。

解决方法如下:

test_list = []

integers = list(range(40))

for i in integers:
    test_list.append(i)
    if len(test_list) >= 20:
        break

【讨论】:

    【解决方案2】:

    如前所述,while 条件不会一直被评估,而只会在控制流到达该点时进行评估,即在 for 循环之前和之后,而不是介于两者之间。在这种情况下(结合whilefor),您可以改用itertools.takewhile

    from itertools import takewhile
    for i in takewhile(lambda _: len(test_list) < 20, integers):
        test_list.append(i)
    

    只要 (a) 可迭代对象中有更多元素,并且 (b) 条件成立,就会执行循环。因此,test_list 最终成为 [0, 1, ..., 19]

    当然,在这个非常的特殊情况下,您也可以只使用test_list = integers[:20]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 2013-11-22
      • 2017-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多