2014-09-11 8 views
1

Ceci est une question vraiment basique, et je m'excuse pour sa simplicité, mais j'ai été la recherche de la réponse et essayer une syntaxe différente pendant des heures sans chance. J'utilise python pour créer un menu texte pour un programme chiffré. J'utilise une boucle while pour un message d'erreur quand une touche invalide est pressée, mais elle boucle même si la condition est fausse.While condition de boucle

purpose = input("Type 'C' for coding and 'D' for decoding: ") 

while purpose.upper() != "D" or "C": 
    purpose = input("Error, please type a 'C' or a 'D': ") 

if (purpose.upper() == "C"): 
    do_something() 

if (purpose.upper() == "D"): 
    do_something() 

Pour une raison quelconque le message d'erreur est affiché quel que soit appuyer sur la touche. Merci beaucoup pour votre aide!

Répondre

1

Change:

while purpose.upper() != "D" or "C": 

à:

while purpose.upper() != "D" and purpose.upper() != "C": 

Comme Saish suggéré dans les commentaires ci-dessous, d'une manière plus pythonique de le faire serait:

while purpose.upper() not in ("C", "D"): 
+0

Votre aide est grandement appréciée! Merci – bdawg425

+1

La façon pythonique de faire ceci est vraiment: 'while but.upper() pas dans (" C "," D "):' – Saish

+0

@Saish +1 très vrai! (réponse mise à jour) – alfasin

3

Vous devez Pensez aux conditions de chaque côté de or et and comme logiquement indépendantes.

Lorsque l'ordinateur voit:

while purpose.upper() != "D" or "C": 

Il se lit comme

(purpose.upper() != "D") 

OU

"C" 

La deuxième partie, seul "C", est toujours vrai.


Vous avez probablement voulu:

while purpose.upper() != "D" or purpose.upper() != "C": 

ou mieux encore:

while purpose.upper() not in ("C", "D"): 
+0

La dernière option retournera 'True' quand l'utilisateur entre' CD' :) – alfasin

+0

@alfasin - Bon point, j'ai supposé que c'était un char. Je vais le réparer: P – sapi

+0

Merci beaucoup pour l'aide! – bdawg425

0

Ici, essayez celui-ci. il semble fonctionner

reason = ['D', 'C'] 
while True: 
    purpose = input("Type 'C' for coding and 'D' for decoding: ").upper() 
    if reason.__contains__(purpose): 
     print("You've got it this time") 
     break 

Laissez-moi savoir comment ça marche

0
while purpose.upper() != "D" or "C": 

La ligne ci-dessus sera évaluée à:

while (purpose.upper() != "D") or "C": 

Les expressions sont évaluées de gauche à droite. Ici, "C" est toujours vrai, donc la boucle est toujours exécutée.

Vous devez avoir quelque chose comme ceci:

while purpose.upper() != "D" or purpose.upper() != "C": 

ou

#You can put it all into a list ["C", "D"] and then check 
while purpose.upper() not in ["C", "D"]: 

ou

#You can put it all into a tuple ("C", "D") and then check 
while purpose.upper() not in ("C", "D"): 
Questions connexes