Python中的生成器,代表无限流

Generator in Python, representing infinite stream

我的代码如下:

def infinite_loop():
    li = ['a', 'b', 'c']
    x = 0                           
   
    while True:
        yield li[x]
        if x > len(li):
           x = 0
        else:
           x += 1

我收到列表索引超出范围错误。我的代码出了什么问题?

测试差2。最高有效索引为len(li) - 1,因此使用该索引后,需要重置为0:

def infinite_loop():
    li = ['a', 'b', 'c']
    x = 0                           
   
    while True:
        yield li[x]
        if x == len(li) - 1:
           x = 0
        else:
           x += 1

当您尝试访问 li[x]x 等于或大于列表的大小时,它将抛出 OutOfRange 异常。

    while True:
        # if x==3 this will throw error
        yield li[x]

        if x > len(li):
           x = 0
        else:
           x += 1

如果在 if 语句之后移动 yield,错误将消失

    while True:
        # if x==3, the following statement will assign 0 value to x
        # But you need to check with >= instead of >
        
        if x >= len(li):
           x = 0
        else:
           x += 1

        yield li[x]

但你可以使用模运算符 (%) 来简化它

    while True:
        yield li[x % len(li)]
        x += 1

这是一个工作示例:https://repl.it/@HarunYlmaz/python-generator