str.isdigit() не работает в python
Я работаю над проверкой пароля, которая проверяет, является ли строка действительным паролем. Я должен проверить, если есть по крайней мере восемь символов, должны состоять только из букв и цифр, а последние два символа должны быть цифрами.
Кажется, что все работает, кроме password.isdigit()
, иногда пароль выходит действительным, а иногда нет. Какие-либо предложения?
# Gets the users password
password = input('Enter a string for password: ')
# Splices the last two characters of the password
lastTwo = password[-2:]
# Checks the password if it is less than 8 characters
while len(password) < 8:
print('The password you entered is too short.')
print()
password = input('Enter a string for password: ')
# Checks the password if it is composed of letters and numbers
while password.isalnum() == False:
print('Your password has special characters not allowed.')
print()
password = input('Enter a string for password: ')
# Checks the spice to verify they are digits
while lastTwo.isdigit() == False:
print('Your last two characters of your password must be digits.')
print()
password = input('Enter a string for password: ')
print('Your password is valid.')
2 ответа
Есть несколько проблем с предоставленным кодом. В частности, вы проверяете только следующие правила while len(password) < 8
, Если вы дадите ему пароль длиной 10, правила никогда не проверяются. Кроме того, вы не обновляете lastTwo
при каждой попытке нового пароля
Один из способов исправить это - заменить несколько while
заявления с if...elif..elif...else...
завернутый в общий while
утверждение, следующее:
# Gets the users password
password = input('Enter a string for password: ')
while True:
# Checks the password if it is less than 8 characters
if len(password) < 8:
print('The password you entered is too short.')
# Checks the password if it is composed of letters and numbers
elif not password.isalnum():
print('Your password has special characters not allowed.')
# Checks the spice to verify they are digits
elif not password[:-2].isdigit():
print('Your last two characters of your password must be digits.')
else:
# we only get here when all rules are True
break
print()
password = input('Enter a string for password: ')
print('Your password is valid.')
Это должно работать так, как вы хотели. Но в то время как мы находимся в этом, почему бы не сказать пользователю каждое правило, его пароль сломался? С точки зрения пользовательского интерфейса, это помогает держать пользователя в курсе.
Если мы храним информационное сообщение вместе с тем, было ли соблюдено соответствующее правило, мы можем быстро обработать все нарушенные правила, например:
valid_password = False
while not valid_password:
# Get a password
password = input('\nEnter a string for password: ')
# applies all checks
checks = {
'- end in two digits': password[-2].isdigit(),
'- not contain any special characters': password.isalnum(),
'- be over 8 characters long': len(password) > 8
}
# if all values in the dictionary are true, the password is valid.
if all(checks.values()):
valid_password = True
# otherwise, return the rules violated
else:
print('This password is not valid. Passwords must:\n{}'.format(
'\n'.join([k for k, v in checks.items() if not v])))
print('Your password is valid.')
Вы никогда не обновляете свою ценность lastTwo
внутри вашего цикла Таким образом, представьте, если пользователь впервые ввел пароль abc123
, затем lastTwo
будет рассчитываться как 23
,
Теперь ваш код обнаружит, что пароль слишком короткий и запросит у пользователя новый пароль. Предположим, он входит abcdefgh
, Это теперь проходит ваши первые и вторые проверки. Обратите внимание, что lastTwo
все еще 23
и, таким образом, ваша третья проверка будет неверно пройдена.
Таким образом, вы должны пересчитать значение lastTwo всякий раз, когда вы принимаете новый пароль или проверяете прямо так:
while (password[-2:]).isdigit() == False: