为了教育目的,我一直在为密码管理员工作,并希望用户能够创建一个帐户,如果他们还没有。我认为最好的方法是为用户名和密码设置一个单独的列表。如果用户正在创建帐户,只需将用户名和密码附加到各自的列表中,它就不会附加任何内容。也许我的语法错了?我查了几个网站来检查我的语法,一切看起来都不错。我错过了什么?
这里是相关的代码块:
import numpy as np
def float_to_int(array):
int_array = array.astype(int, casting='unsafe', copy=True)
if not np.equal(array, int_array).all():
raise TypeError("Cannot safely convert float array to int dtype. "
"Array must only contain whole numbers.")
return int_array
答案 0 :(得分:0)
第36行有语法错误。 passwords.
当然不是有效的语法。你可能想写password.append(createPass)
,这也可以解释为什么一切都没有附加。
此外,我确定您已经意识到这一点,但在课堂或学术界的背景下这是非常不安全的事情。存储密码时,应始终在存储之前加盐并适当散列。
最后请注意,将用户名和密码存储在元组中然后将它们放入列表中可能会更清晰。这会将用户和密码绑定到单个对象,允许您对列表进行排序。正如你现在所做的那样,这比并行数组/列表更受欢迎,因为这个事实(它也更加pythonic)。
举例来说:
users = []
for i in range(num_new_users):
user = input("username:")
pass = input("pass:")
users.append((user,pass))
users.sort()
修改强>
为了进一步详细解释,元组是Python中的内置类型。它是通过在括号中包装一些项目而形成的。元组对于将几个对象彼此关联非常有用。在许多情况下,我们更喜欢它们列出,因为它们是不可变的。这意味着您无法在创建后更改其值或大小,但仍可使用熟悉的列表表示法访问它们。创建元组的一个简单示例如下:
>>> x = (1,2)
>>> print x
(1,2)
>>> print x[0]
1
>>> x[1] = "hello"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
这在您的示例中有用的原因是因为它从两个列表开始,您假设任何索引对应于同一个用户,直到您知道它们的一个列表。考虑这个例子:
>>> usernames = []
>>> passwords = []
>>> for i in range(5):
... usernames.append(input("Username:"))
... passwords.append(input("Pass:"))
此处,usernames[0]
和password[0]
与同一用户相关联。但是当我们改变其中一个列表而没有另一个列表时会发生什么?如果我们继续使用前面的代码并执行以下命令:
>>> passwords.sort()
突然之间无法保证usernames[0]
和password[0]
与同一用户相关联。现在使用元组而不是并行列表:
>>> users = []
>>> for i in range(5):
... username = input("Username:")
... password = input("Pass:")
... users.append((username,password))
我们已明确链接用户名和密码,因为它们存储在同一个对象中。现在我们执行:
>>> users.sort()
我们可以保证user[0]
返回的信息始终相互关联。在python解释器中尝试这两个示例。使用大量的打印语句,以便您可以看到正在发生的事情。希望你能看到这是一种更好的做事方式。
答案 1 :(得分:0)
首先,在“不工作”区域,你有:
passwords.
哪个是语法错误。我怀疑这只是一个错字。
我认为你真正的问题是你试图将'users'和'password'存储为main()中的局部变量,更新它们,然后递归调用main()。
由于'users'和'password'是局部变量,因此它们将在之前的main调用中更新。但是,新调用中的变量是完全独立的。
要解决这个问题,要么将它们设为全局变量,要么将它们传递给main。对于全球方法:
users = ['user']
passwords = ['default']
def main():
# use the 'users' and 'passwords' as usual
传入方式:
def main(users, passwords):
# use 'users' and 'passwords' as usual
main(['user'], ['password'])
当然,除非您知道自己在做什么,否则不要尝试实施真实的密码系统:)