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 TypeErroralmaya ç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 .








