Python 一旦我返回了一个回复,函数就不会继续了。有没有办法返回一个值然后继续?

Python 一旦我返回了一个回复,函数就不会继续了。有没有办法返回一个值然后继续?,python,python-3.x,Python,Python 3.x,我正在创建一个可以与您交谈的机器人。我使用if函数来检查是否使用了某些单词,因此有一个回复。我在函数内部执行此操作,并使用return打印回复。如果说了两件事,我希望它能够同时说这两件事,问题是一旦我返回了回复,函数就不能继续了。有没有办法返回一个值然后继续?这里是我的主要关注点,在我的整个代码之后 # Reply if thank == True: return "It's my pleasure\n" if greet == True:

我正在创建一个可以与您交谈的机器人。我使用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))

不要立即返回,而是在列表中收集您的响应,然后在末尾返回该列表:

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

不要立即返回,而是在列表中收集您的响应,然后在末尾返回该列表:

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
有没有办法返回一个值然后继续

对!!大多数语言不能做到这一点,但Python可以做到。只是屈服,而不是回报。这会放弃一个值,但会让函数继续运行。下面是一个例子:

def return_some_values(zero, one, two):
    if zero:
        yield 0
    if one:
        yield 1
    if two:
        yield 2
因此,该函数可以在完成之前返回0到3个值

但是你如何使用它呢

当你调用一个生成生成器函数的函数时,你得到的是一个生成器。生成器,就像列表一样,是可重用的,也就是说,你可以循环它,或者将它复制到一个列表或集合中,等等。与列表不同,它不是一个序列,你不能索引它,你只能循环它一次,然后它就耗尽了,等等。同样与列表不同,它是惰性的,值在你请求它们之前是不存在的。因此:

values = return_some_values(False, True, True)
for i in value:
    print(i)
…将打印出1,然后打印出2

有关详细介绍,请参见上的教程部分和下一节中关于生成器的部分。而且也很有帮助

有没有办法返回一个值然后继续

对!!大多数语言不能做到这一点,但Python可以做到。只是屈服,而不是回报。这会放弃一个值,但会让函数继续运行。下面是一个例子:

def return_some_values(zero, one, two):
    if zero:
        yield 0
    if one:
        yield 1
    if two:
        yield 2
因此,该函数可以在完成之前返回0到3个值

但是你如何使用它呢

当你调用一个生成生成器函数的函数时,你得到的是一个生成器。生成器,就像列表一样,是可重用的,也就是说,你可以循环它,或者将它复制到一个列表或集合中,等等。与列表不同,它不是一个序列,你不能索引它,你只能循环它一次,然后它就耗尽了,等等。同样与列表不同,它是惰性的,值在你请求它们之前是不存在的。因此:

values = return_some_values(False, True, True)
for i in value:
    print(i)
…将打印出1,然后打印出2


有关详细介绍,请参见上的教程部分和下一节中关于生成器的部分。也很有帮助。

你还应该考虑把重复逻辑包起来,以便于沿途进行测试。所有这些“对于列表中的x:如果输入中的x”行可以移动到一个函数,例如is_input_in。我也会这样做,肖恩,谢谢。同时,Martjin也感谢你对随机性的修正。我以前从未碰到过这样的选择。你还应该考虑把重复逻辑包起来,以便于沿途进行测试。所有这些“对于列表中的x:如果输入中的x”行可以移动到一个函数,例如is_input_in。我也会这样做,肖恩,谢谢。另外,Martjin感谢对random.choice的更正,这让我感到惊讶,我以前从未遇到过。