Python 如何使用多个东西签入else语句?

Python 如何使用多个东西签入else语句?,python,Python,我正在尝试创建一个机器学习程序。到目前为止,我已经在一个文本文件中存储了每一个“习得”含义,并将其保存在一个列表中,该列表列出了所有属于该含义的内容。文本文件由python文件读取,python文件生成类对象,这些类对象将文本文件中的数据属性化为类对象。然后,在主python文件中,主提示符是我遇到问题的地方 else: try: for obj in gc.get_objects(): try: if isinst

我正在尝试创建一个机器学习程序。到目前为止,我已经在一个文本文件中存储了每一个“习得”含义,并将其保存在一个列表中,该列表列出了所有属于该含义的内容。文本文件由python文件读取,python文件生成类对象,这些类对象将文本文件中的数据属性化为类对象。然后,在主python文件中,主提示符是我遇到问题的地方

else:
    try:
        for obj in gc.get_objects():
            try:
                if isinstance(obj, LearnedClasses.learned):
                    if str(user.lower()) in obj.keys:
                        exec(obj.exstring)
                        chat()
                        break
            except:
                raise Exception

    except Exception:
        user = user.split()
        for x in user:
            learnlist.append(x)
            learnch = random.choice(learnlist)
            learnp = input("What does '{}' mean?".format(learnch))
            learn(learnch, learnp)

chat()

这段代码遵循我所做的基本“内置”响应。这是在内置部分找不到任何关键字后发生的情况。我使用GC收集从文本文件生成的所有类对象。然后,如果提示将任何关键字与其“已学习”关键字匹配,我希望它使用为该类设置的响应进行响应。然而,我不能让它继续讨论if ALL-ELSE失败的部分,它从Exception开始。我如何安排它,使它能够实现我所描述的?谢谢。

遵循此代码有点困难;以下是一些改进建议:

  • raiseexception
    有一个输入错误:它应该是
    raiseexception()

  • 有一个
    块没有多大意义,除了它只会引发一个异常而没有额外的信息;省略它

  • 事实上,垃圾收集器不是存储您以后需要的信息的好地方;您能否更改代码,使学习的类存储在变量的列表中,并以某种方式返回或传递

    一般来说,除非内存不足,否则永远不要触摸垃圾收集器,然后才知道如何帮助它丢弃东西

  • 正如其他人在评论中所建议的,不要使用try/except,而是使用类似于flag变量的东西来跟踪您是否已经回答,或者使用for/break/else结构:

    对于学习类列表中的lc:
    如果lc.keys中的str(user.lower()):
    exec(lc.exstring)
    聊天室()
    打破
    其他:
    user=user.split()
    对于用户中的x:
    learnlist.append(x)
    learnch=random.choice(learnlist)
    learnp=input(““{}”是什么意思?”.format(learnch))
    学习(learnch,learnp)
    

将其放入函数中。把你所有的单词都用for循环。如果你得到了一个匹配,那么做你需要做的,然后返回。for循环完成后,就知道没有匹配项了。因此,如果所有其他操作都失败了,您可以在那里执行代码,因为您知道,您无法使用匹配项到达那里,因为任何匹配项都会生成一个返回。基本上,将这段代码放入它自己的函数中,并将中断改为返回。异常应该保留用于错误处理,而不是用于
else
语句。您可以尝试存储是否在变量中找到匹配项。如果您不嵌套
try
块,效果会更好。您也不应该使用
try
-
作为
如果else
。只有当
try
块中存在异常时,才会运行
except
块。您可以触发异常。您能否检查是否调用了
引发异常
?在相同的except块中添加一个print语句。我能够保留我对gc的使用,但您的回答让我意识到,事实上,我可以将for循环本身作为条件使用,因为如果任何迭代都不适合,它将返回false。非常感谢。为什么必须在您指出的情况下才能使用GC?顾名思义,垃圾收集器是为垃圾而设计的。。。它对程序其余部分的不明显变化也很敏感;一些垃圾会被立即收集,因此您永远不会在
gc.get_objects()
中看到它;有些是定期收集的,因此您可能会看到它,也可能看不到它,这取决于它是否已被收集。您可能会将一段代码移动到函数中,并发现现在收集对象的时间太短;或者你可能会发现你得到了你从未打算包含的对象。在一个变量中有一个列表可以确保你得到你想要的。