2009-09-15 10 views
17

J'essaye de vérifier chaque index dans une chaîne binaire de 8 chiffres. Si c'est '0' alors c'est 'OFF' sinon c'est 'ON'.Est-ce que Python a un équivalent à 'switch'?

Existe-t-il un moyen plus concis d'écrire ce code avec une fonctionnalité de type commutateur?

+5

Essayez-vous de faire [{ '0': 'Off', '1': 'On'}. Get (b) b dans "01101101"] – joeforker

Répondre

21

Non, ce n'est pas le cas. Quand il s'agit de langage lui-même, l'un des principes fondamentaux de Python est de n'avoir qu'un seul moyen de faire quelque chose. Le commutateur est redondant à:

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

(sans les retombées, bien sûr).

Le commutateur a été initialement présenté comme une optimisation de compilateur pour C. Les compilateurs modernes n'ont plus besoin de ces conseils pour optimiser ce type d'instruction logique.

+11

Quiconque pense que Python "n'a qu'une seule façon de faire quelque chose" est très confus. –

+0

Fixe. Je suppose que j'aurais pu prétendre que c'était du pseudo-code python-esque, hehe. – Soviut

+14

@Glenn Maynard: Il y a peut-être plus d'une façon de le faire, mais "Il devrait y en avoir une - et de préférence une seule - ** façon évidente ** de le faire", selon PEP 20 ("The Zen of Python "). –

28
+0

J'ai intégré un extrait de votre très bon lien, faites-le revenir si vous ne l'aimez pas. –

+0

Cela n'a pas de problème non plus. – dlamblin

+0

En * théorie * vous pouvez implémenter un doublon avec retombée en utilisant defaultdict: >>> depuis les collections import defaultdict >>> fonctions = defaultdict (lambda: not_found, a = fonction_1, b = fonction_2) mais probablement pas une bonne idée dans la pratique, en particulier si le cas de panne est commun :) –

7

Essayez ceci:

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

Ou vous pouvez utiliser une compréhension de la liste ou l'expression du générateur si vos fonctions renvoient des valeurs:

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

C'est vraiment intelligent. – twneale

0

else-if est une mauvaise pratique, car ils ne sont pas sûrs quand ils deviennent trop longs et impliquent des branchements conditionnels inutiles (affectant peut-être le compilateur/la mise en cache).

essayer ...

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

les fonctions sont nécessaires pour passer des variables dans la portée – Jason

Questions connexes