Hash () yöntemi, varsa bir nesnenin karma değerini döndürür.
Karma değerler, sözlük araması sırasında sözlük anahtarlarını hızlı bir şekilde karşılaştırmak için kullanılan tam sayılardır.
Dahili olarak, hash()
yöntem __hash__()
herhangi bir nesne için varsayılan olarak ayarlanan bir nesnenin yöntemini çağırır . Buna daha sonra bakacağız.
hash()
Yöntemin sözdizimi şöyledir:
karma (nesne)
hash () Parametreler
hash()
yöntem tek bir parametre alır:
- nesne - hash değeri döndürülecek nesne (tamsayı, dize, kayan nokta)
Hash () değerinden dönüş değeri
hash()
yöntem, eğer varsa, bir nesnenin karma değerini döndürür.
Bir nesnenin özel __hash__()
yöntemi varsa , dönüş değerini boyutuna kısaltır Py_ssize_t
.
Örnek 1: Hash () Python'da nasıl çalışır?
# 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'))
Çıktı
181 için karma şudur: 181.23 için 181 Karma şudur: 530343892119126197 Python için Karma: 2230730083538390373
Örnek 2: immutable tuple nesnesi için hash ()?
hash()
yöntem yalnızca demet olarak değişmez nesneler için çalışır.
# tuple of vowels vowels = ('a', 'e', 'i', 'o', 'u') print('The hash is:', hash(vowels))
Çıktı
Karma: -695778075465126279
Hash () özel nesneler için nasıl çalışır?
Yukarıda belirtildiği gibi, hash()
yöntem dahili olarak __hash__()
yöntemi çağırır . Bu nedenle, herhangi bir nesne __hash__()
özel hash değerleri için geçersiz kılabilir .
Ancak doğru hash uygulaması için __hash__()
her zaman bir tamsayı döndürmelidir. Ve, hem __eq__()
ve __hash__()
yöntemler uygulanması gerekir.
Doğru __hash__()
geçersiz kılma durumları aşağıdadır .
__eq __ () | __hash __ () | Açıklama |
---|---|---|
Tanımlı (varsayılan olarak) | Tanımlı (varsayılan olarak) | Olduğu gibi bırakılırsa, tüm nesneler eşit değildir (kendileri hariç) |
(Değiştirilebilirse) Tanımlı | Tanımlanmamalı | Hashable koleksiyonunun uygulanması, anahtarın hash değerinin değişmez olmasını gerektirir |
Tanımlanmamış | Tanımlanmamalı | Eğer __eq__() tanımlı değil, __hash__() tanımlanmış edilmemelidir. |
Tanımlı | Tanımlanmamış | Sınıf örnekleri, hashable koleksiyon olarak kullanılamayacaktır. __hash __ () implicity olarak ayarlandı None . Hash'i TypeError almaya çalışırsa istisnayı yükseltir . |
Tanımlı | Ebeveynden Al | __hash__ = .__hash__ |
Tanımlı | Hash yapmak istemiyor | __hash__ = None . Hash'i almaya çalışırsa TypeError istisnasını yükseltir. |
Örnek 3: __hash __ () geçersiz kılarak Özel Nesneler için 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))
Çıktı
Karma: 3785419240612877014
Not:__eq__()
Tüm nesneler için varsayılan olarak oluşturulduğundan, karma yöntemi uygulamanız gerekmez .