Python hash ()

A hash () metódus egy objektum hash értékét adja vissza, ha rendelkezik ilyennel.

A hash értékek csak egész számok, amelyeket a szótár kulcsainak összehasonlítására használnak a szótár gyors keresése során.

Belsőleg a hash()method hívja __hash__()meg az objektum metódusát, amelyet alapértelmezés szerint bármely objektumhoz beállítanak. Ezt később megnézzük.

A hash()módszer szintaxisa :

 hash (objektum)

hash () paraméterek

hash() A módszer egyetlen paramétert vesz fel:

  • object - az az objektum, amelynek hash értékét vissza kell adni (egész szám, karakterlánc, float)

A hash () visszatérési értéke

hash() A metódus egy objektum hash értékét adja vissza, ha rendelkezik ilyennel.

Ha egy objektum egyéni __hash__()metódussal rendelkezik, akkor a visszatérési értéket a méretre csonkolja Py_ssize_t.

1. példa: Hogyan működik a hash () a Pythonban?

 # 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'))

Kimenet

 Hash for 181 is: 181 Hash for 181.23 is: 530343892119126197 Hash for Python is: 2230730083538390373 

2. példa: hash () változatlan tuple objektumhoz?

hash() metódus csak megváltoztathatatlan objektumok esetén működik kettősként.

 # tuple of vowels vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels))

Kimenet

 A kivonat: -695778075465126279

Hogyan működik a hash () az egyedi objektumoknál?

Amint fentebb említettük, a hash()method belső hívás __hash__()módszer. Tehát bármely objektum felülírhatja __hash__()az egyedi kivonatolási értékeket.

A helyes kivonatolás megvalósításához __hash__()azonban mindig egész számot kell adnia. És mindkettőt, __eq__()és a __hash__()módszereket is végre kell hajtani.

Az alábbiakban bemutatjuk a helyes __hash__()felülírás esetét .

Az objektumok egyedi kivonatolásának esetei
__eq __ () __hash __ () Leírás
Meghatározott (alapértelmezés szerint) Meghatározott (alapértelmezés szerint) Ha van, akkor minden objektum egyenlőtlen (önmaguk kivételével)
(Ha változtatható) Meghatározott Nem szabad meghatározni A hashable gyűjtemény megvalósításához a kulcs hash értéke változhatatlan
Nem meghatározott Nem szabad meghatározni Ha __eq__()nincs meghatározva, akkor __hash__()nem szabad meghatározni.
Meghatározott Nem meghatározott Az osztálypéldányok nem lesznek használhatók hashable gyűjteményként. __hash __ () implicititás beállítva None. TypeErrorKivételt emel, ha megpróbálja lekérni a kivonatot.
Meghatározott Megtartás a szülőtől __hash__ = .__hash__
Meghatározott Nem akar hashelni __hash__ = None. Emeli a TypeError kivételt, ha megpróbálja lekérni a kivonatot.

3. példa: hash () az egyéni objektumokhoz a __hash __ () felülírásával

 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))

Kimenet

 A kivonat: 3785419240612877014

Megjegyzés: Nem kell végrehajtania __eq__()a kivonatolás metódusát, mivel az alapértelmezés szerint minden objektumra létrejön.

érdekes cikkek...