View Full Version : [Python]if e dizionari.
MasterDany
23-12-2008, 09:11
Tempo fa scrissi questo gioco:
def Livello1():
print "Livello 1:"
Lista=["cane","gioco","gatto","scoiattolo","mucca"]
print Lista
ParolaSbagliata=raw_input("Inserisci la parola sbagliata: ")
if ParolaSbagliata=="gioco":
print "Risposta Esatta"
else:
print "Risposta Sbagliata"
def Livello2():
print "****---------****** \nLivello 2:"
Lista=[3,6,9,12,13,15,18,21,24,27,30]
print Lista
NumeroSbagliato=input("Inserisci il numero sbagliato:")
if NumeroSbagliato==13:
print "Risposta esatta"
else:
print "Risposta Errata,Riprova!"
def Livelli():
for i in [1,2]:
if i==1:
Livello1()
else:
Livello2()
Livelli()
Vicius mi disse di riscriverlo dopo aver finito il capitolo 10.Io non l'ho finito ma ho provato ad accorciare.Guardate cosa è venuto:
ParoleE={"gioco":"risposta esatta",13:"risposta esatta"}
def Livello1():
print "Livello 1:"
Lista=["cane","gioco","gatto","scoiattolo","mucca"]
print Lista
r=raw_input("Qual'e' la parola sbagliata:")
print ParoleE.get(r,"Sbagliato")
def Livello2():
print "****---------****** \nLivello 2:"
Lista=[3,6,9,12,13,15,18,21,24,27,30]
print Lista
r=raw_input("Qual'e' la parola sbagliata:")
print ParoleE.get(r,"Sbagliato")
def Livelli():
for i in [1,2]:
if i==1:
Livello1()
else:
Livello2()
Livelli()
Qualche riga in meno c'è però...non s'è dimezzato.
ParoleE={"gioco":"risposta esatta",13:"risposta esatta"}
def Livello1():
print "Livello 1:"
Lista=["cane","gioco","gatto","scoiattolo","mucca"]
print Lista
r=raw_input("Qual'e' la parola sbagliata:")
print ParoleE.get(r,"Sbagliato")
def Livello2():
print "****---------****** \nLivello 2:"
Lista=[3,6,9,12,13,15,18,21,24,27,30]
print Lista
r=raw_input("Qual'e' la parola sbagliata:")
print ParoleE.get(r,"Sbagliato")
def Livelli():
for i in [1,2]:
if i==1:
Livello1()
else:
Livello2()
Livelli()
Qualche riga in meno c'è però...non s'è dimezzato.
Per aggiungere un livello devi modificare il codice in 4 parti e questo non va per niente bene. Quelle funzioni Livello1, Livello2 devono sparire, quel if i== 1 deve sparire. Hai tutti gli strumenti per farlo mettici sotto :)
MasterDany
23-12-2008, 11:16
Però non posso far sparire le funzioni perchè se uno inserisce qualcosa di sbagliato il programma deve ritornare al primo livello. ;)
Al massimo posso togliere il ciclo e chiamare semplicemente Prima Livello1 e poi Livello 2
MasterDany
23-12-2008, 11:36
Per aggiungere un livello devi modificare il codice in 4 parti e questo non va per niente bene.
Per aggiungere un terzo livello devo modificare la funzione programma:
def Livelli():
for i in [1,2]:
if i==1:
Livello1()
else:
Livello2()
Livelli()
devo aggiungere un if e modificare la lista.Eppoi aggiungere la risposta esatta qua:
ParoleE={"gatto":"risposta esatta",13:"risposta esatta"}
Quallo che volevo fare io però era una ricorsione.Finchè non hai dato la risposta sbagliata la funzione si ripete. ;)
Quindi non so se si può eliminare la funzione.
MasterDany
23-12-2008, 11:50
ParoleE={"gatto":"risposta esatta",13:"risposta esatta"}
def Livello1():
print "Livello 1:"
Lista=["cane","gioco","gatto","scoiattolo","mucca"]
print Lista
r=raw_input("Qual'e' la parola sbagliata:")
print ParoleE.get(r,0)
Livello2()
def Livello2():
print "****---------****** \nLivello 2:"
Lista=[3,6,9,12,13,15,18,21,24,27,30]
print Lista
r=raw_input("Qual'e' la parola sbagliata:")
print ParoleE.get(r,"Sbagliato")
Livello1()
MasterDany
23-12-2008, 11:55
ParoleE={"gioco":"risposta esatta",13:"risposta esatta"}
print "Livello 1:"
Lista=["cane","gioco","gatto","scoiattolo","mucca"]
print Lista
r=raw_input("Qual'e' la parola sbagliata:")
print ParoleE.get(r,"Sbagliato")
print "****---------****** \nLivello 2:"
Lista=[3,6,9,12,13,15,18,21,24,27,30]
print Lista
r=raw_input("Qual'e' la parola sbagliata:")
print ParoleE.get(r,"Sbagliato")
MasterDany
23-12-2008, 12:05
Allora se voglio mettere il punteggio?Bisogna per forza usare gli if.
def Livello1():
j=0
print "Livello 1:"
Lista=["cane","gioco","gatto","scoiattolo","mucca"]
print Lista
r=raw_input("Qual'e' la parola sbagliata:")
if r!="gioco":
j=j+1
Livello1()
else:
Livello2()
return j
Livello1()
Se vuoi un consiglio fermati immediatamente. Non andare più avanti con i capitoli e riprendi in mano quelli precedenti dal 5 in poi perché non hai per niente chiaro di cosa siano delle funzioni e di come si usano. Rileggi la parte dove si parla di generalizzazione MOLTO attentamente. Per quanto riguarda la ricorsione. Se sei convinto che basti un while per creare una funzione ricorsiva o che quello sia il punto ideale per una funzione di quel tipo significa che non hai capito per niente quello che voleva spiegarti il libro.
MasterDany
23-12-2008, 12:45
Se vuoi un consiglio fermati immediatamente. Non andare più avanti con i capitoli e riprendi in mano quelli precedenti dal 5 in poi perché non hai per niente chiaro di cosa siano delle funzioni e di come si usano. Rileggi la parte dove si parla di generalizzazione MOLTO attentamente. Per quanto riguarda la ricorsione. Se sei convinto che basti un while per creare una funzione ricorsiva o che quello sia il punto ideale per una funzione di quel tipo significa che non hai capito per niente quello che voleva spiegarti il libro.
chi ha detto del while il while non crea una funzione ricorsiva.
Ripete una sequenza di istruzione fino a quando non si "avvera" per una determinata condizione. ;)
MasterDany
23-12-2008, 12:47
Per quanto riguarda generalizzare la definizio me la ricordo a memoria ;)
MasterDany
24-12-2008, 08:55
up
MasterDany
24-12-2008, 11:42
Se vuoi un consiglio fermati immediatamente. Non andare più avanti con i capitoli e riprendi in mano quelli precedenti dal 5 in poi perché non hai per niente chiaro di cosa siano delle funzioni e di come si usano. Rileggi la parte dove si parla di generalizzazione MOLTO attentamente. Per quanto riguarda la ricorsione. Se sei convinto che basti un while per creare una funzione ricorsiva o che quello sia il punto ideale per una funzione di quel tipo significa che non hai capito per niente quello che voleva spiegarti il libro.
Io Generalizzazione la definisco cosi:
se abbiamo un pezzo di codice che somma 2+2 generalizzarlo vuol dire sommare qualsiasi numero quindi ad esempio:
print 2+2
def Generalizzata(x,y):
print x+y
Le funzioni.Cosa sono lo so visto che le ho usate non poche volte.Io le uso quando:
-semplificare il programma
-rendere il programma più piccolo
-dividere il programma in parti testabili
Ora riprendendo il mio codice:
ParoleE={"gioco":"risposta esatta",13:"risposta esatta"}#aggiungere la soluzione
def Livello1():
print "Livello 1:"
Lista=["cane","gioco","gatto","scoiattolo","mucca"]
print Lista
r=raw_input("Qual'e' la parola sbagliata:")
print ParoleE.get(r,"Sbagliato")
def Livello2():
print "****---------****** \nLivello 2:"
Lista=[3,6,9,12,13,15,18,21,24,27,30]
print Lista
r=raw_input("Qual'e' la parola sbagliata:")
print ParoleE.get(r,"Sbagliato")
def Livelli():
for i in [1,2]: #devo aggiungere un elemeno alla lista
if i==1: #
Livello1()#devo aggiungere una condizione.
else: #
Livello2()#
Livelli()
Non trovo la quarta parte...una mano?
cdimauro
24-12-2008, 12:53
Generalizzare = "mettere assieme" il codice comune (facendo uso di funzioni, come t'è stato detto).
Non dico altro perché devi arrivarci da solo. Altrimenti è inutile continuare.
MasterDany
24-12-2008, 12:55
Posso raggruppare i livelli in una sola funzione?
Le raggruppo semplicemente in una funzione che le esegue una lla volta.
cdimauro
24-12-2008, 14:17
Esatto. Scrivendola opportunamente, puoi usare UNA sola funzione per tutto.
MasterDany
24-12-2008, 18:33
Ci provo
def Gioco():
ParoleE={"gioco":"risposta esatta",13:"risposta esatta"}
L_Livelli=[3,6,9,12,13,15,18,21,24,27,30,"gatto","cane","mucca","gioco","volpe"]
print L_Livelli[0:11]
i_l1=input("Qual'e' il numero sbagliato?")
print ParoleE.get(i_l1,0)
print L_Livelli[11:16]
i_l2=raw_input("Qual'e' la parola sbagliata?")
print ParoleE.get(i_l2,0)
Gioco()
cdimauro
24-12-2008, 18:48
Mumble. Generalizzare non vuol dire ammassare tutto. Infatti parlavo di mettere assieme il codice, non anche i dati.
Un principio molto importante nella programmazione e che aiuta parecchio quando si scrive il codice è quello della SEPARAZIONE fra codice e dati. Cerca, cioé, di astrarre il codice il più possibile senza infilarci in mezzo dei dati.
Nello specifico il mio suggerimento è quello di sfruttare la possibilità di passare dati a una funzione. Mi fermo davvero qui, perché ho detto anche troppo. Cerca di arrivarci da solo adesso.
MasterDany
24-12-2008, 19:12
edit
MasterDany
24-12-2008, 19:18
Lista1=[3,6,9,12,13,15,18,21,24,27,30]
Lista2=["cane","gatto","gioco","mucca"]
ParoleE={"gioco":"risposta esatta","13":"risposta esatta"}
def Gioco(l1,pe):
print l1
i_l1=raw_input("Qual'e' il numero ,o la parola ,sbagliato?")
print pe.get(i_l1,0)
Gioco(Lista1,ParoleE)
Gioco(Lista2,ParoleE)
cdimauro
24-12-2008, 22:32
Ci siamo quasi. La strada è quella, ma puoi fare ancora meglio.
Ricorda che i dati che stai passando sono di natura diversa (numeri oppure parole), per cui puoi differenziare in maniera più fine il comportamento della funzione.
MasterDany
25-12-2008, 08:56
Ci siamo quasi. La strada è quella, ma puoi fare ancora meglio.
Ricorda che i dati che stai passando sono di natura diversa (numeri oppure parole), per cui puoi differenziare in maniera più fine il comportamento della funzione.
Posso vedere di che tipo è l'input se è un numero fa una cosa se è una stringa un'altra..è cosi?
MasterDany
25-12-2008, 10:05
Lista1=[3,6,9,12,13,15,18,21,24,27,30]
Lista2=["cane","gatto","gioco","mucca"]
ParoleE={"gioco":"risposta esatta","13":"risposta esatta"}
def Gioco(l1,pe):
print l1
if type(l1[0])==type("c"):
i_l1=raw_input("Qual'e'la parola sbagliata?")
else:
i_l1=raw_input("Qual'e'il numero sbagliato?")
print pe.get(i_l1,0)
Gioco(Lista1,ParoleE)
Gioco(Lista2,ParoleE)
MasterDany
25-12-2008, 11:20
Con il calcolo del punteggio
Lista1=[3,6,9,12,13,15,18,21,24,27,30]
Lista2=["cane","gatto","gioco","mucca"]
ParoleE={"gioco":"risposta esatta",13:"risposta esatta"}
def Gioco(l1,pe):
p=0
print l1
if type(l1[0])==type("c"):
i_l1=raw_input("Qual'e'la parola sbagliata?")
else:
i_l1=input("Qual'e'il numero sbagliato?")
print pe.get(i_l1,0)
if i_l1 in ParoleE:
p=p+1
else:
p=p+0
return p
P=Gioco(Lista1,ParoleE)+Gioco(Lista2,ParoleE)
print P
MasterDany
25-12-2008, 11:28
Lista1=[3,6,9,12,13,15,18,21,24,27,30]
Lista2=["io mangio","tu mangi","egli mangia","noi mangevamo","voi mangiate","essi mangiano"]
ParoleE={"noi mangevamo":"risposta esatta",13:"risposta esatta"}
def Gioco(l1,pe):
p=0
print l1
if type(l1[0])==type("c"):
i_l1=raw_input("Qual'e'la parola sbagliata?")
else:
i_l1=input("Qual'e'il numero sbagliato?")
print pe.get(i_l1,0)
if i_l1 in ParoleE:
p=p+1
else:
p=p+0
return p
P=Gioco(Lista1,ParoleE)+Gioco(Lista2,ParoleE)
print P
if P==2:
print "Bravo!"
elif P==1:
print "Bravo ma puoi migliorare"
else:
print "Studia di piu'"
Ho anche delle brutte notizie per cdmauro:Python scende di una posizione nella classifica di Tiobe :(
Per regalo di Natale mi sono letto questo (http://www.ruby-lang.org/it/documentation/quickstart/)
MasterDany
25-12-2008, 23:53
Come consigliato da Vicius:
Lista1=[3,6,9,12,13,15,18,21,24,27,30]
Lista2=["io mangio","tu mangi","egli mangia","noi mangevamo","voi mangiate","essi mangiano"]
Verbo_e,Numero_e="noi mangevamo",13
def Gioco(l1,pe):
p=0
print l1
if type(l1[0])==type("c"): #se la lista e' formata da stringhe allora stampa "Qual'e'la parola sbagliata?"
i_l1=raw_input("Qual'e'la parola sbagliata?")
else:
i_l1=input("Qual'e'il numero sbagliato?")#se la lista e' formata da numeri(interi)allora stampa "Qual'e' il numero sbagliato"
if i_l1==Verbo_e or Numero_e:
p=p+1 #calcolo del punteggio
print "Risposta esatta"
else:
"Risposta sbagliata"
p=p+0
return p
P=Gioco(Lista1,Verbo_e)+Gioco(Lista2,Numero_e)
print "Il tuo punteggio e':",P
if P==2:#calcolo del giudzio!
print "Bravo!"
elif P==1:
print "Bravo ma puoi migliorare"
else:
print "Studia di piu'"
cdimauro
26-12-2008, 06:30
Siamo ancora ben lontani.
Cerca di ripartire da questa (http://www.hwupgrade.it/forum/showpost.php?p=25578725&postcount=22) versione.
Come consigliato da Vicius:
Lista1=[3,6,9,12,13,15,18,21,24,27,30]
Lista2=["io mangio","tu mangi","egli mangia","noi mangevamo","voi mangiate","essi mangiano"]
Verbo_e,Numero_e="noi mangevamo",13
def Gioco(l1,pe):
p=0
print l1
if type(l1[0])==type("c"): #se la lista e' formata da stringhe allora stampa "Qual'e'la parola sbagliata?"
i_l1=raw_input("Qual'e'la parola sbagliata?")
else:
i_l1=input("Qual'e'il numero sbagliato?")#se la lista e' formata da numeri(interi)allora stampa "Qual'e' il numero sbagliato"
if i_l1==Verbo_e or Numero_e:
p=p+1 #calcolo del punteggio
print "Risposta esatta"
else:
"Risposta sbagliata"
p=p+0
return p
P=Gioco(Lista1,Verbo_e)+Gioco(Lista2,Numero_e)
print "Il tuo punteggio e':",P
if P==2:#calcolo del giudzio!
print "Bravo!"
elif P==1:
print "Bravo ma puoi migliorare"
else:
print "Studia di piu'"
Non era di certo questo a che pensavo quando ti ho suggerito di usare una semplice variabile al posto del dizionario per la risposta errata. Perché ora usi due variabili?
MasterDany
26-12-2008, 09:21
Non era di certo questo a che pensavo quando ti ho suggerito di usare una semplice variabile al posto del dizionario per la risposta errata. Perché ora usi due variabili?
Perchè ci sono due risposte esatte ;)
MasterDany
26-12-2008, 09:23
Come consigliato da Vicius:
Lista1=[3,6,9,12,13,15,18,21,24,27,30]
Lista2=["io mangio","tu mangi","egli mangia","noi mangevamo","voi mangiate","essi mangiano"]
Verbo_e,Numero_e="noi mangevamo",13
def Gioco(l1,pe):
p=0
print l1
if type(l1[0])==type("c"): #se la lista e' formata da stringhe allora stampa "Qual'e'la parola sbagliata?"
i_l1=raw_input("Qual'e'la parola sbagliata?")
else:
i_l1=input("Qual'e'il numero sbagliato?")#se la lista e' formata da numeri(interi)allora stampa "Qual'e' il numero sbagliato"
if i_l1==Verbo_e or Numero_e:
p=p+1 #calcolo del punteggio
print "Risposta esatta"
else:
"Risposta sbagliata"
p=p+0
return p
P=Gioco(Lista1,Verbo_e)+Gioco(Lista2,Numero_e)
print "Il tuo punteggio e':",P
if P==2:#calcolo del giudzio!
print "Bravo!"
elif P==1:
print "Bravo ma puoi migliorare"
else:
print "Studia di piu'"
Questa versione è praticamente identica ho solo aggiunto gli if
MasterDany
26-12-2008, 20:56
Siamo ancora ben lontani.
Cerca di ripartire da questa (http://www.hwupgrade.it/forum/showpost.php?p=25578725&postcount=22) versione.
Gli if sono obbligatori per il punteggio...cosi?
Lista1=[3,6,9,12,13,15,18,21,24,27,30]
Lista2=["io mangio","tu mangi","egli mangia","noi mangevamo","voi mangiate","essi mangiano"]
ParoleE={"noi mangevamo":"risposta esatta",13:"risposta esatta"}
Punteggio={2:"Bravo,hai ottenuto il massimo del punteggio",1:"Bravo hai fatto un punto su due,con 10 minuti di studio in piu' otterrai risultati migliori",0:"Non ci siamo proprio...non hai aperto libro"}
def Gioco(l1,pe):
p=0
print l1
if type(l1[0])==type("c"):
i_l1=raw_input("Qual'e'la parola sbagliata?")
else:
i_l1=input("Qual'e'il numero sbagliato?")
print pe.get(i_l1,0)
if i_l1 in ParoleE:
p=p+1
else:
p=p+0
return p
P=Gioco(Lista1,ParoleE)+Gioco(Lista2,ParoleE)
print Punteggio.get(P,"punteggio non valido,riavvia l'applicazione")
cdimauro
26-12-2008, 21:28
Se il punteggio prevede 2 messaggi per 2 precisi valori, e un messaggio per tutto il resto, non servono gli if: basta il dizionario.
Comunque sei ancora molto lontano. Non hai idea di quanto semplicemente si possa ridurre quel codice, sfruttando opportunamente la funzione e (soprattutto) i parametri.
Riflettici ancora un po', e non avere fretta.
MasterDany
26-12-2008, 21:32
Se guardi sopra li ho eliminati ;)
cdimauro
26-12-2008, 22:09
Ce n'è uno che si può eliminare sicuramente. ;)
MasterDany
27-12-2008, 10:39
Ce n'è uno che si può eliminare sicuramente. ;)
Ovviamente la chiave 0
MasterDany
27-12-2008, 11:50
Lista1=[3,6,9,12,13,15,18,21,24,27,30]
Lista2=["io mangio","tu mangi","egli mangia","noi mangevamo","voi mangiate","essi mangiano"]
ParoleE={"noi mangevamo":"risposta esatta",13:"risposta esatta"}
Punteggio={2:"Bravo,hai ottenuto il massimo del punteggio",1:"Bravo hai fatto un punto su due,con 10 minuti di studio in piu' otterrai risultati migliori"}
def Gioco(l1,pe):
p=0
print l1
if type(l1[0])==type("c"):
i_l1=raw_input("Qual'e'la parola sbagliata?")
else:
i_l1=input("Qual'e'il numero sbagliato?")
print pe.get(i_l1,0)
if i_l1 in ParoleE:
p=p+1
else:
p=p+0
return p
P=Gioco(Lista1,ParoleE)+Gioco(Lista2,ParoleE)
print Punteggio.get(P,",Non ci siamo proprio...non hai aperto libro")
Ecco.
Poi possiamo passargli anche solo la solzuione esatta quindi la chiave come argomento in questo modo:
Array=["noi mangevamo",13]
Poi gli passo apposto di paroleE qualcos'altro:
def Gioco(l1,pe):
....
if input==pe
Non ho testato quello che detto quindi non so se è corretto.Praticamente passo SOLO la risposta giusta come valore.
cdimauro
27-12-2008, 13:13
Io direi basta. Fermati un po' e rifletti.
Renditi conto che hai scritto un codice chilometrico quando sono necessarie poche righe di codice.
Quando avrai ottenuto un codice molto più compatto ne riparleremo.
MasterDany
27-12-2008, 17:55
Lista1=[3,6,9,12,13,15,18,21,24,27,30]
Lista2=["io mangio","tu mangi","egli mangia","noi mangevamo","voi mangiate","essi mangiano"]
ParoleE=["noi mangevamo",13]
Punteggio={2:"Bravo,hai ottenuto il massimo del punteggio",1:"Bravo hai fatto un punto su due,con 10 minuti di studio in piu' otterrai risultati migliori"}
def Gioco(l1,pe):
p=0
print l1
if type(l1[0])==type("c"):
i_l1=raw_input("Qual'e'la parola sbagliata?")
else:
i_l1=input("Qual'e'il numero sbagliato?")
if i_l1 ==pe:
print "risposta esatta"
p=p+1
else:
print "risposta sbagliata"
p=p+0
return p
P=Gioco(Lista1,ParoleE[1])+Gioco(Lista2,ParoleE[0])
print Punteggio.get(P,"NON HAI APERTO LIBRO!")
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.