Problema con le funzioni in Python

di Anonimizzato20115 il
3 risposte
Salve a tutti. Ho cominciato a studiare Python da pochissimo (sono in 4° superiore), quindi per esercitarmi ho cominciato a fare qualche programmino semplice per fare pratica. Il problema è che il programma che sto facendo non fa ciò che vorrei, o meglio, non riesco a far fare al programma ciò che vorrei da lui.

Questo è il programma in Python 3.5.1:
import math
def circonferenzacerchio(n):
    circonferenza=math.pi*(n**2)
    print (circonferenza)
    if circonferenza>50:
        diminuiscicerchio(n)
    return math.pi*n**2
def diminuiscicerchio(n):
    print ("Il cerchio è troppo grande, devi reinserire il raggio!")
    n=eval(input("Inserisci il raggio: "))
    circonferenzacerchio(n)
n=eval(input("Inserisci il raggio: "))
circonferenza=circonferenzacerchio(n)
print ("La circonferenza vale: ",circonferenza)
Questo è l'output:

Inserisci il raggio: 4
50.26548245743669
Il cerchio è troppo grande, devi reinserire il raggio!
Inserisci il raggio: 3
28.274333882308138
La circonferenza vale: 50.26548245743669

Il problema è che il valore che la funzione "circonferenzacerchio" restituisce al main è sempre la circonferenza del primo raggio inserito. Non capisco perché. Sicuramente è qualcosa di banale, ma non riesco proprio a capire.
Inoltre, potreste dirmi come stampare a video un numero float scegliendo quante cifre decimali visualizzare?
Grazie.

3 Risposte

  • Nel tuo programma c'è una sorta di mutua ricorsione (tra le due funzioni circonferenzacerchio() e diminuiscicerchio()) che non funziona: il valore di n che leggi nella funzione "diminuiscicerchio()" è locale alla funzione stessa e non viene restuito al chiamante. E' vero che subito dopo richiami la funzione circonferenzacerchio() col valore aggiornato, ma poiché il flusso della chiamata alla funzione precedente non si è interrotto il risultato finale è quello che si ottiene col primo input di n.

    Ti suggerisco di semplificare il tutto:
    
    import math
    
    def circonferenzacerchio(n):
        circonferenza = math.pi*(n**2)
        print(circonferenza)
        while circonferenza > 50:
            n = diminuiscicerchio()
            circonferenza = math.pi*(n**2)
            print(circonferenza)
        return circonferenza
    
    def diminuiscicerchio():
        print("Il cerchio è troppo grande, devi reinserire il raggio!")
        return eval(input("Inserisci il raggio: "))
    
    n = eval(input("Inserisci il raggio: "))
    circonferenza = circonferenzacerchio(n)
    print(circonferenza)
    
  • Grazie per l'aiuto
  • Ti consiglio di evitare l'utilizzo della funzione "eval" su quanto viene letto dall'utente, perché in questo modo permetti all'utente di eseguire del codice python che poi verrà eseguito.

    Giusto per farti un esempio, considera il seguente programma:
    
    print(eval(input()))
    
    Ora, se l'utente inserisce un numero non succede niente di particolarmente interessante, ma se ad esempio provi ad inserire la stringa __import__("os").listdir('.') potrai vedere in output il contenuto della directory corrente.

    Il modo migliore per leggere un intero, quindi, è il seguente:
    
    n = int(input("..."))
    
Devi accedere o registrarti per scrivere nel forum
3 risposte