Есть ли в Python эквивалент «switch»? - PullRequest
24 голосов
/ 16 сентября 2009

Я пытаюсь проверить каждый индекс в двоичной строке из 8 цифр. Если это '0', то это 'OFF', в противном случае это 'ON'.

Есть ли более лаконичный способ написания этого кода с помощью переключателя .?

Ответы [ 3 ]

32 голосов
/ 16 сентября 2009

Нет, это не так. Когда дело доходит до самого языка, один из основных принципов Python - иметь только один способ что-то сделать. Переключатель резервируется до:

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

(без провала, конечно).

Переключатель был первоначально представлен как оптимизация компилятора для C. Современные компиляторы больше не нуждаются в этих подсказках для оптимизации логического выражения такого типа.

10 голосов
/ 16 сентября 2009

Попробуйте вместо этого:

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]
1 голос
/ 30 января 2017

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"
...