V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
youthfire
V2EX  ›  Python

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

  •  
  •   youthfire · 52 天前 · 1660 次点击
    这是一个创建于 52 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    不过就是注意大循环内使用函数要优化,函数调用本身也是消耗
    youthfire
        10
    youthfire  
    OP
       50 天前 via iPhone
    @imn1 #9 非常感谢详细的分享!我昨天开始尝试用这种新方式整理我的程序,目前遇到个问题,比如我 import 了 mydef.abc ,abc 是一个常用的自编函数,这个函数里包含一个变量,比如说 result ,后续我还想继续使用这个 result ,有办法吗?以前我全写在一起,直接用或者用 non local 声明就可以了,现在不清楚怎么处理。
    imn1
        11
    imn1  
       50 天前   ❤️ 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 部分
    youthfire
        12
    youthfire  
    OP
       50 天前 via iPhone
    @imn1 #11 非常感谢指点!受益了
    Karonheaven
        13
    Karonheaven  
       50 天前 via Android   ❤️ 1
    可以考虑通过 live template(jetbrains)或者 code snippets(vscode)封装,留出常用参数实际使用时定义就可以
    我就把大多数的个人轮子片段存成了 live template ,还可以同步到所有的 jetbrains IDEs
    youthfire
        14
    youthfire  
    OP
       50 天前 via iPhone
    @Karonheaven #13 学习了,感谢分享经验🙏
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1596 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 80ms · UTC 00:06 · PVG 08:06 · LAX 16:06 · JFK 19:06
    ♥ Do have faith in what you're doing.