Hash () -menetelmä palauttaa objektin hash-arvon, jos sillä on sellainen.
Hash-arvot ovat vain kokonaislukuja, joita käytetään vertaamaan sanakirjaavaimia sanakirjan haun aikana nopeasti.
Sisäisesti hash()
method kutsuu __hash__()
objektin metodia, joka on oletusarvoisesti asetettu mille tahansa objektille. Katsomme tätä myöhemmin.
Menetelmän syntaksi hash()
on:
hash (objekti)
hash () -parametrit
hash()
menetelmä ottaa yhden parametrin:
- object - objekti, jonka hash-arvo on palautettava (kokonaisluku, merkkijono, kelluva)
Palautusarvo tiivisteestä ()
hash()
method palauttaa objektin hash-arvon, jos sillä on sellainen.
Jos objektilla on mukautettu __hash__()
menetelmä, se katkaisee palautusarvon Py_ssize_t
.
Esimerkki 1: Kuinka hash () toimii Pythonissa?
# 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'))
Tuotos
Hash for 181 on: 181 Hash for 181.23 is: 530343892119126197 Hash for Python is: 2230730083538390373
Esimerkki 2: hash () muuttumattomalle dupleksiobjektille?
hash()
-menetelmä toimii vain muuttumattomien objektien kanssa dupleksinä.
# tuple of vowels vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels))
Tuotos
Hajautusarvo on: -695778075465126279
Kuinka hash () toimii mukautetuissa kohteissa?
Kuten edellä todettiin, hash()
menetelmä kutsuu sisäisesti __hash__()
menetelmää. Joten kaikki objektit voivat ohittaa __hash__()
mukautetut hajautusarvot.
Mutta oikean hash-toteutuksen __hash__()
tulisi aina palauttaa kokonaisluku. Ja molemmat __eq__()
ja __hash__()
menetelmät on toteutettava.
Alla on ilmoitettu oikeiden __hash__()
ohitusten tapaukset.
__eq __ () | __hash __ () | Kuvaus |
---|---|---|
Määritelty (oletuksena) | Määritelty (oletuksena) | Jos jätetään sellaisenaan, kaikki objektit vertailevat eriarvoisuutta (paitsi itse) |
(Jos muutettavissa) Määritelty | Ei pitäisi määritellä | Hajautettavan kokoelman toteuttaminen edellyttää, että avaimen hajautusarvo on muuttumaton |
Ei määritelty | Ei pitäisi määritellä | Jos sitä __eq__() ei ole määritelty, __hash__() sitä ei pitäisi määritellä. |
Määritelty | Ei määritelty | Luokan esiintymiä ei voi käyttää hajautettavana kokoelmana. __hash __ () implisiitti asetettu arvoon None . Lisää TypeError poikkeuksen, jos yritetään noutaa hash. |
Määritelty | Säilytä vanhemmilta | __hash__ = .__hash__ |
Määritelty | Ei halua hajauttaa | __hash__ = None . Korottaa TypeError-poikkeuksen, jos yritetään noutaa hash. |
Esimerkki 3: Hajautus () mukautetuille objekteille korvaamalla __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))
Tuotos
Hajautusarvo on: 3785419240612877014
Huomaa: Sinun ei tarvitse ottaa käyttöön __eq__()
hash-menetelmää, koska se luodaan oletusarvoisesti kaikille kohteille.