Python--函数设计

前言

初次写比较复杂的功能不确定的推荐项目,然后添加功能、实验改版。一边写,一边改,一边吐血,一边觉得自己写了一堆狗屎。基本上,写一段代码,思考纠结30分钟,写20分钟。一些总结,希望自己以后不再范类似错误,也和大家分享讨论一下。

由于水平比较低和懒,没有读过几个项目代码,所以只会PipeLine编程,也没学好。这篇主要围绕pipeline进行总结和讨论。

修改和添加功能的原则

修改和加功能是难以避免的问题,根据开闭原则,最好不打开原来的函数,对里面的代码进行增删改查,而是在此代码的基础上:

  • 增添函数完成功能
  • 继承某个类,重构其中某函数,完成功能

等等其他方法。这样做好处很多:

  • 测试代价最小
  • 冲突少,节约思考和纠结的时间
  • 拯救发量

在做ACM训练期间,养成了性能优先的习惯。但是在修改和添加功能的时候,性能较好的方法一般都是拆开原来的函数修改代码的,常常二者不可兼得。但是,硬件发展迅猛,机器性能过剩,相比之下软件发展速度感人,所以可维护性优先,性能居次

1. 新增参数和参数名过多

有时我们可能会增加的功能中需要用到新的参数,这时如果使用的是string、int和list等变量时,那么避免不了增加新的参数,导致PipeLine中每个节点的函数参数都需要修改,有时参数名过多,容易弄混变量顺序等。这两种情况都应该避免。

我能想到的解决方案是:

  • 将参数作为封装到自定义的类中,传递对象或者作为数据共享中心。

    优点:需要传递的参数是少数几个对象,而且以相关性封装后便于记忆数量众多的变量,不需要关心顺序。如果新功能需要某个变量,只需要在相应自定义类中添加成员变量声明,并在相关函数中为成员变量赋值,最后在新功能需要的地方取出变量就好。应该是线程安全的,不用担心多线程问题。

    缺点:增加内存开销

2. 函数返回值

在做特征的函数中,返回值经常比较多。另外,函数都需要对输入做检测(如:类型检查和空值),遇到突发情况一般会给一些默认值提前返回。而这种情况下,开发过程中比较容易忘记,导致返回值不一致(位置不一致或者数量不一致)。如果是维护的时候,更容易出现这种情况。如何解决这种纠结?

我的解决方案如下:

  • 根据“单一职责”原则,一个函数应该只有一种功能,所以它应该只有一个返回值。如果函数有多个返回值,那么还是将他们拆分成多个函数或者一个类吧。多个返回值,应该避免。

    非常特殊的情况下,可以不拆分函数,解决措施如下:
  • 一个函数中不要有多处return语句,每个返回值都先存储在变量中,最后一起返回。将所有的值打包返回值,一起返回,比如返回对象实例。

特征名称

在做特征时,生成了很多的特征,比如1000维。后续的分析和可视化,可解释时会用维所对应的含义。所以,在生成特征的时候,最好一起记住对应的特征。特征均时依据实体和关系构建的,可以按照自己的需要进行分层整理。比如,在我的程序中,用户相关的特征有年龄、所在地这些基本特征,还有一个月内购买物品次数、退货次数、退货率等行为特征,我的分三层:“用户”—>“基本特征”/“行为特征”---->“底层具体特征”。然后使用pipeline组织生成特征的代码,每个类都有自己的特征名字,在输出特征的时候,会将特征加上父类特征名前缀。最后的特征如,“用户-基本特征-年龄”,“用户-行为-购买次数”。

总结

最近在学信息论基础知识,所以使用信息论总结全文。
从信息论的角度来看,一个函数拆成多个函数,拆分后的函数信息熵之和小于等于原始函数的信息熵之和。而且大部分情况下,信息熵是减少了,而信息熵越小人越容易读懂,也越容易维护。所以采用信息熵小的方案,肯定更好的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值