Topic: Sempre problemi con differenza stringa e numero  (Letto 737 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline IlRosso

  • python unicellularis
  • *
  • Post: 12
  • Punti reputazione: 0
    • Mostra profilo
Sempre problemi con differenza stringa e numero
« il: Dicembre 07, 2011, 13:21 »
Ho fatto quest'altro programma (credo di aver scritto troppe righe per realizzarlo ma non saprei proprio come accorciarlo), pensavo di aver superato il problema della definizione dei numeri in input mettendo sempre il comando dopo l'immissione x=int(x) però nonostante tutto ho sempre l'errore
Traceback (most recent call last):
  File "prova3.py", line 72, in <module>
    print ("In quanto %s ha indovinato in $d tentativi mentre %s ha indovinato in %d tentativi"%(ga,counta,gb,countb))
TypeError: %d format: a number is required, not str

Il programma è il seguente e dovrebbe essere un gioco in cui due partecipanti scelgono un numero da 1 a 100 che l'altro deve indovinare e poi si invertono e alla fina hanno la possibilità di giocare altre partite.


[codice]punta=0
punta=int(punta)
puntb=0
puntb=int(puntb)
ga=input("Giocatore A come ti chiami? ")
gb=input("Giocatore B come ti chiami? ")
print ("Bene %s e %s vi spiego brevemente il gioco, nel primo turno il giocatore A cioè %s dovrà scegliere un numero compreso tra 1 e 100, il numero dovrà essere indovinato dal giocatore B cioè %s in caso di errore però si potrà chiedere se il numero da indovinare è più alto o più basso di quello detto, quando il giocatore indovina il risultato esatto si scambiano i ruoli quindi %s dovrà indovinare il numero scelto da %s, vince chi impiega meno tentativi"%(ga,gb,ga,gb,ga,gb))
pa,pb=0,0
pa=int(pa)
pb=int(pb)
print (ga,"è il tuo turno di scegliere un numero compreso tra 1 e 100")
na=input ("%s scegli il numero "%(ga))
na=int(na)
while na>100 or na<0:
    print ("%s forse non hai capito bene le regole, devi scegliere un numero compreso tra 0 e 100"%(ga))
    na=input ("%s scegli il numero "%(ga))
    na=int(na)
print ("Ok, il numero è stato scelto correttamente ora tocca a te %s provare ad indovinarlo...in bocca al lupo!"%(gb))
xb=input("%s scegli un numero...ricorda che deve essere compreso tra 0-100 altrimenti sprecherai certamente un tentativo "%(gb))
xb=int(xb)
countb=1
countb=int(countb)
while na!=xb:
    print ("No %s, hai sprecato il tuo %d° tentativo...forza riprova sapendo che..."%(gb,countb))
    if na>xb:
        print("Il numero scelto da %s è più alto!"%(ga))
    else:
        print("Il numero scelto da %s è più basso!"%(ga))
    xb=input("%s scegli un altro numero "%(gb))
    xb=int(xb)
    countb=countb+1
print ("Bravo %s hai indovinato in %d° tentativi!"%(gb,countb))
print ("")
print ("Ora cambiano i ruoli! Toccherà a %s scegliere il numero e a %s indovinare"%(gb,ga))
print ("")
print ("%s è il tuo turno di scegliere un numero compreso tra 1 e 100"%(gb))
na=input ("%s scegli il numero "%(gb))
na=int(na)
while na>100 or na<0:
    print ("%s forse non hai capito bene le regole, devi scegliere un numero compreso tra 0 e 100"%(gb))
    na=input ("%s scegli il numero "%(gb))
    na=int(na)
print ("Ok, il numero è stato scelto correttamente ora tocca a te %s provare ad indovinarlo...in bocca al lupo!"%(ga))
xa=input("%s scegli un numero...ricorda che deve essere compreso tra 0-100 altrimenti sprecherai certamente un tentativo "%(ga))
xa=int(xa)
counta=1
counta=int(counta)
while na!=xa:
    print ("No %s, hai sprecato il tuo %d° tentativo...forza riprova sapendo che..."%(ga,counta))
    if na>xa:
        print("Il numero scelto da %s è più alto!"%(gb))
    else:
        print("Il numero scelto da %s è più basso!"%(gb))
    xa=input("%s scegli un altro numero "%(ga))
    xa=int(xa)
    counta=counta+1
print ("Bravo %s hai indovinato in %d° tentativi!"%(ga,counta))
print ("")
print ("Bene, la partaita è conclusa è il vincitore è...")
if countb>counta:
    print ("")
    print ("")
    print ("*****%s*****"%(ga))
elif countb<counta:
    print ("")
    print ("")
    print ("*****%s*****"%(gb))
else:
    print ("")
    print ("")
    print ("...per questa volta è finita in pareggio!")
print ("In quanto %s ha indovinato in $d tentativi mentre %s ha indovinato in %d tentativi"%(ga,counta,gb,countb))
print ("")
print ("")
if countb>counta:
    punta=0
    punta=int(punta)
    punta=punta+1
elif countb<counta:
    puntb=0
    puntb=int(puntb)
    puntb=puntb+1
else:
    print ("In caso di pareggio non vengono assegnati punti")
print("")
print("")
print("La classifica attuale dice che %s ha vinto %d partita/e e %s invece ne ha vinta/e %d"%(ga,punta,gb,puntb))
print("")
print("")
np=input("Volete giocare ancora o per oggi è abbastanza (s/n)? ")
while np!="s" and np!="S" and np!="n" and np!="N":
    print ("Puoi solo scegliere s per continuare o n per smettere di giocare")
    np=input("Volete giocare ancora o per oggi è abbastanza (s/n)? ")
while np in "sS":
    pa,pb=0,0
    print (ga,"è il tuo turno di scegliere un numero compreso tra 1 e 100")
    na=input ("%s scegli il numero "%(ga))
    na=int(na)
    while na>100 or na<0:
        print ("%s forse non hai capito bene le regole, devi scegliere un numero compreso tra 0 e 100"%(ga))
        na=input ("%s scegli il numero "%(ga))
        na=int(na)
    print ("Ok, il numero è stato scelto correttamente ora tocca a te %s provare ad indovinarlo...in bocca al lupo!"%(gb))
    xb=input("%s scegli un numero...ricorda che deve essere compreso tra 0-100 altrimenti sprecherai certamente un tentativo "%(gb))
    xb=int(xb)
    countb=1
    countb=int(countb)
    while na!=xb:
        print ("No %s, hai sprecato il tuo %d° tentativo...forza riprova sapendo che..."%(gb,countb))
        if na>xb:
            print("Il numero scelto da %s è più alto!"%(ga))
        else:
            print("Il numero scelto da %s è più basso!"%(ga))
        xb=input("%s scegli un altro numero "%(gb))
        xb=int(xb)
        countb=countb+1
    print ("Bravo %s hai indovinato in %d° tentativi!"%(gb,countb))
    print ("")
    print ("Ora cambiano i ruoli! Toccherà a %s scegliere il numero e a %s indovinare"%(gb,ga))
    print ("")
    print ("%s è il tuo turno di scegliere un numero compreso tra 1 e 100"%(gb))
    na=input ("%s scegli il numero "%(gb))
    na=int(na)
    while na>100 or na<0:
        print ("%s forse non hai capito bene le regole, devi scegliere un numero compreso tra 0 e 100"%(gb))
        na=input ("%s scegli il numero "%(gb))
        na=int(na)
    print ("Ok, il numero è stato scelto correttamente ora tocca a te %s provare ad indovinarlo...in bocca al lupo!"%(ga))
    xa=input("%s scegli un numero...ricorda che deve essere compreso tra 0-100 altrimenti sprecherai certamente un tentativo "%(ga))
    xa=int(xa)
    counta=1
    counta=int(counta)
    while na!=xa:
        print ("No %s, hai sprecato il tuo %d° tentativo...forza riprova sapendo che..."%(ga,counta))
        if na>xa:
            print("Il numero scelto da %s è più alto!"%(gb))
        else:
            print("Il numero scelto da %s è più basso!"%(gb))
        xa=input("%s scegli un altro numero "%(ga))
        xa=int(xa)
        counta=counta+1
    print ("Bravo %s hai indovinato in %d° tentativi!"%(ga,counta))
    print ("")
    print ("Bene, la partaita è conclusa è il vincitore è...")
    if countb>counta:
        print ("")
        print ("")
        print ("*****%s*****"%(ga))
    elif countb<counta:
        print ("")
        print ("")
        print ("*****%s*****"%(gb))
    else:
        print ("")
        print ("")
        print ("...per questa volta è finita in pareggio!")
    print ("In quanto %s ha indovinato in $d tentativi mentre %s ha indovinato in %d tentativi"%(ga,counta,gb,countb))
    print ("")
    print ("")
    if countb>counta:
        punta=punta+1
    elif countb<counta:
        puntb=puntb+1
    else:
        print ("In caso di pareggio non vengono assegnati punti")
    print("")
    print("")
    print("La classifica attuale dice che %s ha vinto %d partita/e e %s invece ne ha vinta/e %d"%(ga,punta,gb,puntb))
    print("")
    print("")
    np=input("Volete giocare ancora o per oggi è abbastanza (s/n)? ")
print ("Bene, allora alla prossina",ga,"e",gb)[/codice]
« Ultima modifica: Dicembre 07, 2011, 13:23 da IlRosso »

Offline Giornale di Sistema

  • python sapiens sapiens
  • ******
  • Post: 3.124
  • Punti reputazione: 4
    • Mostra profilo
    • Distillato di Python
Re: Sempre problemi con differenza stringa e numero
« Risposta #1 il: Dicembre 07, 2011, 13:31 »
[codice]TypeError: %d format: a number is required, not str[/codice]
E' molto esplicito...  :)

Offline Bakuriu

  • python sapiens sapiens
  • ******
  • Post: 2.267
  • Punti reputazione: 2
  • Katon, Goukakyuu no jutsu!
    • Mostra profilo
    • Jack's Blackboard - Il mio blog
Re: Sempre problemi con differenza stringa e numero
« Risposta #2 il: Dicembre 07, 2011, 13:36 »
Da qualche parte mi è sembrato di vedere $d al posto di %d. $d non ha un significato particolare, quindi il valore che doveva essere messo in %d verrà messo nel % successivo.
Controlla che non succeda questo.

Offline Giornale di Sistema

  • python sapiens sapiens
  • ******
  • Post: 3.124
  • Punti reputazione: 4
    • Mostra profilo
    • Distillato di Python
Re: Sempre problemi con differenza stringa e numero
« Risposta #3 il: Dicembre 07, 2011, 13:54 »
Al momento avevo pensato anch'io fosse quello, poi però ho verificato (sempre non abbia preso una cantonata che ora non vedo):
[codice]>>> a = 5
>>> b = 6
>>> d = "a"
>>> e = "b"
>>> print("prova %d e di $d e di %s e di %s" %(a,b,d,e))
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    print("prova %d e di $d e di %s e di %s" %(a,b,d,e))
TypeError: not all arguments converted during string formatting
[/codice]
In tutto quel codice pare accada anche altro.

Offline Claudio_F

  • python sapiens sapiens
  • ******
  • Post: 1.157
  • Punti reputazione: 2
    • Mostra profilo
Re: Sempre problemi con differenza stringa e numero
« Risposta #4 il: Dicembre 07, 2011, 16:33 »
Citazione da: IlRosso
credo di aver scritto troppe righe per realizzarlo ma non saprei proprio come accorciarlo
A parte prendere il coraggio di affrontare le funzioni... una prima idea e': invece di strutturare cosi'
[codice]
giro
richiesta termine
finche' non termine:
    giro
    richiesta termine
[/codice]
che se "giro" e' qualcosa di grosso praticamente ti raddoppia il programma, fare qualcosa del genere:
[codice]
termine=False
finche' non termine:
    giro
    richiesta termine
[/codice]
...e gia' "giro" lo scrivi una volta sola, eventualmente nella variante
[codice]
finche' True:
    giro
    richiesta termine
    se termine: break
[/codice]
Citazione
pensavo di aver superato il problema della definizione dei numeri in input mettendo sempre il comando dopo l'immissione x=int(x) però nonostante tutto ho sempre l'errore
Capisco il terrore di trovarsi una stringa al posto di un intero, ma:
[codice]
punta=0 
punta=int(punta)
[/codice]
e' davvero esagerato  :) Se hai assegnato un intero quello e' un intero. Per quanto riguarda la riga 72 guarda bene cosa hai scritto... e' vero, finisce una stringa dove Python trova %d, ma l'errore non sta nelle variabili. Tra l'altro l'errore e' duplicato alla 157, e questo e' un altro buon motivo per non duplicare pezzi di codice se possono stare in un posto solo, non si allunga solo il programma, ma si moltiplicano gli errori ;)
« Ultima modifica: Dicembre 07, 2011, 16:54 da Claudio_F »

Offline IlRosso

  • python unicellularis
  • *
  • Post: 12
  • Punti reputazione: 0
    • Mostra profilo
Re: Sempre problemi con differenza stringa e numero
« Risposta #5 il: Dicembre 08, 2011, 12:19 »
Sto ancora cercando è...ma non demordo.
Comunque c'è un modo per definite un intero in una riga di input senza dover necessaariamente usare una riga di definizione, cioè è necessario fare x=input("Inserisci x") poi x=int(x) oppure esiste una via più breve?
(alla scorciatoia del while col "finchè true...eccecc" proprio non ci avevo pensato...grazie mille)

Ahhhhhhh dimenticavo....altra domanda...sto vedendo il funzionamento della funzione for mi dite che programma potrei realizzare con essa e con le precedenti imparate? Così mi testo
« Ultima modifica: Dicembre 08, 2011, 13:04 da IlRosso »

Offline Claudio_F

  • python sapiens sapiens
  • ******
  • Post: 1.157
  • Punti reputazione: 2
    • Mostra profilo
Re: Sempre problemi con differenza stringa e numero
« Risposta #6 il: Dicembre 08, 2011, 13:58 »
Citazione da: IlRosso
Comunque c'è un modo per definite un intero in una riga di input senza dover necessaariamente usare una riga di definizione, cioè è necessario fare x=input("Inserisci x") poi x=int(x) oppure esiste una via più breve?
Puoi nidificare a piacere:
[codice]
# forma completamente estesa
a = input("Dammi un numero da 0 a 65535 ")
b = int(a)
c = bin(b)
d = c[2:]
e = d.rjust(16, "0")
print(e)

# forma completamente... illeggibile :-P
print(bin(int(input("Dammi un numero da 0 a 65535 ")))[2:].rjust(16, "0"))
[/codice]
Citazione
della funzione for mi dite che programma potrei realizzare con essa e con le precedenti imparate?
for e' una struttura ciclica che itera su oggetti iterabili come le sequenze assegnando alla variabile del for un elemento della sequenza alla volta. Sequenze sono stringhe, liste/tuple, bytearray/bytes. Altri oggetti iterabili sono quelli restituiti da funzioni come open, range, map ed altre. In particolare si usa spesso range per creare un ciclo di n ripetizioni.
« Ultima modifica: Dicembre 08, 2011, 19:02 da Claudio_F »

Offline Nextage

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:Sempre problemi con differenza stringa e numero
« Risposta #7 il: Maggio 17, 2019, 14:58 »
Ho trovato anch'io problemi su una serie di comandi che in python 2.7 molto probabilmente funzionavano perfettamente

le istruzioni sono veramente basiche , io sono completamente digiuno di programmazione e quindi trovo ostico ricercare il
motivo del malfunzionamento.

print ("stampa se un numero é pari o dispari")
numero=input("scrivi un numero: ")
print (numero)
if numero %2 ==0: print (numero," é pari")
   
elif numero %2 ==1: print (numero, (" é dispari"))


stampa se un numero é pari o dispari
scrivi un numero: 6
6
Traceback (most recent call last):
  File "C:\Users\stefano.crema\AppData\Local\Programs\Python\Python37\pythex4.py", line 18, in <module>
    if numero %2 ==0: print (numero," é pari")
TypeError: not all arguments converted during string formatting

anche con l' if not == mi da problemi con numeri e variabili se invece lo uso con delle stringhe va tutto liscio.

grazie a chi potrà illuminarmi
/stefano

Offline bebo

  • python erectus
  • ***
  • Post: 205
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:Sempre problemi con differenza stringa e numero
« Risposta #8 il: Maggio 17, 2019, 17:18 »
Ciao Stefano,
il problema e' che input in python2 andava a interpretare quello che riceveva da tastiera dall'utente, usando eval (ricorda sempre, eval e' il *male*), vedi doc: https://docs.python.org/2/library/functions.html#input
Invece in python3 e' stato deciso che input() tornera' sempre una stringa, cosi' lo sviluppatore deve controllare e gestire le condizioni sbagliate che l'utente gli passa: https://docs.python.org/3/library/functions.html#input

Es:
Python 3.7.3 (default, Mar 27 2019, 13:41:07) 
[GCC 8.3.1 20190223 (Red Hat 8.3.1-2)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> value_raw = input("Numero: ")
Numero: 3
>>> print(repr(value_raw), type(value_raw))
'3' <class 'str'>
>>>
>>> value = int(input("Numero: "))
Numero: 5
>>> print(repr(value), type(value))
5 <class 'int'>
>>>
>>>
>>> try:
...   value_wrong = int(input("Numero: "))
... except ValueError:
...   print("Devi passarmi un numero!")
...   import sys; sys.exit(1)
...   # oppure altre operazioni per gestire il problema, magari richiedere di nuovo finche' non si risolve
...
Numero: asdf
Devi passarmi un numero!


Python si lamenta quando "usi numeri e variabili" perche' non puo' confrontare mele con pere: per fortuna, a differenza di altri linguaggi (suona un po' come il solito "a differenza dei governi precedenti"  :D ), non fa "magie" sottobanco per cercare di confrontare tra loro oggetti di tipi diversi; python e' un linguaggio "strongly typed", in letteratura: https://stackoverflow.com/a/11328980/.

>>> 4 == 4
True
>>> 4 == "4"
False


PS: un interessante esercizio potrebbe essere quello di continuare a richiedere, per un numero indefinito di volte, un certo input all'utente finche' non e' corretto.
Ad es. un giochino in cui l'utente deve indovinare un numero random scelto dal pc: generi un numero random, e dai un massimo e minimo, e poi continui a chiedere all'utente numeri rispondendo se e' piu' alto o basso, oppure acqua/fuochino/fuoco, finche' non indovina.

Offline Nextage

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:Sempre problemi con differenza stringa e numero
« Risposta #9 il: Maggio 21, 2019, 18:23 »
Però in python 2  era possibile confrontare un numero con quello contenuto nella variabile, mentre adesso non sembra più possibile, non almeno con le mie conoscenze.
print ("stampa se un numero é pari o dispari")
numero=input("scrivi un numero: ")
if numero%2 == 0: print numero," é pari"
elif numero%2 ==1: print numero, " é dispari"

stampa se un numero é pari o dispari
scrivi un numero: 6
6  é pari
>>>

stefano

Offline bebo

  • python erectus
  • ***
  • Post: 205
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:Sempre problemi con differenza stringa e numero
« Risposta #10 il: Maggio 21, 2019, 23:03 »
Citazione
Però in python 2  era possibile confrontare un numero con quello contenuto nella variabile, mentre adesso non sembra più possibile, non almeno con le mie conoscenze.
Qua non stiamo parlando pero' di confrontare un numero con una variabile, stiamo parlando di confrontare un numero con quello che viene ritornato da input(), in due diverse versioni di python.

Citazione
il problema e' che input in python2 andava a interpretare quello che riceveva da tastiera dall'utente, usando eval (ricorda sempre, eval e' il *male*), vedi doc: https://docs.python.org/2/library/functions.html#input
Invece in python3 e' stato deciso che input() tornera' sempre una stringa, cosi' lo sviluppatore deve controllare e gestire le condizioni sbagliate che l'utente gli passa: https://docs.python.org/3/library/functions.html#input

Significa che python2 applicava eval sull' input scritto dall'utente; cio' significa che se un utente volesse farti uno "scherzo" (fingiamo che sia solo uno scherzo, va), potrebbe scrivere questo:
eval("__import__('os').remove('/percorso/immagini/vacanze_mare_2017')")

e le tue immagini sarebbero scomparse. Questo perche' eval interpreta la stringa passata come codice python e lo fa girare. E questo puo' essere molto pericoloso se usato incautamente. E' scritto nelle doc che ti ho linkato prima.

Ti torna perche' input() non "funziona" piu' come faceva in python2?
L'esempio sopra con il try/except ti mostra come si fa a leggere input e interpretarlo in modo sano in python, come bisognerebbe fare sia in python2 che in python3.
« Ultima modifica: Maggio 21, 2019, 23:05 da bebo »

Offline Nextage

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:Sempre problemi con differenza stringa e numero
« Risposta #11 il: Maggio 22, 2019, 14:25 »
Bastava dire che la funzione input() restituisce sempre una stringa e quindi  per poterci fare delle operazioni bisogna passare da stinga a intero, facendo int(varabile).

print ("stampa se un numero é pari o dispari")
Numero = input("Numero: ")
#numero=input("scrivi un numero: ")
if int(Numero)%2 == 0: print (Numero," é pari")
elif int(Numero)%2 ==1: print (Numero, (" é dispari"))

Offline bebo

  • python erectus
  • ***
  • Post: 205
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:Sempre problemi con differenza stringa e numero
« Risposta #12 il: Maggio 22, 2019, 15:40 »
Citazione
Bastava dire che la funzione input() restituisce sempre una stringa e quindi  per poterci fare delle operazioni bisogna passare da stinga a intero, facendo int(varabile).
Che e' proprio quello che ho scritto con tanto di link alla documentazione e esempio pratico, nel messaggio del 17 Maggio 2019, 17.18: https://forumpython.it/esercizi/sempre-problemi-con-differenza-stringa-e-numero/msg88473/#msg88473  :|
Citazione
Invece in python3 e' stato deciso che input() tornera' sempre una stringa, cosi' lo sviluppatore deve controllare e gestire le condizioni sbagliate che l'utente gli passa: https://docs.python.org/3/library/functions.html#input