一旦我回复了回复,该功能就不会继续。有没有办法可以返回一个值然后继续?

时间:2013-12-11 19:26:49

标签: python python-3.x

我正在创建一个可以与之交谈的机器人。我正在使用if函数检查是否使用了某些单词,因此有回复。我在函数内执行此操作并使用return打印回复。如果说两件事我希望它能够说出他们两个,那么问题就是我回复了一个回复函数没有继续。有没有办法可以返回一个值然后继续?这是我的主要焦点和整个代码之后。

    # Reply
    if thank == True:
        return "It's my pleasure\n"
    if greet == True:
        return "How are you?\n"

主要代码:

# Chat Bot
import random

print("Hi!\n")
greetings = ["hi","hey","hello","yo","wassup"]
thanks = ["cheers","thanks","thx"]

def reply(x):
    greet = False
    # Greetings
    for item in greetings:
        if item in x:
            greet = True

    # Thanks
    thank = False
    for item in thanks:
        if item in x:
            thank = True


    # Reply
    if thank == True:
        return "It's my pleasure\n"
    if greet == True:
        return "How are you?\n"

    else:
        randomAnswers = ["I like cheese.", "That's Cool.", "You are a robot.", "I am not a robot.", "I like music.", "I want to visit australia.","Do you like me?","You're cool."]
        num = random.randint(0, len(randomAnswers) - 1)

        return randomAnswers[num]



while 1:

    userMessage = input("Message: ").lower()
    print()
    print(reply(userMessage))

2 个答案:

答案 0 :(得分:4)

  

有没有办法可以返回一个值然后再继续?

是的!大多数语言不能这样做,但Python可以。只需yield而不是return。这会放弃一个值,但让你的功能继续运行。这是一个例子:

def return_some_values(zero, one, two):
    if zero:
        yield 0
    if one:
        yield 1
    if two:
        yield 2

因此,此函数在完成之前可以返回0到3之间的任何值。

但你怎么用呢?

当你调用一个yield s(一个“生成器函数”)的函数时,你得到的是一个生成器。像列表一样的生成器是可迭代的 - 也就是说,你可以循环它,或者将它复制到列表或集合等等。(与列表不同,它不是序列 - 你不能索引它,你可以只有它循环一次,然后它已经筋疲力尽等等。也不像列表,它是懒惰 - 这些值在你要求它们之前不存在。)所以:

values = return_some_values(False, True, True)
for i in value:
    print(i)

...将打印出1,然后打印出2

有关更长的介绍,请参阅Iterators上的教程部分和关于生成器的以下部分。 Generator Tricks for System Programmers也非常有用。

答案 1 :(得分:3)

不是立即返回,而是在列表中收集您的回复,然后在结尾返回该列表:

def reply(x):
    responses = []

    if any(item in x for item in thanks):
        responses.append("It's my pleasure\n")
    if any(item in x for item in greetings):
        responses.append("How are you?\n")

    if not responses:
        randomAnswers = ["I like cheese.", "That's Cool.", "You are a robot.", "I am not a robot.", "I like music.", "I want to visit australia.","Do you like me?","You're cool."]
        responses.append(random.choice(randomAnswers))

    return responses