8桁のバイナリ文字列の各インデックスをチェックしようとしています。もしそれが '0'
それなら'OFF'
それ以外の場合は'ON'
。
スイッチのような機能を使用してこのコードを記述するより簡潔な方法はありますか?
いいえ、ありません。言語自体に関して言えば、コアとなるPython=原則の1つは、何かを実行する方法を1つだけにすることです。スイッチは次のように冗長です。
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-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"