求教下,写 Python 代码,先前置大量定义函数的写法是否正确

2021-12-03 19:50:44 +08:00
 youthfire

非程序员,自学了一些 Python 基础书后,结合着实际需求陆续写了一些程序。代码写多了就会发现,大量的一些功能会重复,所以逐步就形成了在 import 后,正式功能代码前,会先写无数个函数,以方便后面用来简写或者调用。

代码长了以后,在 pycharm 中就看起来特别不方便,就好像明明你可能有实现具体 20 个功能,实际函数先定义了 30 个,structure 里就是 50 行。

求教,是否这种结构安排是错误的,大家都是怎么处理的,谢谢

2720 次点击
所在节点    Python
14 条回复
dcsuibian
2021-12-03 20:01:50 +08:00
把你的有用的函数放到其它.py 文件里,然后 import 进来
jmc891205
2021-12-03 20:02:08 +08:00
我的理解是这些函数是你自己常用的
那你把他们放到你自己的 module 里呗
ila
2021-12-03 20:02:28 +08:00
封装自己的轮子
Ehend
2021-12-03 20:03:33 +08:00
utils ?
flniu
2021-12-04 22:40:50 +08:00
这跟 Python 或具体哪门语言无关,跟程序的设计和代码的组织有关(可读性、封装、DRY 原则、SOLID 原则等等)。
推荐一本《程序员修炼之道(第 2 版)》。
flniu
2021-12-04 22:48:06 +08:00
另外现代 IDE 的代码跳转功能非常完备,比如 PyCharm ,可以很方便从函数调用的地方跳转到函数定义。
youthfire
2021-12-04 23:24:09 +08:00
感谢各位热心的指点!@flniu 我去学习下,谢谢!
golangLover
2021-12-05 12:09:20 +08:00
正确,比绝大部份瞎写的程序员正确多了
imn1
2021-12-05 13:01:15 +08:00
我写了数百个闭包函数(当然是累积的,不是一次写完),放在一个自定义目录,需要用的时候 import

其中部分只是 partical 函数或者直接一句 return ,原因就是 py 原来的函数参数太繁琐,我常用就那么几个固定参数,懒得每次查手册去看参数变量名,直接写死作为一个自定义函数只输入一个变量就算了,好记
尤其 pandas 这种大模块,查手册很不方便,常用的那些写好几个扔在那里,只记住一两个参数就能调用了

例如一个根据外部参考列表排序的函数,几乎每个项目都用到,就先写好一个通用的,各自调用

不过就是注意大循环内使用函数要优化,函数调用本身也是消耗
youthfire
2021-12-05 13:50:09 +08:00
@imn1 #9 非常感谢详细的分享!我昨天开始尝试用这种新方式整理我的程序,目前遇到个问题,比如我 import 了 mydef.abc ,abc 是一个常用的自编函数,这个函数里包含一个变量,比如说 result ,后续我还想继续使用这个 result ,有办法吗?以前我全写在一起,直接用或者用 non local 声明就可以了,现在不清楚怎么处理。
imn1
2021-12-05 14:19:25 +08:00
@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 部分
youthfire
2021-12-05 14:24:00 +08:00
@imn1 #11 非常感谢指点!受益了
Karonheaven
2021-12-05 19:55:37 +08:00
可以考虑通过 live template(jetbrains)或者 code snippets(vscode)封装,留出常用参数实际使用时定义就可以
我就把大多数的个人轮子片段存成了 live template ,还可以同步到所有的 jetbrains IDEs
youthfire
2021-12-05 20:16:42 +08:00
@Karonheaven #13 学习了,感谢分享经验🙏

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/819890

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX