2017-08-28 81 views
0

我已经创建了一个生成安全的密码短语python程序,我将它使用户可以决定是否要打印其密码的文本文件的raw_input功能。我也做了这样的事情,如果用户决定输入程序无法识别的输入,程序就会重复。尽管如此,我一直在困扰这个问题。下面是代码,下面是我对问题的解释。打印语句在Python,而不是重复两次一次

if writeyn == 'Y' or writeyn == 'y' or writeyn == 'yes' or writeyn == 'Yes': 
    print('Written to passwords.txt') 
    f = open("passwords.txt", "a+") # "append" 
    f.write(passtype + " - " + mypw) 

if writeyn == 'n' or writeyn == 'N' or writeyn == 'no' or writeyn == 'No': 
    print('Writting Stopped.') 

while writeyn != 'n' or writeyn != 'N' or writeyn != 'no' or writeyn != 'No' or writeyn != 'Y' or writeyn != 'y' or writeyn != 'yes' or writeyn != 'Yes': 
    writeyn = raw_input("Invalid Input; " + "\nWould you like to write your password to a text file? Y or n") 
    writeyn = writeyn.strip() 
    if writeyn == 'n' or writeyn == 'N' or writeyn == 'no' or writeyn == 'No': 
     print 'Writing Stopped.' 
     break 
    elif writeyn == 'Y' or writeyn == 'y' or writeyn == 'yes' or writeyn == 'Yes': 
     print('Written to passwords.txt') 
     f = open("passwords.txt", "a+") 
     f.write(passtype + " - " + mypw) 
     break 

当我在终端内运行程序时,我得到下面的链接中显示的以下输出。

print statement repeats twice

取而代之的是print 'Writing Stopped.打印一次当用户指定,他们将不喜欢的密码写在文件password.txt的它,而不是重复两次。这也适用于print('Written to passwords.txt')。 我看空白,看看如果是这样的问题,但现在看来似乎并非如此。有谁知道是什么原因导致程序执行此操作?

+0

对不起,我应该已经更加明确建议。我现在编辑它。 – subliminal

+0

除了其他方面的建议,我发现在使用'writeyn.lower()“N”,“不”,“Y”,“是”]'是一个更容易比条件语句的字符串读取。字符串lower()将把它放到小写字母中,这样你的一半情况就消失了。如果x包含在数组中,则[x,y,z]模式中的x返回true。 – Amoliski

回答

0

的问题是你如何在

while writeyn != 'n' or writeyn != 'N' or writeyn != 'no' or writeyn != 'No' or writeyn != 'Y' or writeyn != 'y' or writeyn != 'yes' or writeyn != 'Yes': 

连接逻辑比较根据您输入“N”的截图。所以比较

writeyn != 'n' 

是假的,但

writeyn != 'N' 

为True。既然你用OR来连接它们,最后的结果是真的,你输入while循环(导致对话框重新出现)。

要解决它,我会用

while not (writeyn == 'n' or writeyn == 'N' or writeyn == 'no' or writeyn == 'No' or writeyn == 'Y' or writeyn == 'y' or writeyn == 'yes' or writeyn == 'Yes'): 
+0

@TheoretiCAL是的,但他的代码剪辑是不完整的imo。该屏幕截图显示了正在打印的其他行(如包含StackOverflow的行)。该源代码未显示。第一次“你想写你的密码到一个文本文件”打印不是上述代码剪切的一部分。但基于他的问题,我认为他很清楚自己在做什么。他希望用户输入有效的答案,如果答案无效,他想输入while循环。 – ftiaronsem

+0

由于'n'=='n',比较writeyn!='n'为False。因为'N'!='n',所以比较writeyn!='N'为真。 – ftiaronsem

+0

至于字符串类型。的raw_input的documtation表示:的raw_input([提示]) 如果提示参数存在时,它被写入到标准输出没有尾随换行符。然后该函数从输入中读取一行,将其转换为一个字符串(剥离尾随的换行符),然后返回该行。 – ftiaronsem