我正在创建一个程序来检查密码是否足够强大:
正如你在下面看到的,这只是我的一些代码,我有一个菜单和一个密码检查器,唯一的问题是,当我输入密码时,检查器似乎没有工作,总是说它是一个强密码,即使它不包含任何大写字母或数字或符号。以下是我的代码。
import random #importing random
import time #importing time
global Menu
def Menu():
global optionchoice #globalising variable optionchoice so that it can be used inside of another def of the code
print("Hey, Welcome to PassWordChecker.")
time.sleep(2) #delaying the next line for 2 seconds
print("Please choose one of the options below." )
time.sleep(1)
print("MENU:")
print("***")
print(" press 1 once for : password checker ")
print(" press 2 twice for : password generator")
print(" press 3 two or three times to : Quit ")
print(" ***") #creating a basic menu
optionchoice = (input("which option would you like to choose?"))
def checkpasswordandinput():
global optionchoice
optionchoice = optionchoice
if optionchoice == '1':
print(" please enter a password. ")
UserPassword = input("")
if len(UserPassword) <= 8 or len(UserPassword) >= 24 or UserPassword == UserPassword.isupper() or UserPassword == UserPassword.isdigit() or UserPassword == UserPassword.islower() or UserPassword == UserPassword.isalpha():
print("make sure your password includes numbers and upper and lower case letters ")
UserPassword = input('please enter a new password')
else:
print('your password is a very good one that is difficult to crack')
return Menu()
对未来读者的说明:
请不要在上面的表格中写代码:
while True:
optionchoice = menu()
上述代码在这种形式下会更好:
import time
def menu():
print(" press 1 for password checker ")
print(" press 2 for password generator")
print(" press 3 to Quit")
return input("which option would you like to choose?")
def checkpasswordandinput():
while True:
optionchoice = menu()
if optionchoice == '1':
#Enter password and validate
pass
# detect other options
if optionchoice == '3':
break
checkpasswordandinput()
答案 0 :(得分:1)
UserPassword == UserPassword.isupper()
形式的检查不起作用。在这里,您将字符串(密码)与布尔值(isX()
的结果)进行比较。因此,所有这些检查都是False
,然后您到达else
分支(如果长度可以接受)。
对于大写和小写字符,您可以使用UserPassword == UserPassword.upper()
代替upper
,而不是isupper
,类似于lower()
),即比较密码它的上/下版本,但对于数字这不起作用。相反,您可以使用any
检查是否有任何字符是数字:any(c.isdigit() for c in UserPassword)
编辑:您可以使用UserPassword == UserPassword.upper()
检查密码是否不包含任何小写字母,这有点不直观。相反,我建议使用any
进行所有检查并反转条件,这样“正”情况在if
体内,而“负”在其他情况下。像这样:
up = UserPassword
if 8 <= len(up) <= 24 and any(c.isupper() for c in up) and any(c.islower() for c in up) and any(c.isdigit() for c in up) and any(c.isalpha() for c in up):
或者稍微短一点,使用一系列功能:
if 8 <= len(up) <= 24 and all(any(f(c) for c in up) for f in (str.islower, str.isupper, str.isdigit, str.isalpha)):
答案 1 :(得分:0)
所以你需要做以下的事情:
hasUpper = False
hasLower = False
hasDigit = False
等等
然后,请输入密码&#39;一次一个字符: 即。 string [1],string [2],string [3]
在它上面运行你的布尔结果(isupper,islower等) 如果为true,则将hasUpper,hasLower,hasDigit更改为True
然后,一旦完成整个字符串,请根据您的要求检查您的布尔结果。即:
如果要求是上限,下限和数字。
if hasUpper = True and hasLower = True and hasDigit = True:
那么它是一个很好的密码等等。
有意义吗?