2009-09-15 21 views
17

Estoy tratando de verificar cada índice en una cadena binaria de 8 dígitos. Si es '0', entonces es 'OFF' si no es 'ON'.¿Python tiene un equivalente a 'cambiar'?

¿Hay alguna forma más concisa de escribir este código con una función tipo interruptor?

+5

¿Estás tratando de hacer [{ '0': 'Off', '1': 'En'}. Get (b) para b en "01101101"] – joeforker

Respuesta

21

No, no lo hace. Cuando se trata del lenguaje en sí, uno de los principios centrales de Python es tener solo una forma de hacer algo. El interruptor es redundante para:

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

(sin la caída, por supuesto).

El modificador se introdujo originalmente como una optimización del compilador para C. Los compiladores modernos ya no necesitan estos consejos para optimizar este tipo de enunciado lógico.

+11

Cualquiera que piense que Python "solo tiene una forma de hacer algo" es muy confuso. –

+0

Reparado. Supongo que podría haber afirmado que era un pseudocódigo de python, jeje. – Soviut

+14

@Glenn Maynard: Puede haber más de una forma de hacerlo, pero "Debería haber una, y preferiblemente solo una, ** forma ** de hacerlo", según PEP 20 ("El Zen de Python" "). –

28
+0

He incrustado un fragmento de tu muy buen enlace, hazlo retroceder si no te gusta. –

+0

Eso tampoco tiene caída. – dlamblin

+0

En * teoría * podría implementar una línea con caída mediante el uso de defaultdict: >>> de cobranza importación defaultdict >>> funciones = defaultdict (lambda: not_found, a = function_1, b = function_2) pero probablemente no sea una buena idea en la práctica, particularmente si el caso de caída es común :) –

7

Tal vez puedas probar:

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]() 

O usted podría utilizar una lista por comprensión o expresión generador si sus funciones devuelven valores:

result_list = [function_dict[ch]() for ch in binary_string] 
+0

Esto es realmente inteligente. – twneale

0

otra cosa, si es una mala práctica, porque no son seguros cuando se vuelven demasiado largos e implican una ramificación condicional innecesaria (tal vez afecta al compilador/almacenamiento en caché).

probar este ...

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

las funciones son necesarias para pasar variables al ámbito – Jason

Cuestiones relacionadas