2010-11-05 25 views
2

Je commence avec Python et a décidé d'essayer ce petit projet de Python Wiki:Puis-je améliorer le code Python actuel?

Ecrire un mot de passe programme deviner de garder une trace de combien de fois l'utilisateur a entré le mot de passe erroné. Si c'est plus de 3 fois, imprimer Vous avez été refusé l'accès. et terminez le programme. Si le mot de passe est correct, imprimez Vous vous êtes connecté avec succès et terminez le programme.

Voici mon code. Cela fonctionne mais il ne se sent pas juste avec ces sauts de boucle et emboîtés si les déclarations.

# Password Guessing Program 
# Python 2.7 

count = 0 

while count < 3: 
    password = raw_input('Please enter a password: ') 
    if password != 'SecretPassword': 
     count = count + 1; 
     print 'You have entered invalid password %i times.' % (count) 
     if count == 3: 
      print 'Access Denied' 
      break 
    else: 
     print 'Access Granted' 
     break 
+0

« Non sens bien"? Wat? – delnan

Répondre

7

Vous pouvez remplacer votre boucle while avec la fonction suivante:

def login(): 
    for i in range(3): 
     password = raw_input('Please enter a password: ') 
     if password != 'SecretPassword': 
      print 'You have entered invalid password {0} times.'.format(i + 1) 
     else: 
      print 'Access Granted' 
      return True 
    print 'Access Denied' 
    return False 

Vous pouvez également envisager d'utiliser le module getpass.

+2

Vraiment minable: Cela devrait être '.format (i + 1)'. De plus, 'getpass' est le chemin à suivre pour le vrai code, mais pas vraiment nécessaire pour l'exercice d'un débutant. – delnan

+0

@delnan: +1 Merci, corrigé. –

+0

Lorsque je lance ce code, je n'ai rien. Comment "appeler" cette fonction? –

0

Vous pouvez mettre l'instruction if hors de la boucle while.

# Password Guessing Program 
# Python 2.7 

count = 0 
access = False 

while count < 3 and not access: 
    password = raw_input('Please enter a password: ') 
    if password != 'SecretPassword': 
     count += 1 
     print 'You have entered invalid password %i times.' % (count) 
    else: 
     access = True 

if access: 
    print 'Access Granted' 
else: 
    print 'Access Denied' 
+0

Je ne suis pas super expérimenté avec Python donc il y a peut-être quelques problèmes de syntaxe. – thattolleyguy

+0

Oui, en effet, il contient des erreurs sytnax. && n'est pas valide en Python et se plaint alors que le nom 'faux' n'est pas défini. –

+0

Il y a quelques changements qui devraient corriger la syntaxe (je pense). Je pense que la logique globale répond à la question en se débarrassant des pauses. – thattolleyguy

2
granted = False # default condition should be the least dangerous 
for count in range(3): 
    password = raw_input('Please enter a password: ') 
    if password == 'SecretPassword': # no need to test for wrong answer 
     granted = True 
     break 
    print 'You have entered invalid password %i times.' % (count+1) # else 

if granted: 
    print 'Access Granted' 
else: 
    print 'Access Denied' 
+0

Question rapide, quand vous faites cela "pour le compte de la gamme (3):" quelle est la valeur initiale de compter? –

+0

@Silence de 2012: c'est zéro, merci! –

3

Je ne suis pas contre le « impératif » sensation de boucle/si, mais je séparerais votre « logique métier » de votre « présentation »:

count = 0 

# Business logic 
# The correct password and the maximum number of tries is placed here 
DENIED, VALID, INVALID = range(3) 
def verifyPassword(userPassword): 
    global count 
    count += 1 

    if count > 3: 
     return DENIED 
    elif password == 'SecretPassword': 
     return VALID 

    return INVALID 

# Presentation 
# Here you do the IO with the user 
check = INVALID 
while (check == INVALID): 
    password = raw_input('Please enter a password: ') 
    check = verifyPassword(password) 

    if check == INVALID: 
     print 'You have entered invalid password %i times.' % (count) 
    elif check == VALID: 
     print 'Access Granted' 
    else # check == DENIED 
     print 'Access Denied' 
+0

Je pense que vous voulez déclarer 'count' être global. – aaronasterling

+0

oh oui, désolé à ce sujet. – rsenna