web-dev-qa-db-ja.com

Pythonには「スイッチ」と同等のものがありますか?

8桁のバイナリ文字列の各インデックスをチェックしようとしています。もしそれが '0'それなら'OFF'それ以外の場合は'ON'

スイッチのような機能を使用してこのコードを記述するより簡潔な方法はありますか?

25
AME

いいえ、ありません。言語自体に関して言えば、コアとなるPython=原則の1つは、何かを実行する方法を1つだけにすることです。スイッチは次のように冗長です。

if x == 1:
    pass
Elif x == 5:
    pass
Elif x == 10:
    pass

(もちろん、フォールスルーなし)。

このスイッチは、もともとCのコンパイラ最適化として導入されました。最近のコンパイラでは、この種の論理ステートメントを最適化するためにこれらのヒントは不要になりました。

32
Soviut

代わりにこれを試してください:

def on_function(*args, **kwargs):
    # do something

def off_function(*args, **kwargs):
    # do something

function_dict = { '0' : off_function, '1' : on_function }

for ch in binary_string:
   function_dict[ch]()

または、関数が値を返す場合は、リスト内包表記またはジェネレータ式を使用できます。

result_list = [function_dict[ch]() for ch in binary_string]
11
Jeff

else-ifは、長くなりすぎると安全でなく、不要な条件分岐を伴うため(おそらくコンパイラ/キャッシングに影響を与える可能性があるため)、悪い習慣です。

これを試して...

class Functions():
    @staticmethod
    def func():
        print("so - foo")
    @staticmethod
    def funcWithArgs( junk ):
        print(junk, "foo")

# fill in your cases here...
cases = {
    "a" : Functions.func ,
    "b" : Functions.funcWithArgs ,
    "c" : Functions.funcWithArgs
}

def switch( ch, cases, *args ):
    try:
        len(*args)  # empty args
    except TypeError:
        return cases[ ch ]( )
    return cases[ ch ]( *args )

# try out your switch...
switch("a", cases)  # "so - foo"
switch("b", cases, "b -")  # "b - foo"
switch("c", cases, "c -")  # "c - foo"
1
Jason