Czy istnieje bardziej pythonowy sposób wykonywania zagnieżdżonych instrukcji if if else niż ten:
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
Ten skrypt jest częścią prostego konwertera.
python
if-statement
Moduł_art
źródło
źródło
and
warunków dla instrukcji najwyższego poziomu if-else. W ten sposób byłoby co najmniej bardziej czytelne. Niestety, python nie ma instrukcji switch.Odpowiedzi:
Podczas gdy odpowiedzi @Aryerez i @ SencerH. Działają, każda możliwa wartość
numeral_sys_1
musi być wielokrotnie zapisywana dla każdej możliwej wartościnumeral_sys_2
przy zestawianiu par wartości, co utrudnia utrzymanie struktury danych, gdy rośnie liczba możliwych wartości. Zamiast tego możesz użyć zagnieżdżonego słownika zamiast zagnieżdżonego, jeśli instrukcje:Alternatywnie możesz wygenerować pary wartości dla mapowania za pomocą
itertools.permutations
metody, której kolejność jest zgodna z kolejnością wejściową:źródło
Włóż wszystkie poprawne kombinacje
dictionary
odtuple
s, a jeżeli połączenie nie istnieje, zwraca 0:Jeśli planujesz używać funkcji w pętli, lepszym pomysłem może być zdefiniowanie słownika poza funkcją, aby nie była odtwarzana przy każdym wywołaniu funkcji.
źródło
except KeyError:
.get()
metody dict z0
domyślną zamiasttry
instrukcji.try:... except:...
struktura.Jeśli masz pewność, że nie ma innej wartości, którą można ustawić na zmienną numeral_sys_1 i zmienne numeral_sys_2, jest to najprostsze i najczystsze rozwiązanie.
Z drugiej strony, musisz rozszerzyć słownik o jego kombinacje o dostępne wartości, jeśli masz inną wartość niż „Szesnastkowy”, „Dziesiętny” i „Binarny”
Oto logika; jeśli krotki zmienne w kluczach słownika nie są równe danej krotce zmiennej, metoda .get () zwraca „0”. Jeśli dana zmienna krotka pasuje do dowolnego klucza w słowniku, zwraca wartość pasującego klucza.
Istnieje również użycie generatora może być rozwiązaniem. Wygląda o wiele mądrzej, ale myślę, że słownik z kodowaniem na sztywno byłby szybszy niż użycie generatora do tego prostego wymagania.
źródło
Alternatywny sposób przy użyciu listy zagnieżdżonej. Mam nadzieję, że to pomoże!!
źródło
Moim zdaniem ta
convert_what
funkcja sama w sobie nie jest bardzo pytoniczna. Domyślam się, że kod, który wywołuje ten kod, ma również kilka instrukcji if i konwertuje w zależności od zwracanej wartościconvert_what()
. Sugeruję coś takiego:Pierwszy krok, wykonaj jedną funkcję dla każdej kombinacji:
Drugi krok, umieść obiekty funkcyjne w dyktando. Zauważ, że po nazwach funkcji nie ma znaku (), ponieważ chcemy zapisać obiekt funkcji i nie wywoływać go jeszcze:
Trzeci i ostatni krok, zaimplementuj funkcję konwersji. Instrukcja if sprawdza, czy oba systemy są takie same. Następnie otrzymujemy właściwą funkcję z naszego słownika i nazywamy ją:
źródło
Odbywa się to za pomocą instrukcji przełączania wielkości liter w większości innych języków. W Pythonie używam prostej funkcji ze słownikiem wyrażeń.
Kod:
Wynik:
źródło
Ogólnie działałbym z rozwiązaniem słownikowym dla zagnieżdżonego, jeśli zadanie. Niektóre szczególne przypadki mogą przynieść inne podejście. Jak ten:
źródło
Co powiesz na coś takiego:
źródło
Pomysł korzysta z listy i uzyskuje indeks wyników, tj.
źródło
Jak powiedział @Sadap,
Jeśli realizacji konwersji bazowy dla liczb całkowitych, jesteś prawdopodobnie przeżywa wspólnej reprezentacji i tak:
int
. Oddzielna funkcja dla każdej pary baz nie jest konieczna, a dwie zaangażowane bazy nie muszą nawet wiedzieć o sobie.Wejście
Utwórz odwzorowanie z nazwy systemu liczbowego na jego podstawę:
pozwalając na odczyt danych wejściowych za pomocą
int(text, BASES[numeral_sys_1])
.Wynik
Utwórz odwzorowanie z nazwy systemu liczbowego na specyfikator formatu :
umożliwiając pisanie wyników za pomocą
format(n, FORMATTERS[numeral_sys_2])
.Przykładowe użycie
Każdy dykt można również uogólnić, wprowadzając funkcje wartości zamiast tego, jeśli trzeba obsługiwać inny zestaw formatów
int(x, base)
lub więcej baz wyjściowych niż obsługa wbudowanego formatowania liczb całkowitych.źródło
Lubię dbać o to, aby kod był suchy:
źródło
Używając niektórych technik, które zapewniają inne odpowiedzi i łącz je:
źródło
Chociaż nie jestem pewien, czy to podejście jest szybsze, ale można to zrobić również za pomocą numpy:
i może być używany jako:
źródło