鱼C论坛

 找回密码
 立即注册
查看: 931|回复: 3

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

[复制链接]
发表于 2024-5-8 11:58:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
    def get_comment_message(self):
        for i in range(0,len(self.comment_message)):
            self.aa = self.comment_message[i]
            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,它直接打印这句["别按了","已经到了底了"],,继续按就继续执行这句["别按了","已经到了底了"]
最佳答案
2024-5-8 12:08:24
本帖最后由 isdkz 于 2024-5-8 12:25 编辑
  1. from itertools import cycle
  2. def get_comment_message(comment_message):
  3.     for i in range(0,len(comment_message)):
  4.         aa = comment_message[i]
  5.         yield aa
  6.     else:
  7.         yield from cycle((["别按了","已经到了底了"],))

  8. test = get_comment_message([1, 3, 5])

  9. print(next(test))
  10. print(next(test))
  11. print(next(test))
  12. print(next(test))
  13. print(next(test))
  14. print(next(test))
  15. print(next(test))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-5-8 11:58:56 | 显示全部楼层
你可以在捕获到StopIteration异常后,使用一个标志位来控制是否继续执行。以下是一个示例代码:

  1. class Example:
  2.     def __init__(self, comment_message):
  3.         self.comment_message = comment_message
  4.         self.flag = True

  5.     def get_comment_message(self):
  6.         for i in range(len(self.comment_message)):
  7.             yield self.comment_message[i]
  8.         else:
  9.             self.flag = False

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

  13. while True:
  14.     try:
  15.         message = next(gen)
  16.         print(message)
  17.     except StopIteration:
  18.         if example.flag:
  19.             print("别按了,已经到底了")
  20.         break
复制代码


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-8 12:08:24 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2024-5-8 12:25 编辑
  1. from itertools import cycle
  2. def get_comment_message(comment_message):
  3.     for i in range(0,len(comment_message)):
  4.         aa = comment_message[i]
  5.         yield aa
  6.     else:
  7.         yield from cycle((["别按了","已经到了底了"],))

  8. test = get_comment_message([1, 3, 5])

  9. print(next(test))
  10. print(next(test))
  11. print(next(test))
  12. print(next(test))
  13. print(next(test))
  14. print(next(test))
  15. print(next(test))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-3 12:53:22 | 显示全部楼层
try...except StopIteration:
简单易用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-22 09:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表