Pythoni räsi ()

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 .

Objektide kohandatud räsi juurutamise 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 TypeErrorerandi, 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.

Huvitavad Artiklid...