Author Topic: metodo __cmp__  (Read 2289 times)

Offline Linux1997

metodo __cmp__
« on: December 31, 2016, 12:52:08 PM »
Code: You are not allowed to view links. Register or Login
dvalori = {"Asso":1,"Due":2,"Tre":3,"Quattro":4,"Cinque":5,"Sei":6,"Sette":7,"Otto":8,"Nove":9,"Dieci":10,"Jack":11,"Regina":12,"Re":13}

class carta:

def __init__ (ob,valore):
ob.valore = valore

def __cmp__ (ob1,ob2):

if dvalori[ob1.valore] > dvalori[ob2.valore]: return 1
if dvalori[ob1.valore] < dvalori[ob2.valore]: return -1
return 0

C1 = carta("Asso")
C2 = carta("Due")

print  C1 <  C2

Ciao ragazzi vorrei che qualcuno mi spiegasse una cosa molto banale.  Ho iniziato da poco python e sto testando alcune funzioni. Ho ridefinito gli operatori di confronto con il metodo __cmp__ per poter confrontare l´attributo valore di due oggetti. Il risultato e´ giusto ossia C1 <  C2 mi da vero ma non capisco come mi dia questo risultato. Cioe' il pc sa che sta controllando se C1 < C2 ma non sa se effettivamente C1 lo e' non essendo direttamente un valore numerico. Ho capito che il risultato dipende da return 1 e return -1 ma non ho compreso del tutto come sta elaborando i dati.
« Last Edit: January 05, 2017, 12:03:33 AM by Linux1997 »
Giuseppe Rossini
 

Offline davenull

  • Administrator
  • Sr. Member
  • *****
  • Posts: 321
  • Thanked: 13 times
  • Gender: Male
  • JonixLug Co-Founder & Administrator
    • View Profile
    • davenull's blog
Re:metodo __cmp__
« Reply #1 on: January 04, 2017, 03:37:18 AM »
il codice racchiudilo nel tag bbcode code, ora te lo faccio io, qualcuno ti risponderà, non sono pratico di python quindi non ti posso aiutare.
E-Mail: [email protected]
Website: You are not allowed to view links. Register or Login

You are not allowed to view links. Register or Login
 

Offline Linux1997

Re:metodo __cmp__
« Reply #2 on: January 05, 2017, 12:04:23 AM »
grazie lo faro´ la prossima volta.
Giuseppe Rossini
 

Offline devilicecream

Re:metodo __cmp__
« Reply #3 on: January 05, 2017, 11:11:14 PM »
Ciao!
Python usa ogni tanto delle convenzioni un po' strane: il motivo per cui carta("Asso") è minore di carta("Due") è perchè la parola asso "Asso" è lessicograficamente minore di "Due". Qui la doc ufficiale dove spiega (in inglese) come funziona You are not allowed to view links. Register or Login.


Riassumendo, se in python usi gli operatori > e < per comparare delle stringhe, quello che succede è che lui scorrerà entrambe le stringhe carattere per carattere a partire dall'inizio (indice 0). Se i caratteri allo stesso indice corrispondono, passerà a comparare i caratteri dell'indice successivo. Nel momento in cui i caratteri allo stesso indice non corrispondono, la stringa che contiene il carattere con valore ASCII maggiore viene considerata maggiore dell'altra.


In questo caso specifico, visto che all'indice zero delle due stringhe ci sono "A" e "D", la stringa che inizia per "D" sarà maggiore dell'altra.


------


Per correggere il tuo codice, ti consiglio di dare alla classe Carta (le classi in python dovrebbero sempre avere nomi in maiuscolo) due attributi: nome e valore.
L'init dovrebbe poi prendere come parametro l'attributo nome, e assegnare all'attributo valore dvalori[self.nome].
In questo modo, senza cambiare il metodo __cmp__ rispetto a come l'hai fatto tu, nè la maniera di inizializzare un oggetto di classe Carta, otterrai il risultato che volevi.


Buona fortuna nell'imparare python!
 

Offline Linux1997

Re:metodo __cmp__
« Reply #4 on: January 06, 2017, 12:41:11 AM »
Grazie ma la gestione delle stringhe in python mi era già chiara. Sapevo per esempio che A < B < C. Quello che io intendevo era perché l'espressione con il > ritorna 1 e quella con il < invece -1. E dato che esegue 1<2 ritorna vero
Giuseppe Rossini
 

Offline devilicecream

Re:metodo __cmp__
« Reply #5 on: January 07, 2017, 04:36:37 PM »
You are not allowed to view links. Register or Login
Grazie ma la gestione delle stringhe in python mi era già chiara. Sapevo per esempio che A < B < C. Quello che io intendevo era perché l'espressione con il > ritorna 1 e quella con il < invece -1. E dato che esegue 1<2 ritorna vero
Il tuo codice non esegue 1<2, visto che compara i valori dell'attributo "valore" dei due oggetti, ovvero "Asso" e "Due".
Quello che succede nel tuo codice è che lui esegue "Asso" < "Due" e, per quello che ti ho spiegato prima, il risultato è True, perchè "Asso" è lessicograficamente inferiore a "Due". Quel codice non ha alcuna idea che "Asso" corrisponde ad 1 e "Due" a 2.
Come scritto nello scorso commento, se vuoi che vengano comparati i valori numerici, ti conviene dare alla classe Carta due attributi: uno numerico per il valore e una stringa per il nome della carta. Quindi nel metodo __cmp__ compari i valori numerici.


Se poi la domanda invece è come funziona il metodo __cmp__, quella è un'altra convenzione di python. Quando vengono utilizzati gli operatori di comparazione, infatti, l'interprete chiama la funzione __cmp__ per determinare se il primo argomento è maggiore del secondo (la funzione deve ritornare 1), se sono uguali (la funzione deve tornare 0), o se il secondo è maggiore del primo (la funzione deve ritornare -1). Sovrascrivendo la funzione in una classe si può implementare un metodo di comparazione di due oggetti di quella classe (o derivate) a piacere dello sviluppatore.
 

Offline Linux1997

Re:metodo __cmp__
« Reply #6 on: January 08, 2017, 12:15:52 AM »
Ok grazie quindi è il metodo cmp che funziona in quel modo. Scusami ma il codice confronta i valori numeri o sbaglio? Nell`attributo valore dei due oggetti viene memorizzato Asso e Due, poi per il confronto recupera dal dizionario dvalori il valore numerico corrispondente usando Asso e due come chiavi.
Giuseppe Rossini
 

Offline devilicecream

Re:metodo __cmp__
« Reply #7 on: January 15, 2017, 02:14:45 AM »
Yep, hai ragione! Per qualche motivo pensavo che non stessi recuperando i valori numerici dal dizionario ma comparando direttamente le due stringhe!
 

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40