2016-10-28 5 views
0

入力が= 1つの数値か他の数値かを確認する方法を見つけたいと思っていますが、 Pythonでネストされたifを使用しています。PythonでネストされたIFを使用するより効率的な方法がある

def menu(): 
    while type(x) != int or x < 0 or x > 46: 
     try: 
      x = int(input("\nEnter a valid menu choice: ")) 
     except: 
      print("\nInvalid input...\n") 
    if x == 1: 
     max1() 
    elif x == 2: 

    elif x == 3: 

    elif x == 4: 

しかし、これは私がif x == n 46以上を必要とする、ユーザーの入力に他の機能を要請するためのシンプルなメニュー機能のための私のコードの設計です。

すべての行をelif x == n+1するよりも速い方法はありますか?

+0

ディスパッチdict(実際に効率的にする必要がある場合は**機能の外に**構築されます)がありますが、46項目のメニューが深刻な問題であるように思えます。 – user2357112

+0

「最良の」解決策は、メニュー項目が互いにどのように異なるかに依存する –

答えて

2

は、それを呼び出し、右の機能を取得するためにxを使用し、その後、関数への参照を保持するために辞書を使用します。この場合、

{1: max1, 2: whatever, 3: something_else}[x]() 

をあなたがそう、整数で右の機能を選択しています

[max1, whatever, something_else][x-1]() 

しかし、読みやすいので、私は辞書を好む:あなたはまた、リストを使用することができ、あなたがそれを変更する必要がある場合、あなたは簡単に 13に関連付けられている機能を見つけることができます。

N.B.あなたのコードに "入れ子になったif"はありません。

1

機能に整数の辞書を使用します。

function_mapping = { 
    1: max1, 
    2: max2, 
    ... 
    n: maxn 
} 

function_mapping[x]() 

あなたの機能がこのように命名されている場合は、この辞書を構築する「ハック」の方法は、例えば、ありますこれらのブランチのいずれも抽象化できない場合

function_mapping = {i: globals()['max' + str(i)] for i in range(1,n+1)} 
0

/組み合わせた、このようなものは役に立つかもしれません:検索が特に整数キーのために、ほぼ一定の時間でなければなりませんので

def max1(): 
    pass # your block body 

def error(): 
    pass # handle lookup failure 

{1:max1 
,2:... 
}.get(x,error)() 

Pythonの辞書はハッシュマップをする必要があります。

関連する問題