Hash () meetod tagastab objekti räsiväärtuse, kui see on olemas.
Räsi väärtused on vaid täisarvud, mida kasutatakse sõnastiku võtmete võrdlemiseks sõnastiku kiirotsingu ajal.
Sisemiselt hash()
kutsub __hash__()
meetod välja objekti meetodi, mis on vaikimisi määratud mis tahes objektile. Vaatame seda hiljem.
Meetodi süntaks hash()
on:
räsi (objekt)
räsi () parameetrid
hash()
meetod võtab ühe parameetri:
- objekt - objekt, mille räsiväärtus tagastatakse (täisarv, string, ujuk)
Räsi () tagastusväärtus
hash()
meetod tagastab objekti räsiväärtuse, kui see on olemas.
Kui objektil on kohandatud __hash__()
meetod, kärbib see tagastatava väärtuse suuruseks Py_ssize_t
.
Näide 1: Kuidas hash () Pythonis töötab?
# 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'))
Väljund
Hash for 181 on: 181 Hash for 181.23 is: 530343892119126197 Hash for Python is: 2230730083538390373
Näide 2: räsi () muutumatule kahele objektile?
hash()
meetod töötab ainult muutumatute objektide korral kahekordsena.
# tuple of vowels vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels))
Väljund
Räsi on: -695778075465126279
Kuidas räsi () kohandatud objektide puhul töötab?
Nagu eespool öeldud, hash()
kutsub __hash__()
meetod sisemiselt meetodit. Niisiis võivad kõik objektid __hash__()
kohandatud räsiväärtuste korral alistada .
Kuid räsimise õigeks rakendamiseks __hash__()
peaks alati tagastama täisarv. Ja tuleb rakendada nii mõlemaid __eq__()
kui ka __hash__()
meetodeid.
Allpool on toodud õige __hash__()
alistamise juhtumid .
__eq __ () | __hash __ () | Kirjeldus |
---|---|---|
Määratletud (vaikimisi) | Määratletud (vaikimisi) | Kui see jäetakse seisma, võrreldakse kõiki objekte ebavõrdsena (välja arvatud nad ise) |
(Kui muudetav) Määratletud | Ei tohiks määratleda | Räsitava kogumise rakendamine nõuab, et võtme räsi väärtus oleks muutumatu |
Ei ole defineeritud | Ei tohiks määratleda | Kui __eq__() seda pole määratletud, __hash__() ei tohiks seda määratleda. |
Määratletud | Ei ole defineeritud | Kursuse eksemplare ei saa kasutada räsitavate kogudena. __hash __ () implitsiit on seatud väärtusele None . Tõstab TypeError erandi, kui proovitakse räsi hankida. |
Määratletud | Hoidke vanema juures | __hash__ = .__hash__ |
Määratletud | Ei taha räsida | __hash__ = None . Tõstab TypeError erandi, kui proovitakse räsi hankida. |
Näide 3: räsi () kohandatud objektide jaoks, asendades __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))
Väljund
Räsi on: 3785419240612877014
Märkus. Te ei pea __eq__()
räsi meetodit rakendama, kuna see luuakse vaikimisi kõigi objektide jaoks.