【问题标题】:generators, python, infinite loop生成器,python,无限循环
【发布时间】:2020-01-28 00:39:42
【问题描述】:

我正在尝试使用生成器生成奇数列表(只是为了更好地了解生成器)。我编写了以下代码,但是它并没有停止运行!虽然我希望当条件 i>n 满足时代码会停止。 任何帮助表示赞赏。

import sys
def odd(n):
    i=0    
    while True: 
        if i%2==0:
            continue
        yield i
        i+=1
        if i>n:
            return
# Here we build a generator 
g = odd(10)
while True:
    try:
        print(next(g),end=' ')
    except StopIteration:
        sys.exit()

【问题讨论】:

  • i 是偶数时,你永远不会增加它。它甚至永远存在。
  • 你不是在提出停止迭代,你只是在回归。
  • @Neil 这基本上就是return 在生成器函数中所做的。
  • @chepner 在 StopIteration 上使用 while 循环和 try/except 仍然很奇怪,而不是 for
  • @CorentinLimier 不过,这与问题没有任何关系。

标签: python generator


【解决方案1】:

i 为偶数时,您不会递增它,因此它在循环的每次后续迭代中都保持偶数,并且永远不会大于n

你想增加i,不管它是否是偶数。

def odd(n):
    i=0    
    while True: 
        if i%2 != 0:  # yield i only if it is odd
            yield i
        i+=1  # Increment i in either case
        if i>n:
            return

【讨论】:

  • 非常感谢,@chepner。你是对的,我完全忘记了当它是偶数时增加 i。其实我在用python练习一些命令,我​​想用continue看看它是如何工作的。
【解决方案2】:

在我看来,您的代码中存在两个样式问题,难以发现问题:

  1. continue 的使用。一个简单的if 语句可以更容易地查看哪些代码可能不会执行,哪些代码肯定会执行。 continue 主要在您嵌套了 if 语句使事情变得复杂时很有用。

  2. 您没有使用while 条件。这假定while 循环必须至少执行一次。在编写循环时,一般应该考虑如果循环需要执行 0 次会发生什么。如果有人通过-1 的参数怎么办?如果将i 的初始值更改为1 以保存迭代会怎样?


def odd(n):
    i = 0
    while i <= n:
        if i % 2:
            yield i
        i += 1
    # Automatically return and throw StopIteration.

【讨论】:

  • 我不知道我的代码没有格式化。它缩进了 4 个空格。
  • 我添加了一个硬性规则来将代码与编号列表分开。我不知道为什么空行不这样做。
  • 谢谢路德。你的笔记真的很有帮助。
猜你喜欢
  • 2019-12-09
  • 2015-07-01
  • 2018-10-04
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
相关资源
最近更新 更多