鱼C论坛

 找回密码
 立即注册
查看: 318|回复: 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 编辑
from itertools import cycle
def get_comment_message(comment_message):
    for i in range(0,len(comment_message)):
        aa = comment_message[i]
        yield aa
    else:
        yield from cycle((["别按了","已经到了底了"],))

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

print(next(test))
print(next(test))
print(next(test))
print(next(test))
print(next(test))
print(next(test))
print(next(test))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[i]
        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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[i]
        yield aa
    else:
        yield from cycle((["别按了","已经到了底了"],))

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

print(next(test))
print(next(test))
print(next(test))
print(next(test))
print(next(test))
print(next(test))
print(next(test))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-3 12:53:22 | 显示全部楼层
try...except StopIteration:
简单易用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 00:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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