Gibt es eine pythonischere Möglichkeit, verschachtelte if else-Anweisungen als diese auszuführen:
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
Dieses Skript ist Teil eines einfachen Konverters.
python
if-statement
Module_art
quelle
quelle
and
Bedingungen für die if-else-Anweisungen der obersten Ebene verschieben. Zumindest wäre es so besser lesbar. Leider hat Python keine switch-Anweisungen.Antworten:
Während die Antworten von @Aryerez und @ SencerH. funktionieren, muss jeder mögliche Wert von
numeral_sys_1
wiederholt für jeden möglichen Wert vonnumeral_sys_2
bei der Auflistung der Wertepaare geschrieben werden, was es schwieriger macht, die Datenstruktur beizubehalten, wenn die Anzahl der möglichen Werte zunimmt. Sie können stattdessen ein verschachteltes Diktat anstelle Ihrer verschachtelten if-Anweisungen verwenden:Alternativ können Sie die Wertepaare für das Mapping mit der
itertools.permutations
Methode generieren , deren Reihenfolge der der Eingabesequenz folgt:quelle
Fügen Sie alle gültigen Kombinationen in a
dictionary
vontuple
s ein. Wenn die Kombination nicht vorhanden ist, geben Sie 0 zurück:Wenn Sie die Funktion in einer Schleife verwenden möchten, ist es möglicherweise besser, das Wörterbuch außerhalb der Funktion zu definieren, damit es nicht bei jedem Aufruf der Funktion neu erstellt wird.
quelle
except KeyError:
.get()
verwenden .0
try
try:... except:...
Struktur.Wenn Sie sicher sind, dass kein anderer Wert auf die Variablen numeral_sys_1 und numeral_sys_2 festgelegt wurde, ist dies die einfachste und sauberste Lösung.
Andererseits müssen Sie das Wörterbuch mit seinen Kombinationen mit verfügbaren Werten erweitern, wenn Sie einen anderen Wert als "Hexadezimal", "Dezimal" und "Binär" haben.
Die Logik hier ist; Wenn variable Tupel in Wörterbuchschlüsseln nicht dem angegebenen variablen Tupel entsprechen, gibt die Methode .get () "0" zurück. Wenn ein variables Tupel mit einem beliebigen Schlüssel im Wörterbuch übereinstimmt, wird der Wert des übereinstimmenden Schlüssels zurückgegeben.
Es könnte auch die Verwendung eines Generators eine Lösung sein. Sieht viel schlauer aus, aber ich denke, ein hartcodiertes Wörterbuch wäre schneller als die Verwendung eines Generators für diese einfache Anforderung.
quelle
Eine alternative Möglichkeit, verschachtelte Listen zu verwenden. Ich hoffe es hilft!!
quelle
Meiner Meinung nach ist diese
convert_what
Funktion selbst nicht sehr pythonisch. Ich denke, der Code, der diesen Code aufruft, hat auch eine Reihe von if-Anweisungen und konvertiert abhängig vom Rückgabewert vonconvert_what()
. Ich schlage so etwas vor:Machen Sie im ersten Schritt eine Funktion für jede Kombination:
Im zweiten Schritt setzen Sie die Funktionsobjekte in ein Diktat. Beachten Sie, dass nach den Funktionsnamen kein () steht, da das Funktionsobjekt gespeichert und noch nicht aufgerufen werden soll:
Im dritten und letzten Schritt implementieren Sie eine Konvertierungsfunktion. Die if-Anweisung prüft, ob beide Systeme identisch sind. Dann bekommen wir die richtige Funktion aus unserem Diktat und nennen es:
quelle
Dies erfolgt durch switch-case-Anweisungen in den meisten anderen Sprachen. In Python verwende ich eine einfache Funktion mit einem Ausdruckswörterbuch.
Code:
Ausgabe:
quelle
Im Allgemeinen würde ich mit Wörterbuchlösung für verschachtelte if-Aufgabe ausführen. Einige besondere Fälle können zu einem anderen Ansatz führen. Wie dieser:
quelle
Wie wäre es mit so etwas wie:
quelle
Eine Idee verwendet eine Liste und erhält einen Index des Ergebnisses, dh.
quelle
Wie @Sadap sagte,
Wenn Sie die Basiskonvertierung für Ganzzahlen implementieren, werden Sie wahrscheinlich trotzdem eine allgemeine Darstellung durchlaufen :
int
. Eine separate Funktion für jedes Basenpaar ist nicht erforderlich, und die beiden beteiligten Basen müssen nicht einmal voneinander wissen.Eingang
Erstellen Sie eine Zuordnung vom Namen eines Zahlensystems zu seiner Basis:
So können Sie Eingaben mit lesen
int(text, BASES[numeral_sys_1])
.Ausgabe
Erstellen Sie eine Zuordnung vom Namen eines Zahlensystems zu einem Formatbezeichner :
So können Sie Ausgaben mit schreiben
format(n, FORMATTERS[numeral_sys_2])
.Beispiel Verwendung
Jedes Diktat kann auch allgemeiner gestaltet werden, indem stattdessen die Wertefunktionen verwendet werden, wenn Sie einen anderen Satz von Formaten als
int(x, base)
oder mehr Ausgabebasen als die integrierte Ganzzahlformatierung unterstützen müssen.quelle
Ich mag es, Code trocken zu halten:
quelle
Verwenden Sie einige Techniken, die die anderen Antworten bieten, und kombinieren Sie sie:
quelle
Ich bin mir zwar nicht sicher, ob dieser Ansatz schneller ist, könnte aber auch mit numpy durchgeführt werden:
und kann verwendet werden als:
quelle