Risolto Aiuto script in Python

ItsReal

Utente Electrum
30 Dicembre 2014
114
30
9
104
Ciao a tutti, mi sto esercitando in Python, (sono alle prime armi) e vorrei a creare un programmino che mi calcoli la velocità di taglio per un tornio.
Io ho provato a mettere giù un codice ma non trovo il modo per completarlo.
Avete idee per migliorarlo facendolo il più efficiente possibile? Grazie, almeno ho il modo di capire come impostare un codice decentemente :)

Python:
# programmino per calcolare la velocità di taglio

from sys import exit

def main():
    while True:
        diametro = input("Inserisci diametro pezzo: ")
        if diametro.isdigit() and diametro >= '1':
            giri()
        else:
            print("Valore non valido!")

def giri():
    while True:
        giri = input("Inserisci numero di giri: ")
        if giri.isdigit() and giri >= '1':
            velocità_di_taglio()
        else:
            print("Valore non valido!")

def velocità_di_taglio(diametro, giri):
    return (3.14 * float(diametro) * float(giri)) / 1000

main()
 
Ultima modifica:
Ciao, secondo me puoi fare tre cose per rendere il codice migliore:
1) Inserire un'opzione per permettere all'utente di terminare il programma, altrimenti il loop va avanti all'infinito.
2) Per fare la convalida sia dei giri che del diametro ti conviene impostare un if che faccia un controllo numerico e non sulla stringa '1', come fai tu. Per risolvere basta fare così:
Python:
diametro = int(input("Inserire il diametro del pezzo da tagliare:"))

#adesso il diametro è un intero

if (diametro >= 1):
    #fai le operazioni necessarie

3) Ho notato che hai importato una libreria, ma non l'hai mai usata. Forse volevi usare la funzione exit() per terminare l'esecuzione del programma, ma non va bene. Non si usa per quello scopo. Si può risolvere con un break.
Considera anche di inserire un try-catch, se adotterai la soluzione che ti ho detto, per gestire il caso in cui l'utente inserisca una stringa al posto di un numero, per evitare il crash del programma.
 
Ciao, secondo me puoi fare tre cose per rendere il codice migliore:
1) Inserire un'opzione per permettere all'utente di terminare il programma, altrimenti il loop va avanti all'infinito.
2) Per fare la convalida sia dei giri che del diametro ti conviene impostare un if che faccia un controllo numerico e non sulla stringa '1', come fai tu. Per risolvere basta fare così:
Python:
diametro = int(input("Inserire il diametro del pezzo da tagliare:"))

#adesso il diametro è un intero

if (diametro >= 1):
    #fai le operazioni necessarie

3) Ho notato che hai importato una libreria, ma non l'hai mai usata. Forse volevi usare la funzione exit() per terminare l'esecuzione del programma, ma non va bene. Non si usa per quello scopo. Si può risolvere con un break.
Considera anche di inserire un try-catch, se adotterai la soluzione che ti ho detto, per gestire il caso in cui l'utente inserisca una stringa al posto di un numero, per evitare il crash del programma.
Ho riprovato a modificare il codice come segue, l'unico problema è che la funzione non mi restituisce il valore.
Il try-catch come posso integrarlo? Grazie
Python:
# programmino per calcolare la velocità di taglio

import math

def velocità_di_taglio(diametro, giri):
    formula = (math.pi * float(diametro) * float(giri)) / 1000
    return formula

loop = 1  # loop diametro

while loop == 1:
    if loop == 1:
        diametro = int(input("Inserisci il diametro del pezzo: "))

        if (diametro >= 1):
            loop = 2
        else:
            print("Valore errato.")

    else:
        print("Valore errato.")

loop = 2  # loop giri

while loop == 2:
    if loop == 2:
        giri = int(input("Inserisci il numero dei giri: "))

        if (giri >= 1):
            velocità_di_taglio(diametro, giri)
            break
        else:
            print("Valore errato.")

    else:
        print("Valore errato.")
 
Ultima modifica:
Il problema è che non dai dei valori di ritorno alla funzioni, per questo non ti calcola niente. Devi fare qualcosa del genere:
Python:
import math

def main():
    diametro = leggiDiametro()
    giri = leggiGiri()
    velocita = calcolaVelocita(diametro, giri)
    print(velocita)

def leggiDiametro():
    diametro = int(input("Inserire diametro:"))
    while (diametro < 1):
        print("Valore errato.")
        diametro = int(input("Inserire diametro:"))
    return diametro

def leggiGiri():
    giri = int(input("Inserire giri:"))
    while (giri < 1):
        print("Valore errato.")
        giri = int(input("Inserire giri:"))
    return giri

def calcolaVelocita(diametro, giri):
    return (math.pi * float(diametro) * float(giri)) / 1000

main()

Nella prima soluzione che hai dato passavi da una funzione all'altra senza ritornare alcun valore, perciò il programma arrivato al punto di calcolare la velocità si trovava senza valori e crashava. Così funziona invece. Devi creare una funzione per ogni task da svolgere, questo è corretto, ma devi anche assicurarti che se una funzione ha bisogno di certi parametri per lavorare allora li deve ricevere. In generale, se hai bisogno di un valore che non ti serve subito, ma che riutilizzerai in seguito devi mettere nella funzione il return di quel valore.
 
Il problema è che non dai dei valori di ritorno alla funzioni, per questo non ti calcola niente. Devi fare qualcosa del genere:
Python:
import math

def main():
    diametro = leggiDiametro()
    giri = leggiGiri()
    velocita = calcolaVelocita(diametro, giri)
    print(velocita)

def leggiDiametro():
    diametro = int(input("Inserire diametro:"))
    while (diametro < 1):
        print("Valore errato.")
        diametro = int(input("Inserire diametro:"))
    return diametro

def leggiGiri():
    giri = int(input("Inserire giri:"))
    while (giri < 1):
        print("Valore errato.")
        giri = int(input("Inserire giri:"))
    return giri

def calcolaVelocita(diametro, giri):
    return (math.pi * float(diametro) * float(giri)) / 1000

main()
Praticamente è la stessa cosa che ho fatto ma al posto che ritornare il valore della velocità con return lo ritorni con print.

Python:
def velocità_di_taglio(diametro, giri):
    formula = (math.pi * float(diametro) * float(giri)) / 1000
    print(f"Velocità di taglio: {formula}")

La cosa che non riesco a capire è il perchè con print restituisce il valore ma con retrun no.
 
Praticamente è la stessa cosa che ho fatto ma al posto che ritornare il valore della velocità con return lo ritorni con print.

Python:
def velocità_di_taglio(diametro, giri):
    formula = (math.pi * float(diametro) * float(giri)) / 1000
    print(f"Velocità di taglio: {formula}")

La cosa che non riesco a capire è il perchè con print restituisce il valore ma con retrun no.
Sono istruzioni diverse: la funzione print() si usa per la stampa dei risultati a schermo, mentre return si utilizza per restituire un valore che verrà utilizzato in seguito (per esempio per salvarlo in una variabile), ma non lo stampa a schermo. Se voglio la stampa a schermo utilizzo print(), se non mi serve la stampa a schermo di quel valore utilizzo return, ma solo se quel valore mi serve in seguito. Fammi sapere se adesso è chiaro. ;)
 
Sono istruzioni diverse: la funzione print() si usa per la stampa dei risultati a schermo, mentre return si utilizza per restituire un valore che verrà utilizzato in seguito (per esempio per salvarlo in una variabile), ma non lo stampa a schermo. Se voglio la stampa a schermo utilizzo print(), se non mi serve la stampa a schermo di quel valore utilizzo return, ma solo se quel valore mi serve in seguito. Fammi sapere se adesso è chiaro. ;)
Okay è chiaro, grazie mille!
 
  • Mi piace
Reazioni: --- Ra ---
Ah poi volevo dirti un'altra cosa...nella seconda soluzione, oltre al fatto che è sbagliata, ho visto che nei while metti degli if per controllare la stessa condizione: non ha senso perché la condizione viene verificata già nel while. Forse volevi usare una variabile bandiera, ma non si utilizza in quel modo.
 
Ah poi volevo dirti un'altra cosa...nella seconda soluzione, oltre al fatto che è sbagliata, ho visto che nei while metti degli if per controllare la stessa condizione: non ha senso perché la condizione viene verificata già nel while. Forse volevi usare una variabile bandiera, ma non si utilizza in quel modo.
In realtà ho fatto in questo modo perchè avevo visto uno script per un gioco fatto così, quindi ho voluto prendere l'idea