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