2016-12-03 321 views
0

我正在使用我的代碼的if語句來體驗不想要的行爲。當我在while loop中調用條件語句時,無論提供哪個輸入,只調用第一個條件。我希望正確的輸入來調用正確描述的函數,然後繼續回到循環的開始處,以詢問用戶另一種選擇。while循環條件語句只調用第一個條件

color_modes = ['sangria', 'ham', 'nightHawk'] 
print color_modes 
def sangria(): 
    my_range = list(range(20)) 
    print my_range 
def ham(): 
    print 'foo' 
def nightHawk(): 
    print 'nightHawk' 
while True: 
    user_input = input('...') 
    if 'sangria': 
     ham() 
     continue 
    if 'ham': 
     sangria() 
     continue 
    if 'nightHawk': 
     nightHawk() 
     continue 
    else: 
     break 

Moreoever,當我使用的語法:

if user_input == 'ham':代替簡寫if 'ham:,病情不起作用。先謝謝你。

回答

1

在Python 2

user_input = input('...') 

嘗試來評估用戶的輸入。如果輸入一個字符串,如ham,Python將嘗試評估表達式ham,這將失敗,如下所示(除非在範圍中有一個類似命名的變量)。

>>> input('...') 
...ham 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<string>", line 1, in <module> 
NameError: name 'ham' is not defined 

您可以通過使用raw_input(),而不是修復它:

user_input = raw_input('...') 

,然後使用字符串比較:

while True: 
    user_input = raw_input('...') 
    if user_input == 'ham': 
     ham() 
    elif user_input == 'sangria': 
     sangria() 
    elif user_input == 'nightHawk': 
     nightHawk() 
    else: 
     break 

此代碼還使用elif,以避免不必要的continue語句。

更好的方法是使用字典用戶輸入映射到相關的功能:

input_map = {'ham': ham, 'sangria': sangria, 'nightHawk': nightHawk} 
while True: 
    func = input_map.get(raw_input('...')) 
    if func is None: 
     break 
    func() 
1

if 'ham'將始終通過,因爲非空字符串總是True

相反,您必須使用==運算符檢查相等性。

正確的代碼是:

color_modes = ['sangria', 'ham', 'nightHawk'] 
print color_modes 
def sangria(): 
    my_range = list(range(20)) 
    print my_range 
def ham(): 
    print 'foo' 
def nightHawk(): 
    print 'nightHawk' 
while True: 
    user_input = input('...') 
    if user_input == 'sangria': 
     ham() 
     continue 
    if user_input == 'ham': 
     sangria() 
     continue 
    if user_input == 'nightHawk': 
     nightHawk() 
     continue 
    else: 
     break 
+0

謝謝你的回覆。我現在明白,2.7中的raw_input和python 3中的input都會返回字符串,但是2.7中的默認輸入返回一個表達式。我想這是我的這個簡單的錯誤。謝謝大家的澄清。謝謝你澄清'if'somestring''的作用。 –

1

if 'sangria':僅供if bool('sangria'):的簡寫,它始終計算爲if True,所以第一件事就是不管輸入的跑

你需要比較輸入字符串。有沒有簡寫/替代方式來寫它像一個Java開關案例聲明

順便說一句,這段代碼看起來很奇怪。

if 'sangria': 
    ham() 
    continue 
if 'ham': 
    sangria() 
    continue 

如果我知道你想什麼,你可以創建一個功能圖。

funcs = {"ham": ham, "sangria" : sangria, "nightHawk" : nightHawk} 
user_input = input() 
funcs[user_input]() # use the string to get the function object, then call it