laiyuanjie 发表于 2024-5-8 11:58:43

我用yield这个关键字,遍历后超出了列表范围打印了错误,得怎么处理好一点

    def get_comment_message(self):
      for i in range(0,len(self.comment_message)):
            self.aa = self.comment_message
            i += 1
            yield self.aa
      else:
            yield ["别按了","已经到了底了"]



我遍历了self.comment_message,如果后面没有了,就打印这句"别按了","已经到了底了",,但是如果接着按的话,就会抛出这个异常:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
File "C:\Users\Administrator\PycharmProjects\Baohui_Attendance\views.py", line 42, in next_message
    b = next(self.menber_comment_message)
StopIteration

所以我得怎么处理比较好,就是遍历完了之后,如果接着按bottom,它直接打印这句["别按了","已经到了底了"],,继续按就继续执行这句["别按了","已经到了底了"]

FishC 发表于 2024-5-8 11:58:56

你可以在捕获到StopIteration异常后,使用一个标志位来控制是否继续执行。以下是一个示例代码:

class Example:
    def __init__(self, comment_message):
      self.comment_message = comment_message
      self.flag = True

    def get_comment_message(self):
      for i in range(len(self.comment_message)):
            yield self.comment_message
      else:
            self.flag = False

# 示例用法
example = Example(["消息1", "消息2", "消息3"])
gen = example.get_comment_message()

while True:
    try:
      message = next(gen)
      print(message)
    except StopIteration:
      if example.flag:
            print("别按了,已经到底了")
      break

在这个示例中,通过引入标志位`flag`来控制是否继续执行的逻辑。当遍历结束时,将`flag`设置为False,并在捕获到StopIteration异常后判断`flag`的值,如果为True,则输出"别按了,已经到底了"。

这样,就能够在遍历完列表后,控制是否继续执行后续代码,避免抛出StopIteration异常。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

isdkz 发表于 2024-5-8 12:08:24

本帖最后由 isdkz 于 2024-5-8 12:25 编辑

from itertools import cycle
def get_comment_message(comment_message):
    for i in range(0,len(comment_message)):
      aa = comment_message
      yield aa
    else:
      yield from cycle((["别按了","已经到了底了"],))

test = get_comment_message()

print(next(test))
print(next(test))
print(next(test))
print(next(test))
print(next(test))
print(next(test))
print(next(test))

某一个“天” 发表于 2024-8-3 12:53:22

try...except StopIteration:{:10_256:}
简单易用
页: [1]
查看完整版本: 我用yield这个关键字,遍历后超出了列表范围打印了错误,得怎么处理好一点