Python - Filtro di input, calcolo con una quantità variabile di input
Ho lavorato su un calcolatore di aerodinamica utilizzando Python (in cui sono relativamente nuovo), In questo programma, un valore può essere calcolato in base a più input diversi, ad es. a calcola b, b calcola c, o c può trovare be b può trovare a .
Per elaborare la funzione di questo programma, eseguirà un ciclo attraverso la sua logica finché non avrà trovato tutte le cose che potrebbe con gli input forniti. Il codice è piuttosto lungo per la sua funzione ed è per questo che mi piacerebbe vedere se potrebbe essere ottimizzato o se potrei fare qualcosa di meglio. Per il metodo di input, l'input è una stringa. Il codice è il seguente:
def Find_Pressure(temp):
pressure = (101.29 * (((temp + 273.1) / 288.08) ** 5.256))
return pressure
def Find_Temp_Alt(alt, ground_temp):
Temp = ground_temp - (0.00649 * alt)
return Temp
def Find_Density(pressure, temp):
density = (pressure / (0.2869 * (temp + 273.1)))
return density
def Find_Alt_Temp(temp, ground_temp):
Alt = ((ground_temp - temp) / 0.00649)
return Alt
def is_Valid(x):
try:
float(x)
return True
except ValueError:
return False
def Parser(ground_temp, temp, alt, pressure, density):
a = t = p = d = False
run = True
Alt = Temp = Pressure = Density = "N/A"
if is_Valid(alt):
Alt = float(alt)
a = True
if is_Valid(temp):
Temp = float(temp)
if Temp <= -273.1:
t = False
else:
t = True
if is_Valid(pressure):
Pressure = float(pressure)
p = True
if is_Valid(density):
Density = float(density)
d = True
if not is_Valid(ground_temp):
print('Enter Ground Temp')
else:
G_T = float(ground_temp)
while run:
run = False
if a and not t:
Temp = Find_Temp_Alt(Alt, G_T)
t = True
run = True
if t and not a:
Alt = Find_Alt_Temp(Temp, G_T)
a = True
run = True
if p and not t:
Temp = ((288.08 * ((Pressure / 101.29) ** (1 / 5.256))) - 273.1)
t = True
run = True
if t and not p:
Pressure = Find_Pressure(Temp)
p = True
run = True
if (p and t) and not d:
Density = Find_Density(Pressure, Temp)
d = True
run = True
if (d and t) and not p:
Pressure = (Density * 0.2869 * (Temp + 273.1))
p = True
run = True
if (d and p) and not t:
Temp = ((Pressure / Density * 0.2869) - 273.1)
t = True
run = True
return Alt, Temp, Pressure, Density
Dichiaro qualsiasi aiuto / feedback, grazie in anticipo!
Risposte
Benvenuto in Code Review! Aggiungerò ciò che @Linny ha già detto sui suggerimenti sul tipo e sulla denominazione delle variabili. La denominazione delle variabili fa parte delle linee guida PEP-8 di python (vedi in basso).
Numeri magici
Hai molti numeri magici nel tuo codice, che in realtà sono costanti di conversione, ma non appaiono senza tale spiegazione.
Nomi variabili
Dato che stai scrivendo un calcolatore di aerodinamica, sarebbe utile usare nomi completi per varie variabili nel tuo codice. Per es. altitudeinvece di alt, temperatureinvece di solo temp( tempè generalmente usato come variabile temporanea nel codice).
Temperatura del suolo
Sulla base del flusso del programma, presumo che ground_temperaturesia essenziale per qualsiasi calcolo. Forse verificalo all'inizio e interrompi prima in caso di controlli non validi.
Argomenti opzionali
Da quanto sopra, ground_temperatureè necessario solo chiamare la calcolatrice. Tutto il resto è opzionale e può essere calcolato. Forse una funzione che imposta per impostazione predefinita altri valori Nonepotrebbe adattarsi meglio a te:
def aerodynamic_calculator(
ground_temperature: float,
temperature: float = None,
altitude: float = None,
pressure: float = None,
density: float = None,
):
Booleani per ogni parametro
Con l'approccio sopra, puoi semplicemente convalidare il valore stesso, senza dover tenere traccia di un booleano per quei valori.
if temperature and not altitude:
altitude = compute_altitude_from_temperature(temperature, ground_temperature)
PEP-8
In python, è comune (e consigliato) seguire la guida di stile PEP-8 per scrivere codice pulito, gestibile e coerente.
Le funzioni e le variabili dovrebbero essere denominate in a lower_snake_case, classi come UpperCamelCasee costanti come UPPER_SNAKE_CASE.
Solo un paio di note sullo stile
- I nomi delle variabili e delle funzioni dovrebbero essere in formato
snake_case - È necessario aggiungere suggerimenti sul tipo per visualizzare i tipi di parametri accettati e i valori restituiti dalle funzioni.
def find_pressure(temp: float) -> float:
return (101.29 * (((temp + 273.1) / 288.08) ** 5.256))
def find_temp_alt(alt: float, ground_temp: float) -> float:
return ground_temp - (0.00649 * alt)
def find_density(pressure: float, temp: float) -> float:
return (pressure / (0.2869 * (temp + 273.1)))
def Find_Alt_Temp(temp: float, ground_temp: float) -> float:
return ((ground_temp - temp) / 0.00649)
def is_valid(x: str) -> bool:
try:
float(x)
return True
except ValueError:
return False
Non è necessario creare una variabile per un calcolo per restituire quel calcolo. Restituisci l'espressione stessa.