Programmazione > Python

metodo __cmp__

(1/2) > >>

Linux1997:
Code: You are not allowed to view links. Register or Logindvalori = {"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

--- End code ---

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.

davenull:
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.

Linux1997:
grazie lo faro´ la prossima volta.

devilicecream:
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!

Linux1997:
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

Navigation

[0] Message Index

[#] Next page

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 
There was an error while thanking
Thanking...
Go to full version