Python是否具有与';开关';?

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语言的编译器优化而引入的。现代编译器不再需要这些提示来优化此类逻辑语句。请尝试以下方法:

我试图检查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 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模块,但实际的核心语言几乎没有冗余功能。尽管这种方式在一开始可能并不明显,除非你是荷兰人。函数是将变量传递到作用域中所必需的