Existe-t-il un moyen plus pythonique de faire des instructions imbriquées if else que celle-ci:
def convert_what(numeral_sys_1, numeral_sys_2):
if numeral_sys_1 == numeral_sys_2:
return 0
elif numeral_sys_1 == "Hexadecimal":
if numeral_sys_2 == "Decimal":
return 1
elif numeral_sys_2 == "Binary":
return 2
elif numeral_sys_1 == "Decimal":
if numeral_sys_2 == "Hexadecimal":
return 4
elif numeral_sys_2 == "Binary":
return 6
elif numeral_sys_1 == "Binary":
if numeral_sys_2 == "Hexadecimal":
return 5
elif numeral_sys_2 == "Decimal":
return 3
else:
return 0
Ce script fait partie d'un simple convertisseur.
python
if-statement
Module_art
la source
la source
and
conditions pour les instructions if-else de niveau supérieur. Ce serait au moins plus lisible de cette façon. Malheureusement, python n'a pas d'instructions switch.Réponses:
Bien que les réponses de @Aryerez et @ SencerH. Fonctionnent, chaque valeur possible de
numeral_sys_1
doit être écrite à plusieurs reprises pour chaque valeur possible denumeral_sys_2
lors de la liste des paires de valeurs, ce qui rend la structure de données plus difficile à maintenir lorsque le nombre de valeurs possibles augmente. À la place, vous pouvez utiliser un dict imbriqué à la place de vos instructions if imbriquées:Alternativement, vous pouvez générer les paires de valeurs pour le mappage avec la
itertools.permutations
méthode, dont l'ordre suit celui de la séquence d'entrée:la source
Insérez toutes les combinaisons valides dans l'un
dictionary
destuple
s, et si la combinaison n'est pas là, retournez 0:Si vous prévoyez d'utiliser la fonction dans une boucle, il peut être préférable de définir le dictionnaire en dehors de la fonction, afin qu'il ne soit pas recréé à chaque appel à la fonction.
la source
except KeyError:
.get()
méthode dict avec0
default au lieu de l'try
instruction.try:... except:...
structure.Si vous êtes sûr qu'aucune autre valeur n'a pu être définie sur les variables numeral_sys_1 et numeral_sys_2, c'est la solution la plus simple et la plus propre.
D'autre part, vous devez étendre le dictionnaire avec ses combinaisons avec les valeurs disponibles, si vous avez une autre valeur que "Hexadécimal", "Décimal" et "Binaire"
La logique ici est; si les tuples variables dans les clés de dictionnaire ne sont pas égaux au tuple variable donné, la méthode .get () renvoie "0". Si un tuple variable donné correspond à n'importe quelle clé du dictionnaire, retourne donc la valeur de la clé correspondante.
Il est également possible d'utiliser un générateur. Semble beaucoup plus intelligent, mais je pense que le dictionnaire codé en dur serait plus rapide que d'utiliser un générateur pour cette simple exigence.
la source
Une autre façon d'utiliser la liste imbriquée. J'espère que cela aide!!
la source
À mon avis, cette
convert_what
fonction elle-même n'est pas très pythonique. Je suppose que le code qui appelle ce code a aussi un tas d'instructions if et effectue la conversion en fonction de la valeur de retour deconvert_what()
. Je suggère quelque chose comme ça:Première étape, créez une fonction pour chaque combinaison:
Deuxième étape, mettez les objets fonction dans un dict. Notez qu'il n'y a pas de () après les noms des fonctions, car nous voulons stocker l'objet fonction et ne pas encore l'appeler:
Troisième et dernière étape, implémentez une fonction de conversion. L'instruction if vérifie si les deux systèmes sont identiques. Ensuite, nous obtenons la bonne fonction de notre dict et l'appelons:
la source
Cela se fait par des instructions switch-case dans la plupart des autres langues. En python, j'utilise une fonction simple avec un dictionnaire d'expression.
Code:
Production:
la source
En général, je courrais avec une solution de dictionnaire pour une tâche imbriquée. Certains cas particuliers peuvent amener à une autre approche. Comme celui-ci:
la source
Que diriez-vous de quelque chose comme:
la source
Une idée utilise une liste et obtient un index des résultats, c'est-à-dire.
la source
Comme l'a dit @Sadap,
Si vous implémentez la conversion de base pour les entiers, vous allez probablement par une représentation commune de toute façon:
int
. Une fonction distincte pour chaque paire de bases n'est pas nécessaire, et les deux bases impliquées n'ont même pas besoin de se connaître.Contribution
Créez un mappage à partir du nom d'un système numérique vers sa base:
vous permettant de lire les entrées avec
int(text, BASES[numeral_sys_1])
.Production
Créez un mappage à partir du nom d'un système numérique vers un spécificateur de format :
vous permettant d'écrire des sorties avec
format(n, FORMATTERS[numeral_sys_2])
.Exemple d'utilisation
L'un ou l'autre dict peut également être rendu plus général en rendant les fonctions de valeurs à la place, si vous avez besoin de prendre en charge un ensemble de formats différent de
int(x, base)
, ou davantage de bases de sortie que les formats de nombres entiers pris en charge.la source
J'aime garder le code au sec:
la source
En utilisant certaines techniques fournies par les autres réponses et en les combinant:
la source
Bien que vous ne sachiez pas si cette approche est plus rapide, mais pourrait également être effectuée à l'aide de numpy:
et peut être utilisé comme:
la source