python-3.x - 为什么我的代码在具有所有必需前提时不打印密码?
问题描述
`f=0
import random
chars_lower= "abcdefghijklmnopqrstuvwxyz"
chars_upper= "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
numbers= "0123456789"
symbols= "¡!¿?<>$#@%&€*+-"
password_length= 8
chars= "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789¡!¿?<>$#@%&€*+-"
while f==0:
password_random= "".join(random.sample(chars, password_length))
e= 0
for i in chars_lower:
for j in chars_upper:
for n in numbers:
for k in symbols:
if i in password_random and j in password_random and k in password_random and n in password_random:
e=1
f=1
if e==1:
print(password_random)`
创建自动密码,以防用户在 3 次尝试后未正确写入密码
t=0
list_lower=[]
list_upper=[]
list_numbers=[]
list_symbols=[]
for i in chars_lower:
list_lower.append(i)
for j in chars_upper:
list_upper.append(j)
for n in numbers:
list_numbers.append(n)
for k in symbols:
list_symbols.append(k)
for i in range(3):
name= input("Write a name that contains 8 characters and hit ENTER: ")
password= input("Write a password that contains 8 characters and hit ENTER: ")
if len(name)==8 and len(password)==8:
for i in password:
if i in list_lower:
for j in password:
if j in list_upper:
for n in password:
if n in list_numbers:
for k in password:
if k in list_symbols:
t=1
else:
t=2
else:
t=2
else:
t=2
else:
t=2
else:
t=2
if t==1:
break
if t==1:
print("Your user name is",name,"and your password is",password)
elif t==2:
print("You have already used all your chances to write your password, so your automatic password is:",password_random)
此代码要求用户输入一个包含 8 个字符的用户名和一个包含 8 个字符且至少一个大写、一个小写、一个数字和一个符号的密码。假设满足所有这些前提时,它应该打印用户名和密码。然而,事实并非如此。
解决方案
正如评论的那样,即使if
满足 - 条件,您也不会打破“密码检查”内的任何循环。所以每个循环都会遍历密码中的所有字符。试着print
在你的代码中加入一些语句,看看发生了什么。一般来说,嵌套如此多的循环和条件变得几乎不可能阅读。因此,我建议看看 Python 的any和all。
使用这些,您可以重构您的密码检查,例如
def check_pw(pw):
chars = "abcdefghijklmnopqrstuvwxyz"
numbers = "0123456789"
symbols = "¡!¿?<>$#@%&€*+-"
contains_lower = any(l in pw for l in chars)
contains_upper = any(l in pw for l in chars.upper())
contains_nbr = any(l in pw for l in numbers)
contains_sym = any(l in pw for l in symbols)
return all((contains_lower, contains_upper, contains_nbr, contains_sym))
测试:
pws = ['asdfS7!l', 'asdf', 'TESTASEDFASDF']
for passphrase in pws:
if len(passphrase) >= 8 and check_pw(passphrase):
print(f"pw '{passphrase}' is ok.")
else:
print(f"pw '{passphrase}' is not ok.")
印刷
pw 'asdfS7!l' is ok.
pw 'asdf' is not ok.
pw 'TESTASEDFASDF' is not ok.
推荐阅读
- java - 为什么 SpringBoot 需要数据源?
- selenium - 使用 Selenium 在 JavaScript 变量发生变化时获取它们
- c++ - 在 Visual Studio 2010 中,如何从父项目继承预处理器定义?
- python - ValueError:无穷大或对于 dtype('float32') 来说太大的值
- flutter - Flutter:所有 ListTile 项目都响应相同的点击
- spring - Spring集成不转换ByteMessage
- php - 如何将 Open Graph 图像设置为 PHP 生成的图像?
- r - 将所有可能组合的矩阵转换为另一种格式
- javascript - 根据条件从数组中删除项目
- rest - 同一微服务中多个资源的 RESTful URL