Python是否具有与';开关';?
我试图检查8位二进制字符串中的每个索引。如果它是Python是否具有与';开关';?,python,syntax,switch-statement,Python,Syntax,Switch Statement,我试图检查8位二进制字符串中的每个索引。如果它是'0',则它是'OFF',否则它是'ON' 有没有一种更简洁的方法来编写具有类似开关功能的代码?没有。说到语言本身,Python的核心原则之一就是只有一种方法来做某事。交换机是冗余的,用于: if x == 1: pass elif x == 5: pass elif x == 10: pass (当然,没有失败) 该开关最初是作为C语言的编译器优化而引入的。现代编译器不再需要这些提示来优化此类逻辑语句。请尝试以下方法:
'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 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"
Switch语句在C语言中是一种非常有用的结构。在python中,它在大多数情况下都可以用字典代替。我认为switch语句在实现状态机时也非常有用,python不能替代它。它通常会导致长函数的“糟糕”编程风格。但正是switch语句将状态函数划分为小块。在python中,必须使用if-elif构造。switch语句的大多数用法都可以用一种更优雅的方式来代替,有些则不那么优雅。从Python 3.10.0(2021年3月30日发布的alpha6)开始,现在有了一种官方真正的语法等价物
数字=5
匹配数字:
案例5:
打印(“数字为5,状态为开”)
案例1:
打印(“数字为1,状态为开”)
案例0:
打印(“数字为零,状态为关闭”)
个案:
打印(“值未知”)
将此作为每个未来遇到此问题的用户的答案。由于关于这个主题的大多数流行问题都已经结束了回答,所以我写了一篇文章,试图涵盖所有你可能需要知道或注意的关于
match
你是否正在尝试做[{'0':'Off','1':'on'}.get(b)for b in“01101101”]任何认为Python“只有一种方法做某事”的人的可能重复非常困惑。@Glenn Maynard:可能有不止一种方法,但是根据PEP 20(“Python的禅宗”)“应该有一种——最好只有一种——明显的方法来做”。我相信开关的目的是告诉编译器构建一个跳转表?(我知道目前的编译器不需要它。)@Glenn确实明白,虽然有许多冗余的python模块,但实际的核心语言几乎没有冗余功能。尽管这种方式在一开始可能并不明显,除非你是荷兰人。函数是将变量传递到作用域中所必需的