2017-09-18 8 views
0

J'ai écrit ce code très simple qui devrait répondre à des entrées utilisateur spécifiques. Je sais que je fais quelque chose de mal, mais je ne sais pas ce que c'est. Lorsque je tape un mot ou que je le laisse vide, j'obtiens la réponse «Aucun». Merci d'avance :) voici mon code:Pourquoi ce code renvoie une valeur None?

import random 
# Sentences we'll respond with if the user greeted us 

GREETING_KEYWORDS = ("hello", "hi", "greetings", "sup", "whats up", "You") 
GREETING_RESPONSES = ["sup buddy", "Hola", "Halo", "Hi back?"] 


def check_for_greeting(sentence): 
    """If any of the words in the user's input was a greeting, return a greeting response""" 
    if sentence is not None: 
     for word in sentence: 
      if word.lower() in GREETING_KEYWORDS: 
       return random.choice(GREETING_RESPONSES) 
      else: 
       pass 
    elif sentence is None: 
     return "You got to say something if you want me to do the same." 
    else: 
     return "Something is wrong..." 


def chat_input(): 
    x = input("") 
    print(check_for_greeting(x)) 

# Run 
print("chat with me...") 
chat_input() 
+0

Bien que cela ne soit pas vraiment lié à la question elle-même, je suggère de transformer la phrase en une liste de ''' .join (phrase)' et de vérifier l'existence du mot de bienvenue dans la phrase en utilisant 'len ([i pour i dans GREETING_KEYWORDS si je dans la phrase])> 0' –

+0

que se passe-t-il si je ne sais pas ce que l'utilisateur a entré, s'il a entré "bonjour" ou "au revoir". Devrais-je simplement créer une autre liste et la parcourir quand la liste "GREETING KEYWORDS" ne correspond pas? Merci mec, vos commentaires sont utiles. –

Répondre

3
for word in sentence: 
    if word.lower() in GREETING_KEYWORDS: 
     return random.choice(GREETING_RESPONSES) 
    else: 
     pass 

Et si aucun des mots est en GREETING_KEYWORDS? Qu'est-ce qui est retourné alors? Il n'y a aucune instruction explicite return pour quand cela arrive, donc la réponse est: None est retourné.

Vous pouvez corriger cela en retournant une réponse par défaut si la boucle for se termine sans trouver un message d'accueil.

for word in sentence: 
    if word.lower() in GREETING_KEYWORDS: 
     return random.choice(GREETING_RESPONSES) 
return "default response" 

Le problème suivant est que for word in sentence itère sur chaque lettre de la phrase, pas chaque mot . Pour itérer sur les mots, diviser la phrase en dehors:

for word in sentence.split(): 
    if word.lower() in GREETING_KEYWORDS: 
     return random.choice(GREETING_RESPONSES) 
return "default response" 

Ensuite, je vois que vous voulez détecter un message d'accueil de deux mots: whats up. Cela ne fonctionnera pas puisque la phrase est divisée en mots, ce qui signifie que vous ne pouvez vérifier que les salutations d'un mot. Je suggère d'inverser la logique: boucle sur toutes les salutations possibles et voir si elles sont dans la phrase. (Notez que maintenant vous ne veulent diviser la phrase en mots.)

for greeting in GREETING_KEYWORDS: 
    if greeting in sentence: 
     return random.choice(GREETING_RESPONSES) 
return "default response" 

Enfin, cela est un peu plus avancé, mais vous pouvez utiliser une expression de générateur, plus any() pour simplifier le contrôle jusqu'à un simple si/autre. J'aime ça parce que ça ressemble plus à de l'anglais ordinaire.

+0

'return next ((random.choice (GREETING_RESPONSES) pour le message d'accueil dans GREETING_KEYWORDS si le message d'accueil est dans la phrase), 'default')' –

+1

Seul inconvénient est sous-chaîne, comme ''hi'' est dans'' this'' –