欢迎光临散文网 会员登陆 & 注册

07xx-函数式++

2023-07-31 20:22 作者:GHWNM  | 我要投稿

自定义高阶函数:

地址>>>  ../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(),这个是保留路径,只修改文件名


07xx-函数式++的评论 (共 条)

分享到微博请遵守国家法律