2011-01-13 2 views
3

Plonger plus profondément dans le langage python intéressant, donc il n'y a pas de commutateur dans le langage en tant que construction. Donc, en utilisant les dictionnaires est le premier choix en lisant l'apprentissage python première édition. J'ai donc essayé STH comme,un autre commutateur avec des fonctions

cases = { 2 : readt3(e,t,off, partElems, partsNodes), # to read the triangular elements 
      3 : readq4(e,t,off, partElems, partsNodes), # to read the quadrangular elements 
      5 : readh8(e,t,off, partElems, partsNodes), # to read the hexa elements 
     }  
# define functions 
def readt3(e, t, off, partElems, partsNodes, partPnt): 
    partsElems[partPnt].append(e) 
    nods = t[offset: offset+3]; 
    for n in nods: 
     partsNodes[partPnt].append(n) 
    return 

et a obtenu l'erreur « readt3 est indéfini », je pensais que je suis arrivé parce qu'il est pas défini avant le cas, déplacé les définitions de fonction des cas ci-dessus, mais toujours le même problème, mais cette fois-ci "e n'est pas défini" Je ne pouvais pas comprendre cela, donc e est un paramètre de fonction, pourquoi ai-je une erreur liée à la définition sur e?

Où les définitions de fonctions devraient-elles être placées lors de l'émulation d'un commutateur dans cette situation?

+0

+1 pour équilibrer la note de -1. S'il vous plaît quand vous votez -1, donnez une raison. Cette question ressemble à une question de débutant de base pour moi. –

+0

Je me demandais aussi pourquoi il y avait un -1, et oui je suis un débutant en python ... –

+0

Le manque d'instructions switch de Python est l'une des nombreuses raisons pour lesquelles j'AIME Python. Maintenant, vous utilisez un modèle de stratégie très facile à lire et facile à maintenir. Je recommande que lorsque vous utilisez le modèle de stratégie dans la réponse que vous avez sélectionnée, vous utilisez un meilleur nom. Le nom que vous avez choisi vous donne l'impression de coder à contrecœur sur l'absence de déclarations de cas de Python lorsque vous utilisez une bonne pratique. – marr75

Répondre

9

quand vous faites quelque chose comme ceci:

... 
2 : readt3(e,t,off, partElems, partsNodes) 
... 

en fait, vous évaluez (appelant) la fonction readt3 avec les arguments e,t,off, partElems, partsNodes ce que je pense que vous voulez faire est quelque chose comme ça (pour imiter la déclaration de cas de commutation):

def readt3(e, t, off, partElems, partsNodes, partPnt): 
    partsElems[partPnt].append(e) 
    nods = t[offset: offset+3]; 
    for n in nods: 
     partsNodes[partPnt].append(n) 
    return 

# And of course all your function definition should be here before the cases dict. 

cases = { 2 : readt3, # to read the triangular elements 
      3 : readq4, # to read the quadrangular elements 
      5 : readh8, # to read the hexa elements 
     } 

et maintenant vous pouvez appeler votre cas donné un argument case comme ceci:

case = 2 

cases[case](e,t,off, partElems, partsNodes) 
0
cases = { 2 : readt3(e,t,off, partElems, partsNodes), 

Ici, vous appelez la fonction readt3 avec des arguments e, t, off, etc., Qui ne sont pas définis.

+0

Je devrais lire un peu plus sur les fonctions parce qu'apparemment, les arguments ne sont pas passés par référence, donc vous ne pouvez pas obtenir un accès direct, c'est un problème plus fondamental ... –

1

Le dictionnaire n'est pas destiné à être utilisé comme construction. Il n'est pas utilisé pour stocker la structure mais les données réelles. Dans votre cas, je pense qu'il est préférable de définir un objet. Pensez à utiliser OO dans ce scénario.

2

En fait, l'utilisation de dictionnaires pour répartir les appels est quelque chose qui peut parfois être fait, où cela a du sens, et quand vous savez ce que vous faites.

La construction de syntaxe Python utilisée à la place de "switch...case" dans d'autres langues est "if..elif..else".

Je ne sais pas pourquoi les gens ne vont tout simplement pas. C'est comme si on allait "perdre la performance" ou quoi que ce soit. Mais le cas du commutateur, quand on pense, est un cas spécial extrêmement réduit d 'une chaîne if - else: il permet seulement la comparaison pour l' égalité, et seulement la comparaison des entiers (en C au moins, je ne sais pas tous les langage là-bas qui clone la syntaxe C), tandis que dans une chaîne if-elif on peut utiliser n'importe quelle expression.

Il est facile de percevoir que l'instruction Switch case vient d'être introduite en C car elle permettait au compilateur d'automatiser les optimisations pour ce cas particulier (avec des tables de sauts, au lieu d'une séquence de comparaisons). Mais ... cela n'a de sens que pour les langages compilés, et ensuite, cela n'a de sens que lorsque le compilateur ne peut pas prendre en charge ces optimisations seul, et même alors, cela n'a de sens que si la différence sped pour 10 ou 20 compare supérieur à l'aide d'une table de saut. Comme vous pouvez le voir, il est assez redondant d'avoir un "switch case" dans un langage moderne de haut niveau, et c'est parce que l'on peut enchaîner les instructions if-elif-else.

+0

Ceci n'est qu'une alternative aux instructions switch. Les dictionnaires (comme discuté dans d'autres réponses à cette question) et le polymorphisme sont deux options qui sont souvent beaucoup plus appropriées que les instructions enchaînées si. – Duncan

Questions connexes