I am trying to check each index in an 8 digit binary string. If it is '0'
then it is 'OFF'
otherwise it is 'ON'
.
Is there a more concise way to write this code with a switch-like feature?
I am trying to check each index in an 8 digit binary string. If it is '0'
then it is 'OFF'
otherwise it is 'ON'
.
Is there a more concise way to write this code with a switch-like feature?
No, it doesn't. When it comes to the language itself, one of the core Python principles is to only have one way to do something. The switch is redundant to:
if x == 1:
pass
elif x == 5:
pass
elif x == 10:
pass
(without the fall-through, of course).
The switch was originally introduced as a compiler optimization for C. Modern compilers no longer need these hints to optimize this sort of logic statement.
Try this instead:
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]()
Or you could use a list comprehension or generator expression if your functions return values:
result_list = [function_dict[ch]() for ch in binary_string]
As of Python 3.10.0 (alpha6 released March 30, 2021) there is an official true syntactic equivalent now!
digit = 5
match digit:
case 5:
print("The number is five, state is ON")
case 1:
print("The number is one, state is ON")
case 0:
print("The number is zero, state is OFF")
case _:
print("The value is unknown")
I've written up this other Stack Overflow answer where I try to cover everything you might need to know or take care of regarding match
.
else-if is bad practice, since they are unsafe when they get too long, and involve unnecessary conditional branching (maybe affecting compiler / caching).
Try this...
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 arguments
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"
A switch statement is a very useful construction in the C language. In Python it can be in most cases replaced with dictionaries.
I think that switch statements are also very useful when implementing state machines, and Python does not have a replacement for this. It usually leads to a "bad" programming style to a long function. But it is the switch statement, that divides the state function to little pieces. In Python, the if - elif construction must be used. Most uses of a switch statement can be replaced in a more elegant way, some in a little bit less elegant way.
since python 3.10 there is match-case statement `
def f(x):
match x:
case 'a':
return 1
case 'b':
return 2
case _:
return 0 # 0 is the default case if x is not found
`