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

我用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:59:06

在使用yield进行迭代时,当遍历到最后一个元素后,调用`next()`方法会抛出StopIteration异常,因为没有更多的元素可以生成了。为了解决这个问题,你可以使用try-except语句来捕获StopIteration异常,并在捕获异常后进行相应的处理。

示例代码如下:
def get_comment_message(self):
    for i in range(len(self.comment_message)):
      yield self.comment_message
      
    while True:
      try:
            yield "别按了"
      except StopIteration:
            yield "已经到底了"

在这个示例中,我们在for循环结束后使用while循环来捕获StopIteration异常。当捕获到异常时,我们就生成相应的提示信息,然后再次进入循环等待下一次调用。

这样,即使超出了列表范围,也能通过捕获异常并打印相应的提示信息,而不会导致程序崩溃。

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

isdkz 发表于 2024-5-8 12:07:03

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

from itertools import cycle

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

laiyuanjie 发表于 2024-5-8 12:09:35

FishC 发表于 2024-5-8 11:59
在使用yield进行迭代时,当遍历到最后一个元素后,调用`next()`方法会抛出StopIteration异常,因为没有更多 ...

解决,谢谢

FishC 发表于 2024-5-8 12:09:52

laiyuanjie 发表于 2024-05-08 12:09
解决,谢谢

不客气,很高兴能为您解决问题。如果还有其他问题,欢迎随时向我提问。祝您编程学习顺利!

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

isdkz 发表于 2024-5-8 12:12:41

laiyuanjie 发表于 2024-5-8 12:09
解决,谢谢

是真的不给人类一点机会{:10_266:}
页: [1]
查看完整版本: 我用yield这个关键字,遍历后超出了列表范围打印了错误,得怎么处理好一点