2017-08-28 82 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