2009-09-15 93 views
17

我想检查8位二进制字符串中的每个索引。如果是'0'那么它是'OFF',否则它的'ON'Python是否具有与“开关”等效的功能?

是否有一个更简洁的方式来编写此代码与类似开关的功能。

+5

你尝试做[{ '0': '关', '1': '在'}。获得(二)b在 “01101101”] – joeforker 2009-09-15 20:47:21

回答

21

不,它不。谈到语言本身时,Python的核心原则之一就是只有一种方法来做某件事。该开关是冗余的:

if x == 1: 
    pass 
elif x == 5: 
    pass 
elif x == 10: 
    pass 

(当然没有跌倒)。

该开关最初是作为C编译器优化引入的。现代编译器不再需要这些提示来优化这种逻辑语句。

+11

任何认为Python“只有一种方法去做某事”的人都很困惑。 – 2009-09-15 22:49:12

+0

固定。我想我可以声称它是python-esque的伪代码,嘿嘿。 – Soviut 2009-09-15 22:49:39

+14

@Glenn Maynard:可能有不止一种方式来做到这一点,但是“应该有一个 - 最好只有一个 - **明显的方式来做到这一点”,根据PEP 20(“The Zen of Python “)。 – 2009-09-15 22:53:38

28
+0

我在你的链接中嵌入了一个片段,如果你不喜欢它,请将它回滚一下。 – 2009-09-15 20:45:30

+0

这也没有落空。 – dlamblin 2009-09-15 20:58:48

+0

In * theory *您可以通过使用defaultdict: >>>从集合中实现一个单行程式输入defaultdict >>> functions = defaultdict(lambda:not_found,a = function_1,b = function_2) 但在实践中可能不是一个好主意,特别是如果这种情况很常见的话:) – 2009-09-15 21:58:05

7

试试这个:

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] 
+0

这真的很聪明。 – twneale 2009-09-15 21:45:44

0

否则,如果是不好的做法,因为它们是不安全的时候它们变得太长,并且涉及不必要的条件分支(可能影响编译器/缓存)。

试试这个...

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" 
+0

函数需要将变量传递到范围中 – Jason 2017-01-30 00:52:14

相关问题