2017-11-04 5 views
0

に持つ:メニューナビゲーションこれが私の小さなメニューナビゲーションifとelseステートメントである場合、他のPython

def navigation(): 


    navigation_eingabe = int(input()) 


    if navigation_eingabe == 1: 
     met1() 
    if navigation_eingabe == 2: 
     pass 
    if navigation_eingabe == 3: 
     pass 
    if navigation_eingabe == 4: 
     pass 
    if navigation_eingabe == 5: 
     pass 
    if navigation_eingabe == 6: 
     pass 
    else: 
     print("Pls give only Integer numbers") 


def met1(): 
    print("method1") 
    met2() 

def met2(): 
    print("method2") 


navigation() 

その私は1などの入力を与えた後、コードは、その後、MET1になり、正常に動作していませんmeth2に、そしてelse文に渡されます。どうしてか分かりません?

そして私は一例で、このalternativコードプログラム:

def navigation(): 
    x = int(input()) 

    if x == 1: 
     print("1") 
     xx1() 
    if x == 2: 
     print("2") 
     xx2() 
    else: 
     print("else statement") 


def xx1(): 
    print("this is met1") 

def xx2(): 
    print("this is met2") 


navigation() 

しかし、このコードでは、ステートメントがなぜ最初のコードでは、正しく動作しているの?これは関数型プログラミングロジックや文構造体に問題がありますか?私はこの2つのコードの違いを見ることはできません。

ありがとうございました!

+0

これは、このコードのロジックに問題があります。複数の 'if'の代わりに' elif'を使うべきです。どうして?ペンと紙でコードをステップ実行します。最初の5つの条件のいずれかが満たされた後に実行が停止しますか? – ForceBru

+0

あなたの最後の 'if'は' navigation_eingabe'が '6'なら何もせず、それ以外の場合にはメッセージを表示します。 '1'は' 6'ではないので、メッセージを表示します。 – melpomene

答えて

1

同じブロック内で複数の条件をテストする場合は、最初の条件にはifを使用し、その後はその他の条件文にはelifを使用し、次にelseを使用します。 elseのコードブロックは、その他の条件がFalseの場合にのみ実行されます。あなたのコードの問題は、elifを使用する必要があるすべてのifステートメントを使用することです。最初のコードがelseステートメントになる理由は、最初のifステートメントの結果が何であっても、最後のifステートメントが実行されるためです。

if navigation_eingabe == 1: 
    met1() 
elif navigation_eingabe == 2: 
    pass 

はあなたのelif文の残りの部分を入れて、else声明で終わるので、他の条件のいずれにも該当しない場合は、それが印刷されます:

else: 
    print('Pls only give integer numbers.') 

しかし、このコードは何をしていませんあなたはそれがそうだと思います。例外処理のためにelseステートメントを使用しています。これは動作しません。

try: 
    navigation_eingabe = int(input()) 
    if navigation_eingabe == 1: 
     met1() 
    elif navigation_eingabe == 2: 
     pass 
    elif navigation_eingabe == 3: 
     pass 
    elif navigation_eingabe == 4: 
     pass 
    elif navigation_eingabe == 5: 
     pass 
    elif navigation_eingabe == 6: 
     pass 
    else: 
     print('not a number 1-6') 
except ValueError: #the type of error if you try to convert a non-integer string to an int. 
    print('Pls only give integer numbers.') 

これは、それぞれの条件をチェックし、不正な文字列が入力に渡された場合、エラーをキャッチします:何が必要try-except文です。

1

これは、最初のifステートメントの後にnavigation()関数の実行が停止すると考えたために起こりました。それ以降はelifの代わりにifのステートメントがあります。

だからelif文とは対照的に、あなたが連続しifステートメントを使用しているので、Pythonインタプリタがそうnavigation()が最初で、独立した。判断として、各ブロックを扱うelifの代わりに、より多くのif

if navigation_eingabe == 1: 
    met1() 
elif navigation_eingabe == 2: 
    pass 
elif navigation_eingabe == 3: 
    pass 
elif navigation_eingabe == 4: 
    pass 
elif navigation_eingabe == 5: 
    pass 
elif navigation_eingabe == 6: 
    pass 
else: 
    print("Pls give only Integer numbers") 
1

を使用しますnavigation_eingabe == 1を評価する。入力プロンプトに1というエントリがある場合、これは真です。次の行は、別々は判断文として扱われるので、それは次のブロックに到達するまで、それは、そうでnavigation_eingabe == 2場合チェックし、:インタプリタは比較navigation_eingabe == 6とは判断に入る

if navigation_eingabe == 6: 
    pass 
else: 
    print("Pls give only Integer numbers") 

れる、及び以前の5つの比較のいずれかがTrueまたはFalseであったかどうかにかかわらず、これを評価します。この比較はnavigation_eingabe == 1であるのでFalseと評価され、キャッチオールとしてelseブロックに分類されます。 int(input())intとしてキャストすることはできません何のためにValueError例外が発生しますので、

また、else句はとにかく非整数入力のために到達することはありません。非整数入力をキャッチするには、navigation()の内容をtryexceptのブロックに分ける必要があります。

私はあなたが実際にやろうとしているが、次が疑われる:プロンプトで1を入力すると、出力は次のようである、

def navigation(): 

    try: 

     navigation_eingabe = int(input()) 

     if navigation_eingabe == 1: 
      met1() 
     elif navigation_eingabe == 2: 
      pass 
     elif navigation_eingabe == 3: 
      pass 
     elif navigation_eingabe == 4: 
      pass 
     elif navigation_eingabe == 5: 
      pass 
     elif navigation_eingabe == 6: 
      pass 

    except ValueError: 

     print("Please only enter integers.") 

def met1(): 

    print("method1") 
    met2() 

def met2(): 

    print("method2") 

navigation() 

た場合:Pythonで

1 
method1 
method2 
関連する問題