07xx-函数式++
自定义高阶函数:
地址>>> ../common/iterable_tools
简单来说,就是自己定义一些函数,里面有很多内容,比如删除指定对象的xxx,比较xxx,排序xxx
这些函数就做成接口那样的,传参要一个函数,那个函数可以是lambda(匿名函数,只用一次,无复用性),也可以是你的def函数
一般你传的函数返回一个布尔值,决定if条件,反正就那样,类似于之前面向对象的类的接口
你写的这个工具要求有很强的通用性,所以他才叫tools
内置高阶函数
print(list(map(lambda item:item.name,list_employees)))
映射
filter(lambda e:e.did == 9001,list_employees)
过滤器 过滤满足条件的数
max(list_employees,key = lambda e:e.money)
min(list_employees,key = lambda e:e.money)
最大值/最小值
list_employees.sort(key = lambda e:e.eid)
list_employees.sort(key = lambda e:e.eid, reverse=True)
升序/降序排列
sorted(list_employees,key = lambda e:e.eid)
对可迭代对象(字典等等)排列,他返回一个新【列表】
# sorted(dict_person,key = lambda kv:kv.kv[1])
# 返回的只有名字,不是整个字典排过后的,你要返回整个的话,你写dict_preson.items()
高内聚,低耦合
高内聚:同一个类要尽量聚合,比如2048,所有方式的移动最终都调用的merge(合并)函数,这样的话方便程序改动
低耦合:前后端分离,v1,v2,v3... --> V === C <-- c1,c2,c3...
前端变化不影响后端,后端波动不影响前端
【降维思想】重要
比如x,y,z,三维,我从上面往下看,就只有二维了,只考虑x,y
再把x,y降低,变为一维,做完一维之后想办法转换,比如2048里矩阵转置
像处理excel,就可以用这个思想,行列转换
res = func01()
不能说res调用的外函数,而是调用外函数之后,res存储的调用了外函数的值
闭包如果有变量牵着内函数,外函数的栈帧不会释放,当内函数/变量被销毁,外函数才会被销毁
逻辑连续,当内函数被调用的时候,不会脱离当前的逻辑,(继续吃之前剩下的饭)
装饰器的更深层理解
拦截,把旧函数的调用拦截换做新函数,可以对其增加新功能后继续调用旧函数
重定向旧函数那个变量名的指向,使其变为新函数的引用,而不是旧函数的
偷 梁 换 柱
而我们写的那个@,会执行新函数,但是我们返回了旧函数,所以没问题
也就是说,这个有三个部分
第一部分:外函数内,内函数外,中间层
这个部分再包装的时候就会执行,用我的话来说就是环境创建
第二部分:内函数内,旧函数上
这个是下面调用的时候才会执行代码,但是先执行你的代码
第三部分:旧函数下
这是先执行旧函数,才执行你的函数
所以在包装的时候默认是会执行包装函数,而不是直接把指向修改为包装器,因为这样的话下面调用的时候就是在包装,而不是执行原本的代码
搞清楚func和func()的概念,这个是整个闭包的核心,支柱,前者是引用,后者是执行
并且这个引用是可拦截的,可被重定向的,不然这一切都不成立
扩展DLC(:IO读写前置
pathlib 中的 Path 类
from pathlib import Path
p1 = Path("./day20/demo01.py")
或 p1=Path("./","day20","demo01.py"),没错,他支持用逗号,他自动拼接/
使用p1.exists()判断路径是否存在,返回布尔值
Path.cwd()自动生成当前绝对路径,使用.parent返回上一级路径,使用.joinpath()进入路径
.parts 分割路径
.suffix/.stem,分割出后缀/名称
.stat().st_ctime 创建时间
.stat().st_atime 最后访问时间
.stat().st_mtime 最后修改时间
.stat().st.size 大小
.iterdir(),搜索当前目录所有的路径对象,包括路径和文件(一层),返回迭代器,所以用for取出
.glob(),根据通配符获取,比如("day0*"),就是包括day0,后面那个*是任意 多个字符
还能("*/*"),啥意思呢,找下一层所有的
.rglob(),只要在项目组里的都拿出来,递归式查找(所有层),里面也可以根据通配符找,比如("*.py"),就是拿出来所有py后缀的文件
# 以及python里去搜,比操作系统大,这个通配符是操作系统就有的,不是python特有的
创建
Path("a").mkdir()
如果有这个文件夹了,那么会报错,可以mkdir()里填参,exist_ok=True
删除
Path("./a/a.txt").unlink()
删除这个路径的文件,同样,里面写个True就是说如果不存在也不报错
Path("./a").rmdir()
删除这个文件夹,这个里面不能填参数,没有就百分百报错
扩展:shutil,另外一个库,有批量删除,拷贝等等的功能,小心使用!
删了可就真的没了,回收站找不着的
重命名
Path("./a").rename("./A")
所以他后面也是新路径,之前视频里那么写,用逗号来就会出错,所以我习惯写完整,不要用该死的逗号:D
或者可以withname(),这个是保留路径,只修改文件名

