Basic question from pure beginner

Charles Yeomans charles at declareSub.com
Wed Jul 1 18:26:41 CEST 2009


Let me offer a bit of editing.

First, using the condition count != 3 is perhaps risky.  A mistake or  
a change in logic in the loop body might result in an infinite loop.   
So instead I suggest

while count < 3...

Second, I'd suggest storing the value 3 in a variable with a name that  
describes it.

MaxAttempts = 3
while count < MaxAttempts

This suggests that you change the name 'count' to 'attemptcount'.

The variable 'guess' is used only inside the loop, so I suggest  
removing the assignment outside the loop.

Finally, I'd remove correct_password_given from the loop test, and  
replace it with a break statement when the correct password is entered.

password = "qwerty"
correct_password_given = False
attemptcount = 0
MaxAttempts = 3
while attemptcount < MaxAttempts:
   guess = raw_input("Enter your password: ")
   guess = str(guess)
   if guess != password:
       print "Access Denied"
       attemptcount = attemptcount + 1
   else:
       print "Password Confirmed"
       correct_password_given = True
       break


Charles Yeomans

On Jul 1, 2009, at 3:58 AM, sato.photo at gmail.com wrote:

> Thank you for all of the help.  With your assistance and help from the
> Python Tutor mailing list I was able to come up with the following
> code:
>
> password = "qwerty"
> correct_password_given = False
> guess = "0"
> count = 0
> while count != 3 and not correct_password_given :
>   guess = raw_input("Enter your password: ")
>   guess = str(guess)
>   if guess != password:
>       print "Access Denied"
>       count = count + 1
>   else:
>       print "Password Confirmed"
>       correct_password_given = True
>
>
> If I understand it correctly, the function will continue to loop until
> either the count == 3 or until correct_password_give = True,
> satisfying the two conditions of the assignment, which were to lock a
> user out after three failed password attempts and to print "Access
> Granted" and end the module if the correct password is given.  Am I
> understanding this correctly?
>
> Thanks!
>
> On Jul 1, 12:06 am, alex23 <wuwe... at gmail.com> wrote:
>> On Jul 1, 3:38 pm, "sato.ph... at gmail.com" <sato.ph... at gmail.com>
>> wrote:
>>
>>> I have been able to make the module quit after entering a password
>>> three times, but can't get it to quit right away after the correct  
>>> one
>>> is entered.
>>
>> Not with the code you pasted, you haven't. There's a missing colon on
>> line 7 & line 9 isn't indented properly. It's always best if we're
>> referring to the same source when trying to help with a problem.
>>
>> The problem you're having, though, has to do with the while loop and
>> the fact that it's only checking one condition: has the 'count'
>> counter been incremented to 3. What you need to do is _also_ check  
>> for
>> the success condition:
>>
>> is_confirmed = False
>> while count != 3 or is_confirmed:
>>   guess = raw_input("Enter your password: ")
>>   guess = str(guess)
>>   if guess != password:
>>     print "Access Denied"
>>     count = count + 1
>>   else:
>>     print "Password Confirmed"
>>     is_confirmed = True
>>
>> This also provides you with a nice boolean that shows whether or not
>> the password was confirmed, which may be useful for latter code.
>>
>> However, whenever you want to loop a set number of times, it's  
>> usually
>> better to use a 'for' loop instead:
>>
>> PASSWORD = 'qwerty'
>> MAXRETRY = 3
>> for attempt in xrange(MAXRETRY):
>>   guess = str(raw_input('Enter your password: '))
>>   is_complete = guess == PASSWORD
>>   if is_complete:
>>     print 'Password confirmed'
>>     break # this exits the for loop
>>   else:
>>     print 'Access denied: attempt %s of %s' % (attempt+1, MAXRETRY)
>>
>> This saves you from the burden of creating, incrementing & testing
>> your own counter.
>>
>> If there's anything here that isn't clear, please don't hesitate to
>> ask.
>
> -- 
>




More information about the Python-list mailing list