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())