[Risolto] Python 3: problema con variabili

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
Sargonsei
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2505
Iscrizione: domenica 17 febbraio 2008, 13:56

[Risolto] Python 3: problema con variabili

Messaggio da Sargonsei »

Salve a tutti.
Volendo creare uno script in Python 3 per trovare tutti i quadrati perfetti che sono somma di quadrati perfetti
(Es. 3^2+4^2 = 25 = 5^2)
ho creato uno script col contenuto seguente

Codice: Seleziona tutto

# Python3 - Script per verificare se [somma di quadrati perfetti = quadrato perfetto]
# Calcola tutte le coppie di numeri naturali positivi
# compresi fra i due numeri naturali positivi dati
# per i quali la somma dei quadrati di ciascun numero naturale positivo
# è pari al quadrato di un terzo numero, anch'esso naturale e positivo.
#
#
# Per avviare questo script:
# 1) Salvarlo nella cartella di lavoro, con nome 000-sommaQuadrati.py (Estensioni alternative: .pyw .pyc .pyo .pyd )
# 2) Aprire un terminale nella cartella di lavoro 
# 3) Impartire il comando: [python3 <000-sommaQuadrati.py>]
#
def DATI(X, Y):    # Inizio definizione funzione DATI()
    XX = int(input(X))  # Acquisisce il primo numero intero e lo mette in una variabile
    YY = int(input(Y))  # Acquisisce il secondo numero intero e lo mette in una variabile
    return(XX, YY) # Restituisce i valori contenuti nelle due variabili
def SOMMA(ADD1, ADD2): # Inizio definizione funzione SOMMA()
    SUM = ADD1 + ADD2  # Calcola la somma dei 2 numeri
    SUM1 = "\nLa somma fra l'addendo " + str(ADD1) + " e l'addendo " + str(ADD2) + " vale " +str(SUM)
    SUM1 = "(" + str(ADD1) + " + " + str(ADD2) + ")= " + str(SUM) + SUM1
    return(SUM1)
def POTENZA(BASE, EXP): # Inizio definizione funzione POTENZA()
    POT = BASE ** EXP   # Calcola la potenza della BASE
    return(POT)
def RADICE(RADICANDO, INDICE):        # Inizio definizione funzione RADICE()
    RADICE1 = RADICANDO ** (1/INDICE)  # Calcola la radice del RADICANDO
    return(RADICE1)
MENU = """Menù:
0) Chiudere questo script.
1) Somma di quadrati perfetti = Quadrato perfetto
"""
while True:
    print(MENU)
    SCELTA = input("Per scegliere, inserire il numero corrispondente. ")
    if SCELTA == "0":
        print("Hai digitato la scelta 0, quindi questo script si ferma.")
        break # Interrompe il ciclo 'while'
    elif SCELTA == "1":
        print("Hai digitato la scelta 1, [Somma di quadrati perfetti = Quadrato perfetto].")
        X1 = "Limite inferiore ? "; Y1 = "Limite superiore ? "
        X02, Y02 = DATI(X1, Y1)     # Chiama la funzione DATI() previo trasferimento del contenuto delle variabili X1 e Y1.

        for X2 in range(X02, Y02, 1): # Inizio del ciclo che verrà ripetuto varie volte, da X02 a Y02 incrementando 1.
            for Y2 in range(X02, Y02, 1): # Inizio del ciclo che verrà ripetuto varie volte, da X02 a Y02 incrementando 1.
                X3 = POTENZA(X2, 2) # Chiama la funzione POTENZA() previo trasferimento del contenuto della variabile X2 e del numero 2.
                Y3 = POTENZA(Y2, 2) # Chiama la funzione POTENZA() previo trasferimento del contenuto della variabile Y2 e del numero 2.
                Z3 = SOMMA(X3, Y3) # Chiama la funzione SOMMA() previo trasferimento del contenuto delle variabili X3 e Y3.
                Z2 = RADICE(Z3, 2) # Chiama la funzione RADICE() previo trasferimento del contenuto della variabile Z3 e del numero 2.
                if print(Z2.is_integer()):
                    print(X2,"^2 +",Y2,"^2 =",Z3," =",Z2,"^2")
                # Fine [if]
            # Fine ciclo [for Y2]
        # Fine ciclo [for X2]

    else:
        print("La scelta " + SCELTA + " non è una scelta valida")
        continue # Ricomincia il ciclo 'while'
    # Fine del ciclo 'if', 'elif', 'else'
    input("Per poter proseguire, premere il tasto [Invio]")
# Fine del ciclo 'while'
ma all'avvio ottengo questo risultato:

Codice: Seleziona tutto

$ python3 000-sommaQuadrati.py
Menù:
0) Chiudere questo script.
1) Somma di quadrati perfetti = Quadrato perfetto

Per scegliere, inserire il numero corrispondente. 1
Hai digitato la scelta 1, [Somma di quadrati perfetti = Quadrato perfetto].
Limite inferiore ? 1
Limite superiore ? 10
Traceback (most recent call last):
  File "/mnt/Dati1/Guide/Guida-Python3/000-sommaQuadrati.py", line 49, in <module>
    Z2 = RADICE(Z3, 2) # Chiama la funzione RADICE() previo trasferimento del contenuto della variabile Z3 e del numero 2.
         ^^^^^^^^^^^^^
  File "/mnt/Dati1/Guide/Guida-Python3/000-sommaQuadrati.py", line 27, in RADICE
    RADICE1 = RADICANDO ** (1/INDICE)  # Calcola la radice del RADICANDO
              ~~~~~~~~~~^^~~~~~~~~~~~
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'float'
$
Ho capito che è un problema di tipizzazione di variabili, ma non ho capito come scriverlo correttamente.
Qualcuno può aiutarmi?
Ringrazio sin d'ora i partecipanti alla discussione.
Ultima modifica di Sargonsei il domenica 21 aprile 2024, 15:51, modificato 1 volta in totale.
Postare l'output di un comando significa inserire nel post: la riga in cui si digita il comando, tutto l'output, e la riga in cui il prompt ricompare.
Hardware e Sistema Operativo di Sargonsei: http://sargonsei.altervista.org/hardwar ... r-fisso-2/
Comandi da tenere a portata di mano: http://sargonsei.altervista.org/655-2/
nicNiz
Prode Principiante
Messaggi: 50
Iscrizione: domenica 4 ottobre 2020, 20:31

Re: Python 3: problema con variabili

Messaggio da nicNiz »

Non uso python, ma mi pare che SOMMA ritorni una stringa (return(SUM1)). Poi questa stringa viene passata a RADICE() causando un errore
Il mio Linguaggio di scripting dichiarativo
https://dunocode.altervista.org
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2856
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Python 3: problema con variabili

Messaggio da rai »

nicNiz ha scritto:
domenica 21 aprile 2024, 10:46
Non uso python, ma mi pare che SOMMA ritorni una stringa (return(SUM1)). Poi questa stringa viene passata a RADICE() causando un errore
inoltre c'è un errore di sintassi nel rigo

Codice: Seleziona tutto

                if print(Z2.is_integer()):
che probabilmente dovrebbe diventare:

Codice: Seleziona tutto

                if Z2.is_integer():
Avatar utente
Sargonsei
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2505
Iscrizione: domenica 17 febbraio 2008, 13:56

Re: Python 3: problema con variabili

Messaggio da Sargonsei »

ho modificato lo script... adesso è così:

Codice: Seleziona tutto

# Python3 - Script per verificare se [somma di quadrati perfetti = quadrato perfetto]
# Calcola tutte le coppie di numeri naturali positivi
# compresi fra i due numeri naturali positivi dati
# per i quali la somma dei quadrati di ciascun numero naturale positivo
# è pari al quadrato di un terzo numero, anch'esso naturale e positivo.
#
#
# Per avviare questo script:
# 1) Salvarlo nella cartella di lavoro, con nome ed estensione .py (Estensioni alternative: .pyw .pyc .pyo .pyd )
# 2) Aprire un terminale nella cartella di lavoro 
# 3) Impartire il comando: [python3 <nomeDelloScript.py>]
#
def DATI(X, Y):    # Inizio definizione funzione DATI()
    XX = int(input(X))  # Acquisisce il primo numero intero e lo mette in una variabile
    YY = int(input(Y))  # Acquisisce il secondo numero intero e lo mette in una variabile
    return(XX, YY) # Restituisce i valori contenuti nelle due variabili
def SOMMA(ADD1, ADD2): # Inizio definizione funzione SOMMA()
    SUM = ADD1 + ADD2  # Calcola la somma dei 2 numeri
    SUM1 = "\nLa somma fra l'addendo " + str(ADD1) + " e l'addendo " + str(ADD2) + " vale " +str(SUM)
    SUM1 = "(" + str(ADD1) + " + " + str(ADD2) + ")= " + str(SUM) + SUM1
    return(SUM1)
def POTENZA(BASE, EXP): # Inizio definizione funzione POTENZA()
    POT = BASE ** EXP   # Calcola la potenza della BASE
    return(POT)
def RADICE(RADICANDO, INDICE):        # Inizio definizione funzione RADICE()
    RADICE1 = RADICANDO ** (1/INDICE)  # Calcola la radice del RADICANDO
    return(RADICE1)
MENU = """Menù:
0) Chiudere questo script.
1) Somma di quadrati perfetti = Quadrato perfetto
"""
while True:
    print(MENU)
    SCELTA = input("Per scegliere, inserire il numero corrispondente. ")
    if SCELTA == "0":
        print("Hai digitato la scelta 0, quindi questo script si ferma.")
        break # Interrompe il ciclo 'while'
    elif SCELTA == "1":
        print("Hai digitato la scelta 1, [Somma di quadrati perfetti = Quadrato perfetto].")
        X1 = "Limite inferiore ? "; Y1 = "Limite superiore ? "
        X02, Y02 = DATI(X1, Y1)     # Chiama la funzione DATI() previo trasferimento del contenuto delle variabili X1 e Y1.

        for X2 in range(X02, Y02, 1): # Inizio del ciclo che verrà ripetuto varie volte, da X02 a Y02 incrementando 1.
            for Y2 in range(X02, Y02, 1): # Inizio del ciclo che verrà ripetuto varie volte, da X02 a Y02 incrementando 1.
                X3 = POTENZA(X2, 2) # Chiama la funzione POTENZA() previo trasferimento del contenuto della variabile X2 e del numero 2.
                Y3 = POTENZA(Y2, 2) # Chiama la funzione POTENZA() previo trasferimento del contenuto della variabile Y2 e del numero 2.
                Z03 = SOMMA(X3, Y3) # Chiama la funzione SOMMA() previo trasferimento del contenuto delle variabili X3 e Y3.
                Z3 = int(float(Z03))
                Z2 = RADICE(Z3, 2) # Chiama la funzione RADICE() previo trasferimento del contenuto della variabile Z3 e del numero 2.
                if Z2.is_integer():
                    print(X2,"^2 +",Y2,"^2 =",Z3," =",Z2,"^2")
                # Fine [if]
            # Fine ciclo [for Y2]
        # Fine ciclo [for X2]

    else:
        print("La scelta " + SCELTA + " non è una scelta valida")
        continue # Ricomincia il ciclo 'while'
    # Fine del ciclo 'if', 'elif', 'else'
    input("Per poter proseguire, premere il tasto [Invio]")
# Fine del ciclo 'while'
Ma non ho risolto nulla...

Codice: Seleziona tutto

$ python3 000-sommaQuadrati.py
Menù:
0) Chiudere questo script.
1) Somma di quadrati perfetti = Quadrato perfetto

Per scegliere, inserire il numero corrispondente. 1
Hai digitato la scelta 1, [Somma di quadrati perfetti = Quadrato perfetto].
Limite inferiore ? 1
Limite superiore ? 10
Traceback (most recent call last):
  File "/mnt/Dati1/Guide/Guida-Python3/000-sommaQuadrati.py", line 49, in <module>
    Z3 = int(float(Z03))
ValueError: could not convert string to float: "(1 + 1)= 2\nLa somma fra l'addendo 1 e l'addendo 1 vale 2"
ubuntustudio22k04@ubuntustudio22k04-X555YI:/mnt/Dati1/Guide/Guida-Python3$ 
$
Postare l'output di un comando significa inserire nel post: la riga in cui si digita il comando, tutto l'output, e la riga in cui il prompt ricompare.
Hardware e Sistema Operativo di Sargonsei: http://sargonsei.altervista.org/hardwar ... r-fisso-2/
Comandi da tenere a portata di mano: http://sargonsei.altervista.org/655-2/
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2856
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: Python 3: problema con variabili

Messaggio da rai »

:ciao:
Ti suggerisco di curare lo stile del codice come spiegato nella PEP 8, inserendo righe bianche tra le definizioni di funzioni, eliminando i commenti inline quando attestano cose ovvie, rispettando le convenzioni di denominazione delle variabili etc. Questo semplifica molto la lettura del codice e il debug
Nel merito, la funzione SOMMA() per ora ritorna la variabile SUM1 che è come già detto una stringa. Devi farle ritornare la variabile SUM che è il numero che rappresenta la somma dei due quadrati.
Appena arrivi a fare funzionare questo codice, posto un modo alternativo di affrontare la faccenda che offre qualche vantaggio anche se non permette lo stesso tipo di output di questo.

Stiamo parlando delle terne pitagoriche, no?
Avatar utente
Sargonsei
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2505
Iscrizione: domenica 17 febbraio 2008, 13:56

Re: [Risolto] Python 3: problema con variabili

Messaggio da Sargonsei »

Ho dovuto anche modificare la funzione che si occupava di fare la somma. Ora lo script

Codice: Seleziona tutto

# Python3 - Script per verificare se [somma di quadrati perfetti = quadrato perfetto]
# Calcola tutte le coppie di numeri naturali positivi
# compresi fra i due numeri naturali positivi dati
# per i quali la somma dei quadrati di ciascun numero naturale positivo
# è pari al quadrato di un terzo numero, anch'esso naturale e positivo.
#
#
# Per avviare questo script:
# 1) Salvarlo nella cartella di lavoro, con nome ed estensione .py (Estensioni alternative: .pyw .pyc .pyo .pyd )
# 2) Aprire un terminale nella cartella di lavoro 
# 3) Impartire il comando: [python3 <nomeDelloScript.py>]
#
def DATI(X, Y):    # Inizio definizione funzione DATI()
    XX = int(input(X))  # Acquisisce il primo numero intero e lo mette in una variabile
    YY = int(input(Y))  # Acquisisce il secondo numero intero e lo mette in una variabile
    return(XX, YY) # Restituisce i valori contenuti nelle due variabili
def SOMMA(ADD1, ADD2): # Inizio definizione funzione SOMMA()
    SUM = ADD1 + ADD2  # Calcola la somma dei 2 numeri
    return(SUM)
def POTENZA(BASE, EXP): # Inizio definizione funzione POTENZA()
    POT = BASE ** EXP   # Calcola la potenza della BASE
    return(POT)
def RADICE(RADICANDO, INDICE):        # Inizio definizione funzione RADICE()
    RADICE1 = RADICANDO ** (1/INDICE)  # Calcola la radice del RADICANDO
    return(RADICE1)
MENU = """Menù:
0) Chiudere questo script.
1) Somma di quadrati perfetti = Quadrato perfetto
"""
while True:
    print(MENU)
    SCELTA = input("Per scegliere, inserire il numero corrispondente. ")
    if SCELTA == "0":
        print("Hai digitato la scelta 0, quindi questo script si ferma.")
        break # Interrompe il ciclo 'while'
    elif SCELTA == "1":
        print("Hai digitato la scelta 1, [Somma di quadrati perfetti = Quadrato perfetto].")
        X1 = "Limite inferiore ? "; Y1 = "Limite superiore ? "
        X02, Y02 = DATI(X1, Y1)     # Chiama la funzione DATI() previo trasferimento del contenuto delle variabili X1 e Y1.

        for X2 in range(X02, Y02, 1): # Inizio del ciclo che verrà ripetuto varie volte, da X02 a Y02 incrementando 1.
            for Y2 in range(X02, Y02, 1): # Inizio del ciclo che verrà ripetuto varie volte, da X02 a Y02 incrementando 1.
                X3 = POTENZA(X2, 2) # Chiama la funzione POTENZA() previo trasferimento del contenuto della variabile X2 e del numero 2.
                Y3 = POTENZA(Y2, 2) # Chiama la funzione POTENZA() previo trasferimento del contenuto della variabile Y2 e del numero 2.
                Z03 = SOMMA(X3, Y3) # Chiama la funzione SOMMA() previo trasferimento del contenuto delle variabili X3 e Y3.
                Z3 = int(float(Z03))
                Z2 = RADICE(Z3, 2) # Chiama la funzione RADICE() previo trasferimento del contenuto della variabile Z3 e del numero 2.
                if Z2.is_integer():
                    print(X2,"^2 +",Y2,"^2 =", X3, "+", Y3, "=", Z3," =",Z2,"^2")
                # Fine [if]
            # Fine ciclo [for Y2]
        # Fine ciclo [for X2]

    else:
        print("La scelta " + SCELTA + " non è una scelta valida")
        continue # Ricomincia il ciclo 'while'
    # Fine del ciclo 'if', 'elif', 'else'
    input("Per poter proseguire, premere il tasto [Invio]")
# Fine del ciclo 'while'
calcola le terne pitagoriche senza problemi
(Si, stiamo parlando di terne pitagoriche, anche se non sapevo si chiamassero così...)
Grazie a tutti!!!
Postare l'output di un comando significa inserire nel post: la riga in cui si digita il comando, tutto l'output, e la riga in cui il prompt ricompare.
Hardware e Sistema Operativo di Sargonsei: http://sargonsei.altervista.org/hardwar ... r-fisso-2/
Comandi da tenere a portata di mano: http://sargonsei.altervista.org/655-2/
rai
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2856
Iscrizione: domenica 11 maggio 2008, 18:03
Desktop: plasma
Distribuzione: 22.04
Località: Palermo

Re: [Risolto] Python 3: problema con variabili

Messaggio da rai »

Ottimo!
Ora che hai risolto condivido questo codice per mostrare un altro approccio: faccio uso di una funzione combinatoria presa dal modulo itertools che crea in modo ottimizzato tutte le combinazioni possibili tra tutti i numeri nel range. Questo, oltre alla efficienza, semplifica il codice (meno cicli annidati) e si evitano le ripetizioni nell'output (se compare a² + b² = c², non comparirà b² + a² = c²)

Codice: Seleziona tutto

from itertools import combinations

def get_limits():
    lower = input("""
Ricerca di quadrati di interi positivi tali che a² + b² = c² (terne pitagoriche)

Inserire i limiti dell'intervallo in cui cercare:
 limite inferiore >>> """)
    upper = input(" limite superiore >>> ")
    return int(lower), int(upper)

def get_triples(lower, upper):
    for c in range(lower, upper + 1):
        for a, b in combinations(range(lower, upper + 1), 2):
            if c**2 == a**2 + b**2:
                print(f"{a}²+{b}² = {a**2:4}+{b**2:<4} = {c**2:4} = {c}²")
                break

get_triples(*get_limits())
EDIT aggiungo per confronto l'output dell'esecuzione dei due script

Codice: Seleziona tutto

$ python3 /tmp/rai.py

Ricerca di quadrati di interi positivi tali che a² + b² = c² (terne pitagoriche)

Inserire i limiti del range in cui cercare:
 limite inferiore >>> 1
 limite superiore >>> 11
3²+4² =    9+16   =   25 = 5²
6²+8² =   36+64   =  100 = 10²

Codice: Seleziona tutto

$ python3 /tmp/sargonsei.py
Menù:
0) Chiudere questo script.
1) Somma di quadrati perfetti = Quadrato perfetto

Per scegliere, inserire il numero corrispondente. 1
Hai digitato la scelta 1, [Somma di quadrati perfetti = Quadrato perfetto].
Limite inferiore ? 1
Limite superiore ? 11
3 ^2 + 4 ^2 = 9 + 16 = 25  = 5.0 ^2
4 ^2 + 3 ^2 = 16 + 9 = 25  = 5.0 ^2
6 ^2 + 8 ^2 = 36 + 64 = 100  = 10.0 ^2
8 ^2 + 6 ^2 = 64 + 36 = 100  = 10.0 ^2
Spero che sia utile
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 6 ospiti