2016-12-03 11 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:を、条件が機能しません。前もって感謝します。空ではない文字列は常にTrueあるので、

答えて

1

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()を使用して、それを修正することができます:このコードも不要continue文を避けるためにelifを使用しています

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

:文字列比較を使用して、その後

user_input = raw_input('...') 

をして。

より良い方法は、関連する機能へのユーザー入力をマップするために辞書を使用することです:

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'は常に通過します。

代わりに、あなたは==演算子を使用して等しいかどうかを確認する必要があります。

正しいコードは次のようになります。

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で式を返します。私はこの単純なエラーが私の側にあったと思います。清潔にしてくれてありがとうございました。 'もし' somestring 'が何をするのかを明確にしてくれてありがとう。 –

1

if 'sangria':は、あなたが入力文字列を比較する必要があるため、最初の事は関係なく、入力

の走っている、常にif Trueに評価if bool('sangria'):ための唯一の速記であり、 。 Javaのスイッチcase文

このコードは道で、奇妙に見えるようにそれを書くために何速記/代替方法はありません。

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

あなたが望むものが分かっている場合は、機能マップを作成できます。ユーザの入力を評価する試み

user_input = input('...') 

パイソン2において

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