2013-12-11 22 views
1

我正在創建一個可以與之交談的機器人。我正在使用函數來檢查是否使用某些單詞,因此有答覆。我在一個函數內部執行此操作,並使用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)) 

回答

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 
+0

感謝這應該工作,我應該想到那個我自己! – Ashley

+0

您還應該考慮包裝重複性邏輯以啓用測試。所有這些'用於列表中的x:如果輸入'行中的x可以被移動到諸如'is_input_in'的函數。 –

+0

我也會這樣做肖恩感謝。另外Martjin感謝更正random.choice驚訝我以前從未遇到過。 – Ashley

4

有一種方式,我可以返回一個值,然後繼續?

是的!大多數語言不能這樣做,但Python可以。只需要yield而不是return ing。這放棄了一個值,但讓你的功能繼續運行。這裏有一個例子:

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

所以,這個函數可以返回0到3之間的任何值,然後它就完成了。

但你如何使用它?

當您調用yield s(「生成器函數」)函數時,您返回的是一個生成器。生成器就像列表一樣是可迭代的 - 也就是說,你可以遍歷它,或者將它複製到一個列表或一個集合等中(與列表不同,它不是一個序列 - 你不能索引它,你可以只遍歷一次,那麼它的枯竭等也不像一個列表,它不存在 -the值,直到你問他們的)所以:

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

...會打印出1,然後打印出2

請參閱教程部分Iterators和以下關於發電機的章節以瞭解更長的介紹。而且Generator Tricks for System Programmers也很有幫助。