Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 调用了错误的函数?_Python_Python 3.x - Fatal编程技术网

Python 调用了错误的函数?

Python 调用了错误的函数?,python,python-3.x,Python,Python 3.x,所以我用Python编写了一个简短的聊天机器人,但是有一个令人恼火的问题。程序最初只调用posResponses()函数 在上下文中,如果我用“悲伤”、“可怕”甚至“asdfasdfasdf”来回答它最初的问题,我仍然会得到积极的回答 如果我输入一个否定/不明确的关键字,应该调用negrossponses()/ambiguusresponses()函数。事实并非如此。我做错了什么?我该如何修复它?代码如下: import random import time def opening():

所以我用Python编写了一个简短的聊天机器人,但是有一个令人恼火的问题。程序最初只调用
posResponses()
函数

在上下文中,如果我用“悲伤”、“可怕”甚至“asdfasdfasdf”来回答它最初的问题,我仍然会得到积极的回答

如果我输入一个否定/不明确的关键字,应该调用
negrossponses()
/
ambiguusresponses()
函数。事实并非如此。我做错了什么?我该如何修复它?代码如下:

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()

Python是这样解析它的:

if(responseType==“good”)或“great”或“fantastic”或“delegate”或“fine”或“ok”或“ok”:posResponses()
elif(responseType==“bad”)或“可怕”或“悲伤”或“暴躁”或“愤怒”或“恼怒”或“疲倦”:Nergresponses()
其他:含糊不清的回答()
'great'
是一个真实的值,因此
if
语句总是成功的。您可能希望将其改写为:

如果responseType=='good'或responseType=='great'或responseType=='fantastic'或responseType=='delegate'或responseType=='fine'或responseType=='ok'或responseType=='ok':
posResponses()
elif responseType=='bad'或responseType=='可怕'或responseType=='sad'或responseType=='grumpy'或responseType=='生气'或responseType=='激怒'或responseType=='疲倦':
Nergesponses()
其他:
含糊不清的回答()
或者,优选地:

如果响应类型为{'good'、'great'、'fantastic'、'delegate'、'fine'、'ok'、'ok'}:
posResponses()
elif responseType在{'bad'、'Thrable'、'sad'、'grumpy'、'Angly'、'Escred'、'Wear'中:
Nergesponses()
您甚至可以将这些响应转换为常数:

#文件顶部附近:
好的回答={'GOOD'、'great'、'fantal'、'detable'、'fine'、'ok'、'ok'}
错误的回答={BAD','可怕'、'sad'、'grutpy'、'愤怒'、'untive'、'tould'}
#当您需要判断响应时:
如果responseType处于良好的\u响应中:
posResponses()
错误响应中的elif响应类型:
Nergesponses()
其他:
含糊不清的回答()

posResponses
只被调用一次,因为在posResponses中,您调用的是含糊不清的responses,而在含糊不清的responses中,您调用的是含糊不清的responses。所以它永远不会退出ambiguousResponses,它只会一直调用ambiguousResponses,直到堆栈用完,程序崩溃

您已尝试使此程序递归。不应该是这样的,应该有一个以input()调用为中心的循环,在整个程序中只需要一个循环,而不是15个循环或其他任何循环


但更明显的错误是,递归中不包括测试响应是否为正的测试,因此程序只检查输出的响应一次

对于所有的数字比较,使用
elif
s代替一系列
if
s将更清晰(更有效)。此外,您的列表中的缩进是错误的(但可能是因为张贴在这里):我认为这不是元组的正确用法。好的回答是一个项目列表,而不是一个异构结构。请参阅,您首选的方法非常有效。非常感谢你!我还将其应用于NergResponses函数,以便可以调用不明确的函数。@Mark:这是一个很好的观点。我把它改为使用列表而不是元组。我改变了我的评论,因为显然使用列表是一个更好的主意。这个决定是一致的。@throatofinter57:这纯粹是语义上的差异。将项放入元组通常意味着表示顺序很重要。例如,处理二维坐标:使用类似
(5,3)
的元组是有意义的。如果出于列表目的开始使用元组,可能会使代码的读者感到困惑,他们希望元组中的项的顺序具有某种意义,而实际上却没有意义。它可能不会对代码的运行进行任何更改(不会导致错误或类似的情况)。