Metode hash () atgriež objekta jaukšanas vērtību, ja tāda ir.
Hash vērtības ir tikai veseli skaitļi, kurus izmanto, lai ātri meklētu vārdnīcas taustiņus vārdnīcas taustiņos.
Iekšēji hash()
metode izsauc __hash__()
objekta metodi, kas pēc noklusējuma ir iestatīta jebkuram objektam. Mēs to apskatīsim vēlāk.
Metodes sintakse hash()
ir:
hash (objekts)
hash () parametri
hash()
metode prasa vienu parametru:
- objekts - objekts, kura hash vērtība ir jāatdod (vesels skaitlis, virkne, pludiņš)
Atgriezeniskā vērtība no hash ()
hash()
metode atgriež objekta jaukšanas vērtību, ja tāda ir.
Ja objektam ir pielāgota __hash__()
metode, tas saīsina atgriešanās vērtību līdz Py_ssize_t
.
1. piemērs: Kā hash () darbojas Python?
# hash for integer unchanged print('Hash for 181 is:', hash(181)) # hash for decimal print('Hash for 181.23 is:',hash(181.23)) # hash for string print('Hash for Python is:', hash('Python'))
Rezultāts
Hash for 181 is: 181 Hash for 181.23 is: 530343892119126197 Hash for Python is: 2230730083538390373
2. piemērs: hash () nemainīgam dubultā objektam?
hash()
metode darbojas tikai nemainīgiem objektiem kā dubultā.
# tuple of vowels vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels))
Rezultāts
Hash ir: -695778075465126279
Kā hash () darbojas pielāgotajiem objektiem?
Kā minēts iepriekš, hash()
metode iekšēji izsauc __hash__()
metodi. Tātad jebkurš objekts var ignorēt __hash__()
pielāgotās jaukšanas vērtības.
Bet pareizai hash ieviešanai __hash__()
vienmēr jāatgriež vesels skaitlis. Un, gan __eq__()
un __hash__()
metodēm ir jāievieš.
Tālāk ir norādīti pareizi __hash__()
ignorēšanas gadījumi .
__eq __ () | __hash __ () | Apraksts |
---|---|---|
Definēts (pēc noklusējuma) | Definēts (pēc noklusējuma) | Ja atstāj tādu, kāds tas ir, visi objekti salīdzina nevienlīdzīgu (izņemot sevi) |
(Ja maināms) Definēts | Nevajadzētu definēt | Jaucamās kolekcijas ieviešana prasa, lai atslēgas jaukšanas vērtība būtu nemainīga |
Nav definēts | Nevajadzētu definēt | Ja __eq__() tas nav definēts, to __hash__() nevajadzētu definēt. |
Definēts | Nav definēts | Klases gadījumi nebūs izmantojami kā jaucama kolekcija. __hash __ () implicititāte ir iestatīta uz None . Palielina TypeError izņēmumu, ja mēģina izgūt hash. |
Definēts | Saglabāt no vecākiem | __hash__ = .__hash__ |
Definēts | Negrib jaukt | __hash__ = None . Paaugstina TypeError izņēmumu, ja mēģina izgūt hash. |
3. piemērs: hash () pielāgotajiem objektiem, aizstājot __hash __ ()
class Person: def __init__(self, age, name): self.age = age self.name = name def __eq__(self, other): return self.age == other.age and self.name == other.name def __hash__(self): print('The hash is:') return hash((self.age, self.name)) person = Person(23, 'Adam') print(hash(person))
Rezultāts
Hash ir: 3785419240612877014
Piezīme: jums nav jāievieš __eq__()
hash metode, jo tā pēc noklusējuma tiek izveidota visiem objektiem.