2013-03-20 67 views
1
一個循環

這個問題有兩個問題:條件的優先級,並完成與兩個可能的條件

  1. 是存在的條件下優先規則與條件while循環一組特定的?
  2. 我怎麼能得到兩個滿意的條件之一(即condition_x或condition_y)來完成一個循環?

細節:

爲Python新手,我對面的情況在未來一段時間的循環,一定的條件優先於其他人。

我試圖讓:

  1. 要求,即「Y」兩個值或「N」
  2. 但是如果「N」選擇迴歸自定義提示,然後允許值「OK 「
  3. 並使其以使得無論是輸入‘Y’,在步驟1或‘確定’,在步驟3將完成環路

正在發生的事情是,當進入‘N’的第一個條件是優先並返回聲明:

please enter 'y' or 'n' 

時,我希望它是返回:

oh come on, enter 'ok' 

代碼:

(我知道使用兩個break的可能是錯誤的 - 我想不出out如何得到'y'或'ok'來完成循環)

while True: 
    user_input = raw_input('question? (y/n)') 
    my_string = 'here is a string ' 
    if len(user_input) == 0: 
     print 'question? (y/n)' 
    elif user_input is not 'y' or 'n': 
     print 'please enter \'y\' or \'n\'' 
    elif user_input is 'n': 
     print 'oh come on, enter \'ok\'' 
    elif user_input is 'ok': 
     print my_string + ', ' \ 
     .join(list_var[:-1]), list_var[-1] + '?' 
     break 
    else: 
     print my_string + ', ' \ 
     .join(list_var[:-1]), list_var[-1] + '?' 
     break 

回答

2

你正在構造你的布爾邏輯錯誤;使用:

elif user_input not in ('y', 'n'): 

改爲。

表達user_input is not 'y' or 'n'被解釋爲(user_input is not 'y') or ('n'),這將始終爲True(在布爾上下文非空字符串被認爲是True):

>>> if 'n': print 'n!' 
... 
n! 

您還應該使用==平等的測試,而不是is身份測試。 is測試兩個操作數是否爲相同的對象,而==測試是否具有相同的值。對於偶爾碰巧都是True的小字符串,這是一個Python優化,而不是您可以依賴的用於所有字符串的東西。

下一個問題是當用戶輸入是過度使用elif時會發生什麼情況。當user_inputok,例如,它是yn,所以elif user_input not in ('y', 'n')比賽,排除所有其他elif分支

你真的要簡化你的邏輯:

if user_input not in ('y', 'n', 'ok'): 
    print "please enter 'y' or 'n'" 
elif user_input == 'n': 
    print "oh come on, enter 'ok'" 
else: 
    print '{}{}{}?'.format(my_string, ', '.join(list_var[:-1]), list_var[-1]) 
    break 

的這一切有什麼關係while循環。

+0

感謝您提供關於布爾邏輯的信息,當輸入'y'(結束循環)或除'y'或'n'以外的任何字母時,我試圖進行建議的更改並且代碼按需要運行。 (它會返回提示輸入'y'或'n'),但輸入'n'然後'ok'時,它不會完成循環,而是返回到'y'或'n'提示符。這個鏈接有代碼和解釋器面板:http://labs.codecademy.com/nlL#:workspace – user1063287 2013-03-20 15:15:22

+0

@ user1063287:我減少你的分支到最低限度;你過於複雜的事情。 – 2013-03-20 15:24:54

+0

在瘦身實現中拋出的提示不會返回自定義提示,而是返回'y/n'提示(http://labs.codecademy.com/nlz#:workspace)。原來的確會返回自定義提示(http://labs.codecademy.com/nlL#:workspace),但是會返回原始提示。在這兩種情況下複製的步驟是輸入'n',然後'確定'。期望的行爲是輸入'y' - >完成循環,而輸入'n'>自定義提示 - >完成循環。 – user1063287 2013-03-20 15:51:40