1.set集合的去重機制
ps: set集合在內部執行時,首先會先對對象執行hash算法,存儲到內存空間,
(但在同一次運行過程中兩個值相等的對象hash值一樣)所以如果兩個對象值相等,這時會做出第二步操作,
判斷這兩個對象的值是否相等,若相等覆蓋,若不等則進行二次尋址,存儲到空間;
*****那麼問題來了!!!*****
看下面這道題:
1)創建一個員工管理系統 2)對象的屬性爲:姓名,年齡,性別,部門
3)在公司的日誌中可能有的員工會出現內部轉崗的情況,所以會有重複的信息
4)現有200個員工,如果幾個員工對象的姓名和性別相同,那麼這是同一個人,進行去重操作
class Person:
def __init__(self,name,sex,age,partment):
self.name = name
self.sex = sex
self.age = age
self.partment = partment
def __hash__(self):
return hash((self.name,self.sex))
def __eq__(self, other):
if self.name == other.name and self.age == other.age:
return True
employeeList = []
for i in range(3):
employeeList.append(Person('li','男',15,'Python'))
for i in range(3):
employeeList.append(Person('wu', '男', 15, '運維'))
for i in range(3):
employeeList.append(Person('alex', '男', 15, 'linux'))
obj = set(employeeList)
for i in obj:
print(i.__dict__)
#set集合會先觸發對象的__hash__方法,如果hash值相等,再觸發__eq__方法進行去重操作
輸出結果:
{'name': 'li', 'sex': '男', 'age': 15, 'partment': 'Python'}
{'name': 'wu', 'sex': '男', 'age': 15, 'partment': '運維'}
{'name': 'alex', 'sex': '男', 'age': 15, 'partment': 'linux'}
總結:set集合去重機制是先對對象進行hash,如若hash值相等,再比較兩個值是否相等,如若不等,則進行二次尋址;
這個算法設計具有一定的可靠性;
2.幾種set集合去重的辦法
1)直接使用
ls = [1,2,2,3,5,5,4,4]
print(list(set(ls)))
#結果:[1, 2, 3, 4, 5]
#爲什麼結果是排序之後的結果呢,因爲數字的hash值是它本身
2)列表推導式
ls = [1,2,2,3,5,5,4,4]
new_ls = []
[new_ls.append(i) for i in ls if i not in new_ls]
print(new_ls)
#結果:[1, 2, 3, 5, 4]
3)keys()方法:
ls = [1,2,2,3,5,5,4,4]
print(list(dict.fromkeys(ls).keys()))
#結果:[1, 2, 3, 5, 4]
4.按照索引再次排序:
ls = [1,2,2,3,5,5,4,4]
obj = list(set(ls))
obj.sort(key=ls.index)
print(obj)
#結果:[1, 2, 3, 5, 4]
裝飾器
# ----展開版(裝飾器攜帶參數----
def test2():
print('test2')
def fn(f):
# 嵌套多層,接收參數
def outter(fun):
def inner():
print(f)
fun()
print('hou')
return inner
return outter
outter = fn('qq')
inner = outter(test2)
inner()
# ---正規版---
def fun(f):
def outter(fun):
def inner():
print(f)
fun()
print('後')
return inner
return outter
@fun('qq')
def test1():
print('test1')
test1()
關於裝飾器的題目:
- 實現一個裝飾器,限制該函數調用頻率,如10秒一次
-
import time def fun(fn): dic = {} def inner(*args, **kwargs): if not dic.get(fn): print('執行函數') dic.setdefault(fn, time.time()) return fn(*args, **kwargs) else: print(time.time()) if time.time() - dic.get(fn) > 0.01: return '不執行函數' else: print('時間通過,執行函數') return fn(*args, **kwargs) return inner @fun def test(f): return 111 # for i in range(0, 800): # print(test(i)) @fun def test2(): return 222 print(test2())