本文介绍: 《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工匠——案例技巧工程实践》

原文地址:https://blog.csdn.net/lym940928/article/details/134583262

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_8249.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注