Я пытаюсь проверить каждый индекс в 8-разрядной двоичной строке. Если это '0'
, то это 'OFF'
иначе его 'ON'
.
Есть ли более сжатый способ написать этот код с помощью функции, подобной коммутатору?
Я пытаюсь проверить каждый индекс в 8-разрядной двоичной строке. Если это '0'
, то это 'OFF'
иначе его 'ON'
.
Есть ли более сжатый способ написать этот код с помощью функции, подобной коммутатору?
Нет, нет. Когда дело доходит до самого языка, одним из основных принципов Python является только один способ сделать что-то. Переключатель избыточен:
if x == 1:
pass
elif x == 5:
pass
elif x == 10:
pass
(без провала, конечно).
Коммутатор был первоначально представлен как оптимизация компилятора для C. Современные компиляторы больше не нуждаются в этих подсказках для оптимизации такого рода логических операторов.
Попробуйте это вместо:
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]
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"