2

そこで、Pythonで短くてシンプルなチャットボットを作成しましたが、苛立たしい問題があります。プログラムはposResponses() 最初に関数を呼び出すだけです。

コンテキストでは、最初の質問に「悲しい」、「ひどい」、さらには「asdfasdfasdf」で答えた場合でも、肯定的な応答が得られます。

ネガティブ/あいまいなキーワードを入力すると、negResponses()/ambiguousResponses()関数が呼び出されます。そうではありません。私は何を間違えましたか、そしてどのようにそれを修正しますか?コードは次のとおりです。

import random
import time

def opening():
    print('Hello!')

def responseType():
    responseType = str(input('How are you ?'))
    if responseType == 'good' or 'great' or 'fantastic' or 'decent' or 'fine' or 'ok' or 'okay': posResponses()
    elif responseType == 'bad' or 'terrible' or 'sad' or 'grumpy' or 'angry' or 'irritated' or 'tired': negResponses()
    else: ambiguousResponses()

def posResponses():
    number = random.randint(1, 4)
    if number == 1:
        print('That\'s great! So what\'s up?')
        input()
        ambiguousResponses()
    if number == 2:
        print('Really? I\'d like to hear more.')
        input()
        ambiguousResponses()        
    if number == 3:
        print('I\'m glad to hear that. What\'s going on?')
        input()
        ambiguousResponses()        
    if number == 4:
        print('Ah, me too. You should begin a topic discussion.')
        input()
        ambiguousResponses()        

def negResponses():
    number2 = random.randint(5, 8)
    if number2 == 5:
        print('That\'s really too bad. Care to elaborate?')
        input()
        ambiguousResponses()
    if number2 == 6:
        print('Awww. Why?')
        input()
        ambiguousResponses()
    if number2 == 7:
        print('That sucks! How come?')
        input()
        ambiguousResponses()
    if number2 == 8:
        print('What a shame! You should explain why.')
        input()
        ambiguousResponses()

def ambiguousResponses():
    number = random.randint(1, 4)
    if number == 1:
        print('Interesting. Carry on.')
        input()
        ambiguousResponses()
    if number == 2:
        print('Wow, elaborate!')
        input()
        ambiguousResponses()
    if number == 3:
        print('What an astute remark! Continue.')
        input()
        ambiguousResponses()
    if number == 4:
        print('How interesting. Please do explain further.')
        input()
        ambiguousResponses()


if __name__ == "__main__":
    opening()
    responseType()
4

2 に答える 2

6

Pythonは次のように解析しています。

if (responseType == 'good') or 'great' or 'fantastic' or 'decent' or 'fine' or 'ok' or 'okay': posResponses()
elif (responseType == 'bad') or 'terrible' or 'sad' or 'grumpy' or 'angry' or 'irritated' or 'tired': negResponses()
else: ambiguousResponses()

'great'は真の値であるため、ifステートメントは常に成功します。あなたはおそらくそれを次のように書き直したいと思うでしょう:

if responseType == 'good' or responseType == 'great' or responseType == 'fantastic' or responseType == 'decent' or responseType == 'fine' or responseType == 'ok' or responseType == 'okay':
    posResponses()
elif responseType == 'bad' or responseType == 'terrible' or responseType == 'sad' or responseType == 'grumpy' or responseType == 'angry' or responseType == 'irritated' or responseType == 'tired':
    negResponses()
else:
    ambiguousResponses()

または、できれば:

if responseType in {'good', 'great', 'fantastic', 'decent', 'fine', 'ok', 'okay'}:
    posResponses()
elif responseType in {'bad', 'terrible', 'sad', 'grumpy', 'angry', 'irritated', 'tired'}:
    negResponses()

これらの応答を定数に移動することもできます。

# near the top of the file:
GOOD_RESPONSES = {'good', 'great', 'fantastic', 'decent', 'fine', 'ok', 'okay'}
BAD_RESPONSES = {'bad', 'terrible', 'sad', 'grumpy', 'angry', 'irritated', 'tired'}

# when you need to judge a response:
if responseType in GOOD_RESPONSES:
    posResponses()
elif responseType in BAD_RESPONSES:
    negResponses()
else:
    ambiguousResponses()
于 2012-08-13T01:32:14.640 に答える
0

posResponsesposResponses では ambiguousResponses を呼び出し、ambiguousResponses では ambiguousResponses を呼び出すため、1 回だけ呼び出されます。したがって、ambiguousResponses を終了することはありません。スタックが不足してプログラムがクラッシュするまで、ambiguousResponses を呼び出し続けます。

このプログラムを再帰的にしようとしました。そうあるべきではありません。input() 呼び出しを中心としたループが必要です。プログラム全体で必要なのは、15 などではなく、1 つだけです。

しかし、それよりも露骨に間違っているのは、応答が正か負かを確認するための応答のテストが再帰に含まれていないため、プログラムはどの応答を出力するかを一度だけチェックすることです。

于 2012-08-13T03:17:19.880 に答える