一、函数参数与返回值基础知识
1、不要使用可变类型(list等)作为参数默认值,用None
来代替。
参数默认值只会在函数定义阶段被创建一次,之后无论创建多少次,函数内拿到的默认值都是同一个对象,为规避这个问题,一般会用None来代替可变默认类型对象。
2、使用标记对象,可以严格区分函数调用时是否提供了某个参数。
所谓标记对象,是专门定义一个独一无二的变量类型,当用户调用函数确实没有传递某个参数时、默认值会变成这个标记对象,那么我们就可以知道服务到底有没有传这个变量了、而不是仅仅通过None来判断。
3、定义仅限关键字参数,可以强制要求调用方提供参数名,提升可读性。
4、函数应当拥有稳定的返回类型,不要返回多种类型。
5、适合返回None
的情况——操作类函数、查询类型函数中表示意料之外的缺失值。
6、在执行失败时,相比返回None
,直接抛出异常更合适。
7、如果提前返回结果可以提升可读性,就提前返回,不要去追求所谓的“单一出口”。
二、代码可维护性技巧
1、不要编写太长的函数,虽然长度没有强制标准,但65行是一个危险的信号。
2、圈复杂度是评估函数复杂程度的常用指标,一般超过10的函数都需要重构。
3、抽象与分层思想可以帮助我们更好地构建与管理复杂的系统。
4、同一个函数内的代码应该处于同一抽象级别。
简单来说,按照职能、数据流、业务流进行分级分类,逐一递进,然后做模块和函数的抽象与划分,不要一股脑都写在一起。
比方说通过页面查询后端数据,就可以分解成接口View层、请求处理与参数校验层,以及数据查询抽象Data层。
三、函数与状态
1、没有副作用的无状态纯函数比较易于理解、维护,但大多数时候“状态”不可避免。
2、避免使用全局变量给函数增加状态。
3、当函数状态较为简单时,可以使用闭包技巧。
def counter():
value = 0
def _counter():
# nonlocal 用来标注变量来自上层作用域,如果不标明,内层函数将无法直接的修改外层函数变量
nonlocal value
value += 1
return value
return _counter
> c = counter()
> c()
1
> c()
2
> c2 = counter()
> c2()
1
4、当函数需要较为复杂的状态管理时,建议定义类来管理状态。
四、语言机制对函数的影响
1、functools.partial()
可以用来快速构建偏函数。
2、functools.lru_cache()
可以用来给函数添加缓存。
3、比起map
和filter
,列表推导式的可读性更强。
4、lambda
函数知识一种语法糖,可以使用operator
模块等方式来替代它。
5、Python语言里的递归限制较多,可以的话,请尽量使用循环来替代。
原文地址:https://blog.csdn.net/lym940928/article/details/134583262
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_8249.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!