Python - if和else里面for循环,计数不起作用

时间:2015-09-02 13:55:42

标签: python vb.net loops

这是一个简单的登录程序 - 逻辑在VB.Net中工作,但我无法将其转换为Python。 Python代码不起作用,但是Stackoverflow上的两个用户(un_lucky和Jerry)提供的VB.Net代码确实如此。任何人都能指出我的python代码修复程序吗?它基本上产生了一系列拒绝访问"而不是只有一个,当密码不正确,如果用户名或密码是数组中的SECOND,那么它产生一个拒绝访问,然后是访问授权。

count=0
for counter in range(0,len(fields)):
    if textlogin.get()==fields[counter] and textpassword.get()==fields[counter+1]:
        count=count+1

        if count > 0:
            welcome=Label(myGui,text="Access Granted. Loading Profile ....")
            welcome.pack()
    else:
                denied=Label(myGui,text="Access Denied")
                denied.pack()

这里是VB.net代码(逻辑),除了上面的python程序从文本文件中读取外,它确实可以实现几乎相同的功能。

它现在完美无缺(几乎),但用户名和密码中的空白条目也会产生"访问授权" ...无法找出原因! 以下整个代码:

def verifylogin():

fin=open("moosebook.txt","r")
data=fin.readlines()
for line in data:
    fields=line.split()
    fields=[i.rstrip("','") for i in fields] #strips the named character from END of field
    fields=[i.replace("'",'') for i in fields]#when reading the list, you want to remoe the ',' so it isn't part of the username or password
    fields=[i.replace("(",'') for i in fields] #simiarly, remove the bracket and replace it
    fields=[i.replace(")",'') for i in fields] #simiarly, remove the bracket and replace it

    line=line.rstrip()
    print(fields)

flag=0
for counter in range(0,len(fields)):
    if textlogin.get()==fields[counter] and textpassword.get()==fields[counter+1]:
        flag=flag+1

if flag>0:
            welcome=Label(myGui,text="Access Granted. Loading Profile ....")
            welcome.pack()
else:
                denied=Label(myGui,text="Access Denied")
                denied.pack()

1 个答案:

答案 0 :(得分:2)

缩进在Python中很重要。您将if测试放入循环。您需要删除额外的缩进以将其放在循环外:

for counter in range(0,len(fields)):
    if textlogin.get()==fields[counter] and textpassword.get()==fields[counter+1]:
        count=count+1

if count > 0:
    welcome=Label(myGui,text="Access Granted. Loading Profile ....")
    welcome.pack()
else:
    denied=Label(myGui,text="Access Denied")
    denied.pack()

请注意,ifelse行现在与for行位于同一列。

因为在您的代码中,if语句缩进到更深层次(与if测试检查密码相同),您创建了多次标签,每次运行循环一次

缩进用于分隔代码块,与VB.NET代码使用NextEnd If明确分隔循环和条件测试的方式相同。

可以清理循环;只调用textlogin.get()textpassword.get()一次,并使用zip()配对字段值,并any()查看是否存在第一个匹配(这里就够了) :

login, pw = textlogin.get(), textpassword.get()
if any(pair == (login, pw) for pair in zip(fields, fields[1:])):
    welcome=Label(myGui,text="Access Granted. Loading Profile ....")
    welcome.pack()
else:
    denied=Label(myGui,text="Access Denied")
    denied.pack()

如果您打算以(而不是滑动窗口)遍历字段,请使用:

login, pw = textlogin.get(), textpassword.get()
fields_iter = iter(fields)
if any(pair == (login, pw) for pair in zip(fields_iter, fields_iter)):
    welcome=Label(myGui,text="Access Granted. Loading Profile ....")
    welcome.pack()
else:
    denied=Label(myGui,text="Access Denied")
    denied.pack()