Python hash ()

Metoda hash () vrací hodnotu hash objektu, pokud ji má.

Hodnoty hash jsou pouze celá čísla, která se používají k rychlému porovnání slovníkových klíčů během vyhledávání slovníku.

hash()Metoda interně volá __hash__()metodu objektu, která je ve výchozím nastavení nastavena pro libovolný objekt. Podíváme se na to později.

Syntaxe hash()metody je:

 hash (objekt)

hash () parametry

hash() metoda má jeden parametr:

  • objekt - objekt, jehož hash hodnota má být vrácena (celé číslo, řetězec, float)

Vrátit hodnotu z hash ()

hash() metoda vrátí hodnotu hash objektu, pokud ji má.

Pokud má objekt vlastní __hash__()metodu, zkrátí návratovou hodnotu na velikost Py_ssize_t.

Příklad 1: Jak hash () funguje v Pythonu?

 # 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ýstup

 Hash pro 181 je: 181 Hash pro 181.23 je: 530343892119126197 Hash pro Python je: 2230730083538390373 

Příklad 2: hash () pro neměnný objekt řazené kolekce členů?

hash() metoda funguje pouze pro neměnné objekty jako n-tice.

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

Výstup

 Hodnota hash je: -695778075465126279

Jak hash () funguje pro vlastní objekty?

Jak je uvedeno výše, hash()metoda interně volá __hash__()metodu. Takže jakékoli objekty mohou přepsat __hash__()vlastní hodnoty hash.

Ale pro správnou implementaci hash __hash__()by měl vždy vrátit celé číslo. A musí být implementovány obě metody __eq__()a __hash__().

Níže jsou uvedeny případy správného __hash__()přepsání.

Případy implementace vlastní hash pro objekty
__eq __ () __hash __ () Popis
Definováno (ve výchozím nastavení) Definováno (ve výchozím nastavení) Pokud jsou ponechány tak, jak jsou, všechny objekty se nerovnají (kromě sebe)
(Pokud je měnitelné) Definováno Nemělo by být definováno Implementace hashable kolekce vyžaduje, aby hodnota hash klíče byla neměnná
Není definovaný Nemělo by být definováno Pokud __eq__()není definováno, __hash__()nemělo by být definováno.
Definována Není definovaný Instance třídy nebudou použitelné jako hashovatelná kolekce. __hash __ () implicita nastavena na None. Vyvolá TypeErrorvýjimku, pokud se pokusí načíst hash.
Definována Zachovat od rodiče __hash__ = .__hash__
Definována Nechce hash __hash__ = None. Vyvolá výjimku TypeError, pokud se pokusí načíst hash.

Příklad 3: hash () pro vlastní objekty přepsáním __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ýstup

 Hodnota hash je: 3785419240612877014

Poznámka:__eq__() Pro hash nemusíte implementovat metodu, protože je ve výchozím nastavení vytvořena pro všechny objekty.

Zajímavé články...