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í.
__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á TypeError vý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.