Problema con le funzioni in Python

di il
3 risposte

Problema con le funzioni in Python

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

  • Re: Problema con le funzioni in Python

    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)
    
  • Re: Problema con le funzioni in Python

    Grazie per l'aiuto
  • Re: Problema con le funzioni in Python

    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