內建函式高階 hash

2021-08-27 00:07:37 字數 1652 閱讀 3153

class

foo():

pass

obj1 = foo()

obj2 = foo()

print(hash(obj1)) # 記憶體位址 136382060082

print(hash(obj1)) # 記憶體位址 136382060082

print(hash(obj1)) # 記憶體位址 136382060082

print(hash(obj1)) # 記憶體位址 136382060082

print(hash(obj1)) # 175716959794 同樣的值第二次執行時,hash位址變了

每次執行hash值都會變化

在一次執行的過程中對同乙個值的hash結果總是不變的

set的去重機制就是hash演算法,

set中沒個值傳進去,首先給每個值賦予乙個hash值,然後如果值相等hash值必然一樣,再對比裡面的值是否相等

如果相等,給第第二個值再hash一下,給個新的hash位址給它,相比與用for迴圈去重節省時間和記憶體,for迴圈每個

值都比一下是否相等。如果資料量很大的話,用的時間非常多。

為什麼dict定址快,因為dict的key是可hash的,每個key都有乙個hash值,如果key很長,比如乙個物件,他對應的

就是個hash值,通過hash值直接可以找到這個hash值對應的位址中的值。

例class

staff:

# 定義乙個員工的類

def__init__

(self, name, age, ***, dep):

self.name = name

self.age = age

self.*** = ***

self.dep = dep

def__hash__

(self):

# 定義__hash__內建方法

return hash(self.name + self.***) # 返回的是名字和性別的hash值的和,由於物件是不可hash的,又想用hash的方法找出名字和性別一樣的員工,name和***是字串,可hash

def__eq__

(self, other):

if self.name == other.name and self.*** == other.***:

return

true

#name_lst = ['yuan', 'laura', 'wendy', 'sinila']

obj_lst =

for i in range(100):

name = name_lst[i % 4] # 列表裡面4個值,1到100除4,取餘數,

obj = staff(name, i, 'male', 'python')

print(obj_lst)

ret = set(obj_lst) # 集合的執行機制中這個hash()方法和==方法,這兩個方法自動觸發類中的__hash__方法,然後再觸發__eq__方法

print(ret)

for i in ret:

print(i.name, i.age)

>>>

sinila 3

wendy 2

laura 1

yuan 0

內建高階函式

1.map 函式,可迭代物件 使用可迭代物件中的每個元素呼叫函式,將返回值作為新可迭代物件元素 返回值為新可迭代物件。2.filter 函式,可迭代物件 根據條件篩選可迭代物件中的元素,返回值為新可迭代物件。3.sorted 可迭代物件,key 函式,reverse bool值 排序,返回值為排序結...

hash函式高階一

通過乙個例子來熟悉hash函式的功能作用以及如何使用。1 有100萬個ip位址,從中查詢是否存在待查的ip位址 2 使用hash對映來實現 1 hash表面上看起來只是將輸入物件雜湊到hash表中,其實在使用使用中過程有 2 使用c語言的隨機函式生成ip位址,模擬海量資料處理 define maxi...

python 內建高階函式

1.map abs i for i in 1,3,4,5 1 對於序列每個元素求絕對值 import random from functools import reduce print list map abs,1,3,4,5 2 對於序列每個元素求階乘 5 import random deffac...