Python - Filtro di input, calcolo con una quantità variabile di input

Oct 09 2020

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

4 hjpotter92 Oct 09 2020 at 13:52

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.

2 Linny Oct 09 2020 at 10:56

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.