非程序员,自学了一些 Python 基础书后,结合着实际需求陆续写了一些程序。代码写多了就会发现,大量的一些功能会重复,所以逐步就形成了在 import 后,正式功能代码前,会先写无数个函数,以方便后面用来简写或者调用。
代码长了以后,在 pycharm 中就看起来特别不方便,就好像明明你可能有实现具体 20 个功能,实际函数先定义了 30 个,structure 里就是 50 行。
求教,是否这种结构安排是错误的,大家都是怎么处理的,谢谢
1
dcsuibian 2021-12-03 20:01:50 +08:00 1
把你的有用的函数放到其它.py 文件里,然后 import 进来
|
2
jmc891205 2021-12-03 20:02:08 +08:00 1
我的理解是这些函数是你自己常用的
那你把他们放到你自己的 module 里呗 |
3
ila 2021-12-03 20:02:28 +08:00 via Android 1
封装自己的轮子
|
4
Ehend 2021-12-03 20:03:33 +08:00 via Android
utils ?
|
5
flniu 2021-12-04 22:40:50 +08:00 1
这跟 Python 或具体哪门语言无关,跟程序的设计和代码的组织有关(可读性、封装、DRY 原则、SOLID 原则等等)。
推荐一本《程序员修炼之道(第 2 版)》。 |
6
flniu 2021-12-04 22:48:06 +08:00
另外现代 IDE 的代码跳转功能非常完备,比如 PyCharm ,可以很方便从函数调用的地方跳转到函数定义。
|
7
youthfire OP 感谢各位热心的指点!@flniu 我去学习下,谢谢!
|
8
golangLover 2021-12-05 12:09:20 +08:00 via Android 1
正确,比绝大部份瞎写的程序员正确多了
|
9
imn1 2021-12-05 13:01:15 +08:00
我写了数百个闭包函数(当然是累积的,不是一次写完),放在一个自定义目录,需要用的时候 import
其中部分只是 partical 函数或者直接一句 return ,原因就是 py 原来的函数参数太繁琐,我常用就那么几个固定参数,懒得每次查手册去看参数变量名,直接写死作为一个自定义函数只输入一个变量就算了,好记 尤其 pandas 这种大模块,查手册很不方便,常用的那些写好几个扔在那里,只记住一两个参数就能调用了 例如一个根据外部参考列表排序的函数,几乎每个项目都用到,就先写好一个通用的,各自调用 不过就是注意大循环内使用函数要优化,函数调用本身也是消耗 |
10
youthfire OP @imn1 #9 非常感谢详细的分享!我昨天开始尝试用这种新方式整理我的程序,目前遇到个问题,比如我 import 了 mydef.abc ,abc 是一个常用的自编函数,这个函数里包含一个变量,比如说 result ,后续我还想继续使用这个 result ,有办法吗?以前我全写在一起,直接用或者用 non local 声明就可以了,现在不清楚怎么处理。
|
11
imn1 2021-12-05 14:19:25 +08:00 1
@youthfire #10
如果 result 要反复使用,且是函数的输出 1. 写成 class ,把 result 赋值给一个 attrib , 如果 py 版本比较新 >=3.8 ,可以用 @cache_property 装饰器缓存 abc 的结果 任意版本,可以在方法内写成 self.result = result 这样实例化后,只要不销毁实例,obj.result 是一直保留的 2. 用 lru_cache 如果只是个中间变量 1. 最方便的就是上述 self.result = result 这种方式 2. 改为在函数输出时一并输出 3. 使用 global 说到底就是作用域问题 注意可遍历的 result 不能是 iterator 类型,要转为 list/tuple/set 等,否则遍历一次就没了,不能重复使用 详细参考手册 functools 部分 |
13
Karonheaven 2021-12-05 19:55:37 +08:00 via Android 1
可以考虑通过 live template(jetbrains)或者 code snippets(vscode)封装,留出常用参数实际使用时定义就可以
我就把大多数的个人轮子片段存成了 live template ,还可以同步到所有的 jetbrains IDEs |
14
youthfire OP @Karonheaven #13 学习了,感谢分享经验🙏
|