【问题标题】:Generator in Python, representing infinite streamPython中的生成器,代表无限流
【发布时间】:2021-01-27 18:39:56
【问题描述】:

我的代码如下:

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

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

【问题讨论】:

  • 您在检查 yield 是否超出范围之前。在分配x 值后尝试移动yield li[x]。或者您可以使用模运算符 yield li[x % len(li)]
  • 您编写此代码而不是使用 itertools.cycle 的任何特殊原因,它正是这样做的?
  • 你想得到什么? a、b 和 c 循环的无限流?
  • @HarunYilmaz 你能澄清一下移动yield li [x]是什么意思吗,我是python新手,无法理解这些概念
  • @SreeramTP 是的,我正在尝试实现流(无限列表)

标签: python loops generator index-error


【解决方案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

【讨论】:

    【解决方案2】:

    当您尝试访问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

    【讨论】:

      猜你喜欢
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      • 2014-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多