Program do zamiany temperatury

0

Siema uczę sie dopiero programowania w pythonie i zrobiłem sam prosty program do zamiany stopni. Chciałem się zapytać czy jest napisane to w miare czytelnie albo czy można jeszcze jakoś skrócić kod

def number1():
    temp = input("Podaj temperature: ")
    obl1 = float(temp) * 9 / 5 + 32
    print(round(obl1,2), 'F')

def number2():
    temp = input("Podaj temperature: ")
    obl2 = (float(temp) - 32) * 5 / 9
    print(round(obl2,2), 'C')

print("Wybierz:\n"
      "1. Z Celcjuszy na Farenhaita\n"
      "2. Z Farenhaita na Celcjusze")

choice = input("Wybierz numer: ")

if choice == str(1):
    number1()
elif choice == str(2):
    number2()
else:
    print("Niepoprawny numer")

2
  • str(1) i str(2) - niepotrzebna konwersja, lepiej od razu '1', '2'
  • nazwy funkcji number1 i number2 nic nie mówią o tym co robią
  • obie funkcje robią prawie to samo, za wyjątkiem samych obliczeń, więc dla samych obliczeń dałbym osobne dwie funkcję, i utworzył trzecią wspólną, która pyta o temperaturę, odpala odpowiednią funkcję obliczeniową w zależności od parametru i wypisuje wynik
  • celSjusza
0

Nie wiem na ile sama idea i kod będą zrozumiałe dla kogoś kto zaczyna, ale pisząc taki programik szedłbym w taką stronę by móc łatwo dodać nowe konwersje temperatur. Wyciągnąłbym wszystko co opisuje konwersje do jakiejś struktury i oparłbym o to działanie programu.


# opis konwersji 

def CtoF(temp):
    return float(temp) * 9 / 5 + 32
    
def FtoC(temp):
    return (float(temp) - 32) * 5 / 9
    
konwersje = {
    '1': {
        'opis': 'Z Celsjuszy na Fahrenheita',
        'funkcja': CtoF,
        'jednostka': 'F'
    },
    '2': {
        'opis': 'Z Fahrenheita na Celsjusze',
        'funkcja': FtoC,
        'jednostka': 'C'
    },
}

# działanie programu

def wykonaj_konwersje(konwersja):
    temp = input("Podaj temperature: ")
    wynik = konwersja['funkcja'](temp)
    print(round(wynik, 2), konwersja['jednostka'])

print("Wybierz:")
for nr, konwersja in konwersje.items():
    print(nr + '.', konwersja['opis'])

choice = input("Wybierz numer: ")

if choice in konwersje:
    wykonaj_konwersje(konwersje[choice])
else:
    print("Niepoprawny numer")

Jeśli niczego nie schrzaniłem, to by dodać nową opcję w menu z kolejną konwersją, wystarczy dodać funkcję obliczeniową dla niej i wpis w słowniku "konwersje", a cały pozostały kod będzie z tym działać.

0

dodaj shabang w pierwszej linii:

#!/usr/bin/env python3

i zmień plik na uruchamialny chmod +x tempconv.py jeżeli piszesz w linux lub macos.

Twój program ma jedną zasadniczą wadę: nie jest w stanie współpracować z innymi programami w terminalu, czyli niezgodnie z filozofią unix-ów. Lepiej by było wprowadzać temperaturę i typ konwersji jako parametry programu, wtedy można by go użyć w przetwarzaniu potokowym:

$ ./temp.py --ctof 100
$ seq 10 | xargs -I{} ./temp.py --ctof {}

Powinieneś sprawdzać czy standardowe wejście jest terminalem sys.stdin.isatty(). Jeżeli True to znaczy że mamy tryb interaktywny i możemy drukować menu, w przeciwnym wypadku czytać linia po linii, robić konwersję i drukować na wyjście. Taki program łatwo sprzęgać z innymi i staje się przez to bardziej użyteczny.

seq 10 | ./temp.py --ctof

Możesz też sprawdzać czy stdout jest terminalem, wtedy przy użyciu odpowiednich kodów wyjścia mógłbyś kolorować wynik.

Na koniec odpowiednio sformatować kod zgodnie z PEP8 przy użyciu black (python3 -m pip install black):

$ black temp.py

1 użytkowników online, w tym zalogowanych: 0, gości: 1