Python中的函数

一、函数参数与返回值基础知识

1、不要使用可变类型(list等)作为参数默认值,用None来代替。

参数默认值只会在函数定义阶段被创建一次,之后无论创建多少次,函数内拿到的默认值都是同一个对象,为规避这个问题,一般会用None来代替可变默认类型对象。

2、使用标记对象,可以严格区分函数调用时是否提供了某个参数。

所谓标记对象,是专门定义一个独一无二的变量类型,当用户调用函数确实没有传递某个参数时、默认值会变成这个标记对象,那么我们就可以知道服务到底有没有传这个变量了、而不是仅仅通过None来判断。

3、定义仅限关键字参数,可以强制要求调用方提供参数名,提升可读性。
4、函数应当拥有稳定的返回类型,不要返回多种类型。
5、适合返回None的情况——操作类函数、查询类型函数中表示意料之外的缺失值
6、在执行失败时,相比返回None,直接抛出异常更合适。
7、如果提前返回结果可以提升可读性,就提前返回,不要去追求所谓的“单一出口”。

二、代码可维护性技巧

1、不要编写太长的函数,虽然长度没有强制标准,但65行是一个危险的信号。
2、圈复杂度是评估函数复杂程度的常用指标,一般超过10的函数都需要重构。
3、抽象与分层思想可以帮助我们更好地构建与管理复杂的系统。
4、同一个函数内的代码应该处于同一抽象级别

简单来说,按照职能、数据流、业务流进行分级分类,逐一递进,然后做模块和函数的抽象与划分,不要一股脑都写在一起。
比方说通过页面查询后端数据,就可以分解成接口View层、请求处理与参数校验层,以及数据查询抽象Data层。

三、函数与状态

1、没有副作用的无状态纯函数比较易于理解、维护,但大多数时候“状态”不可避免。
2、避免使用全局变量给函数增加状态。
3、当函数状态较为简单时,可以使用闭包技巧

所谓闭包技巧,就是在函数内再定义一个函数,而后使用nonlocal来对外层函数的状态记录变量进行更新,举例:

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、比起mapfilter,列表推导式的可读性更强。
4、lambda函数知识一种语法糖,可以使用operator模块等方式来替代它。
5、Python语言里的递归限制较多,可以的话,请尽量使用循环来替代。

参考内容:《Python工匠——案例、技巧与工程实践》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值