我只是在学习 Python,我正在通过制作登录系统将我迄今为止所学的知识付诸实践。我想使用至少 6 个字符和一个字母的密码,这是我的第一个问题:如何设置该限制,以便当我输入超过 6 个字符时,会出现一条消息print
,指出最小值为 6?另一方面,在下面显示的代码中,我遇到了另一个问题,当输入 text 或 letterinput
时,出现错误:
Traceback (most recent call last): File "codigo.py", line 30, in <module> prueba2() File "codigo.py", line 6, in prueba2 Request_Password=int(input("Insertar contraseña")) ValueError: invalid literal for int() with base 10: 'PruebaContraseña'.
我的代码如下:
contraseñas=[123]
Archivos=["Documentos","Videos"]
def prueba2():
Access=False
Request_Password=int(input("Insertar contraseña"))
if Request_Password in contraseñas[:]:
Access=True
elif Access==True:
seleccion()
while Access==False:
prueba2()
break
def seleccion():
confirmacion=input("¿Que archivo desea ver?")
if confirmacion in Archivos[:]:
print("Acceso autorizado a",confirmacion)
else:
print("Esa categoria no existe")
prueba2()
这只是一个开始,但如果我不知道该怎么做我已经告诉过你的事情,我就无法继续。仅当我使用数字或字母但不能同时使用两者时,一切正常。
您遇到的问题是因为您试图 int 用户输入,这是因为开头的“int”:
并且由于您正在使用“TestPassword”进行测试,因此会引发错误:
您可以测试的只是输入,然后检查条件(长度大于 6 并且包含一个字母)。当然,这个答案可以更好地指导您:
1)为了让我的解释更简短,我将首先回答错误的问题:
如果您查看错误消息,它会提示您正在发生的事情
ValueError: invalid literal for int() with base 10: 'PruebaContraseña'
。发生此错误是因为您尝试将 python 无法识别为数字的整数转换为整数。例如,如果您输入密码值“123a”并应用函数
int
,python 将不知道如何将其转换为整数,因为不清楚它代表什么数字。因此,由于您的要求是使用接受字母数字值的密码,因此建议使用字符串(文本字符串)。然后,由于
Request_Password
默认变量接收一个文本字符串,所以没有必要使用int
,并且在密码变量中你可以有这样的东西:contraseñas=["123"]
这样它们是相同的数据类型并且能够进行比较。2)现在对于限制字符数的问题,只需使用函数
len
来查找文本字符串的长度和一个条件来询问它是否大于6,例如:尽管您已经回答了这两个具体问题,但我将对代码进行更多评论。该错误仅仅是因为您尝试按照您被告知的方式投射
int
输入的内容:input
当您输入包含非数字字符的字符串时。这种强制转换完全没有必要,
input
它返回一个“原始”字符串,并且您的密码必须相同。另一方面,密码列表必须包含字符串,而不是整数,因为您自己定义了您希望密码具有“至少一个字母”也就是说,有一些观察:
您不需要列表切片
[:]
来检查项目是否在列表中,这不是必需的,而且效率低下,因为它会创建 list 的卷影副本。不要将布尔值与
==
. 当您想检查一个对象的计算结果是 true (True
) 还是 false (False
) don't useif varible == True
时,这被认为是“设计反模式”,只需使用if variable:
orif not variable:
。负责捕获密码的功能有几个问题,首先
if
检查密码是否正确,如果正确,则输入密码Access
,True
如果elif
错误则不执行。该子句elif
不会if
在前一个被评估为真的同时被评估(这正是它与if
链式的区别)。因此,该函数seleccion
永远不会被调用。另一方面,循环
while
是没有意义的,因为你在第一次迭代时用 打破它break
,条件就足够了。在任何情况下,请考虑消除递归调用并将函数的所有逻辑包含在循环中,因为一般规则迭代比递归更具可读性和效率。要找出任何可迭代对象中的字符数或项目数,只需使用内置函数即可
len()
。要验证密码是否至少包含一个字母,您可以使用如果字符串仅包含应用于字符串的每个字符的字母字符时str.isalpha
返回的方法。True
您可以使用 a 遍历字符串,但如果至少有一项评估为真for
,则最好使用any
返回的字符串。True
由于几乎总是有上千种方法可以做同样的事情,其中一种可以是: