Подтвердить что ты не робот

У Python есть эквивалент "switch"?

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

Есть ли более сжатый способ написать этот код с помощью функции, подобной коммутатору?

4b9b3361

Ответ 1

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

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

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

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

Ответ 3

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

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]

Ответ 4

else - если это плохая практика, поскольку они небезопасны, когда они становятся слишком длинными, и связаны с ненужным условным ветвлением (возможно, затрагивают компилятор/кеширование).

попробуйте это...

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"