Python karması ()

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 .

Nesneler için özel karma uygulama durumları
__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 .

Ilginç makaleler...