Metoden hash () returnerer hash-værdien af et objekt, hvis det har et.
Hash-værdier er bare heltal, der bruges til at sammenligne ordbogstaster hurtigt under en ordbogsopslag.
Internt hash()
kalder __hash__()
metoden metode til et objekt, der som standard er indstillet til ethvert objekt. Vi ser på det senere.
Syntaksen for hash()
metoden er:
hash (objekt)
hash () Parametre
hash()
metoden tager en enkelt parameter:
- objekt - det objekt, hvis hash-værdi skal returneres (heltal, streng, float)
Returneringsværdi fra hash ()
hash()
metoden returnerer hash-værdien af et objekt, hvis det har en.
Hvis et objekt har en tilpasset __hash__()
metode, afkortes returværdien til størrelsen på Py_ssize_t
.
Eksempel 1: Hvordan fungerer hash () i 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'))
Produktion
Hash for 181 er: 181 Hash for 181,23 er: 530343892119126197 Hash for Python er: 2230730083538390373
Eksempel 2: hash () til uforanderlig tupleobjekt?
hash()
metoden fungerer kun for uforanderlige objekter som tuple.
# tuple of vowels vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels))
Produktion
Hashet er: -695778075465126279
Hvordan fungerer hash () til brugerdefinerede objekter?
Som nævnt ovenfor hash()
kalder __hash__()
metoden internt metoden. Så alle objekter kan tilsidesættes __hash__()
for brugerdefinerede hash-værdier.
Men for korrekt hash-implementering __hash__()
skal det altid returnere et heltal. Og både __eq__()
og __hash__()
metoder skal implementeres.
Nedenfor er tilfældene for korrekt __hash__()
tilsidesættelse.
__eq __ () | __hash __ () | Beskrivelse |
---|---|---|
Defineret (som standard) | Defineret (som standard) | Hvis de forbliver som de er, sammenligner alle objekter ulige (undtagen dem selv) |
(Hvis det kan ændres) Defineret | Bør ikke defineres | Implementering af hashable-indsamling kræver, at nøgles hash-værdi er uforanderlig |
Ikke defineret | Bør ikke defineres | Hvis __eq__() ikke er defineret, __hash__() skal det ikke defineres. |
Defineret | Ikke defineret | Klasseinstanser kan ikke bruges som hashable-samling. __hash __ () implicitet indstillet til None . Hæver TypeError undtagelse, hvis det forsøges at hente hashen. |
Defineret | Behold fra forælder | __hash__ = .__hash__ |
Defineret | Vil ikke hash | __hash__ = None . Hæver TypeError-undtagelsen, hvis den forsøges at hente hashen. |
Eksempel 3: hash () til brugerdefinerede objekter ved at tilsidesætte __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))
Produktion
Hashet er: 3785419240612877014
Bemærk: Du behøver ikke implementere __eq__()
metoden til hashen, da den oprettes som standard for alle objekter.