Python hash ()

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 .

Gadījumi objektu pielāgotās jaukšanas ieviešanai
__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 TypeErrorizņē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.

Interesanti raksti...