编写高质量Python的6个技巧

简介: 编写高质量Python的6个技巧

image.png

使用decimal进行高精度计算

Python内置了decimal模块,主要解决日常精度,默认提供了28个小数位进行数学计算。

decimal中Decimal 类解决了IEEE 754浮点数产生的精度问题,并且可以进行更为准确舍入行为。

所以我们在涉及重要场合比如货币金额计算情况,非常合适。

当然我们也可以进行把小数转化为整数计算,只是会更麻烦一些,不够灵活应对。

不要返回None

遇到特殊情况是,应该抛出异常,而不是返回None,比如除法分子为0的情况,当调用者看到异常就知道如何修正代码。


举一个错误的例子

def divide(a, b):
    try:
        return a/b
    except ZeroDivisonError
        return None


返回None的话,由于我们有空字符串,0,空字典,空列表等都表示False,容易误导我们写出错误的代码。

另外就算我们意识到这个问题,我们代码中也会充斥许多检查None值的判断语句,变相增加了我们工作量


传递可变参数,默认值用None

紧接上一条,在传递可变参数我们参数应该使用None,因为函数的默认值,只会在程序加载模块并读到本函数的定义时进行评估。

如果默认值用空字典,空列表,往往会导致前后共用一个默认值,发生奇怪行为。

我们可以使用None作为形式上的默认值,在中途重新赋值,改变这种行为。


使用推导式替换map和filter

通过列表、字典推导可以让我们代码看起来更为简单明了,比如下面例子:

a = [1,2,3,4,5,6]

b = [x**2 for x in a if x % 2 == 0]

把filter函数和map结合起来也能做到,但是代码变得更为复杂难懂

c = map(lambda x: x**2, filter(lambda x: x%2 == 0, a))


上面一对比一下就知道那个更容易理解了,列表推导虽好,但不建议多个列表推导式,虽然最终看起来节约了代码,但是给人难以理解,增加理解成本。

毕竟代码是给人看的,只是顺带给机器执行一下而已。:)


使用ipdb进行调试

调试过程中,虽然有 print,logger,单元测试帮助我们查找问题原因,但是面对更为复杂的问题调试,往往需要更强大的调试工具进行交互操作,打印局部变量,程序状态,查看上下文,单步调试等等。

ipdb是pdb的升级版,非常灵活支持代码变量输入补全,非常方便,类似ipython和python的功能对比,推荐大家去使用使用。

使用环境变量

经常看到一些新手开发的时候,在进行环境参数配置导入导出的时候喜欢用层层叠加的方式覆盖,每次开发过程把配置文件名pro_config.py 改为 pro_config.py.bak来进行环境变量控制等等。

try:
    from local_config import *
    from dev_config import *
    from pro_config import *
except:
    pass

Python有对应的包 importlib,结合os 模块,我们可以通过export进行环境变量的控制,

配合docker-compose类似工具,启动不同环境容器就能进行隔离开发非常方便。

import importlib
import os
config_file = os.getenv('XXX_API_SETTINGS')
if not config_file:
    config_file = 'XXX.config.test'
config_module = importlib.import_module(config_file)


上面的几个技巧,是我常用的一些方法技巧,起于Python,不止Python,欢迎大家在留言区留下你的方式方法,我们一起讨论。

另外在上一篇文章我分享了提高代码质量,这本书就够了,这里面有赠送「代码整洁之道」这本书的活动,今天的技巧就有来自该书,感兴趣的同学可以去上篇文章下面留言参与。


相关文章
|
Linux Python Windows
windows python web flask 编写 Hello World
windows python web flask 编写 Hello World
windows python web flask 编写 Hello World
|
JSON 缓存 关系型数据库
linux python web flask 编写 Hello World
linux python web flask 编写 Hello World
linux python web flask 编写 Hello World
|
编译器 API C++
python 外部传参程序编写并打包exe及其调用方式
每种编程语言相互联系又相互独立,为此使用某种编程语言编写的程序都能够独立封装和生成自己的运行程序exe或者其他的API接口。而对于这样的运行程序目的往往不是用于双击使其运行的,而是通过外部传入的参数运行其中的内核函数达到某种目的的。所以在此研究python如何编写外部传参的程序,并将其封装未exe便于外部使用。
598 0
python 外部传参程序编写并打包exe及其调用方式
|
数据采集 IDE 关系型数据库
Python编程:PyThink数据库交互模块提高爬虫编写速度
Python编程:PyThink数据库交互模块提高爬虫编写速度
65 0
Python编程:PyThink数据库交互模块提高爬虫编写速度
|
Python
python编写是否是闰年
python编写是否是闰年
92 0
python编写是否是闰年
|
数据采集 存储 Shell
[oeasy]教您玩转python - 0003 - 编写 py 文件
​ [oeasy]python3-用vim编辑python文件 [点击并拖拽以移动] 编写 py 文件 🥊 回忆上次内容 上次在解释器里玩耍 了解到字符串就是给一堆字符两边加引号 可以是单引号 也可以是双引号 这样游乐场就知道 这个不是一个名字 而是一个字符串 字符串可以用print函数进行输出 但是print千万不要打错 就连大小写都不能错 我们在游乐场玩了这么久 能否写一个真正的python文件啊?🤔 编辑
178 0
 [oeasy]教您玩转python - 0003 - 编写 py 文件
|
数据采集 IDE 关系型数据库
Python编程:PyThink数据库交互模块提高爬虫编写速度
Python编程:PyThink数据库交互模块提高爬虫编写速度
112 0
|
测试技术 Python
Python编程:Flask测试用例的编写实例
Python编程:Flask测试用例的编写实例
184 0
|
Python
Python基础题型实战08-编写函数判断一张牌的花色
人生最困难的时候,也许正是转变的时候:改变固有的思想,人生就可能迎来转机。幸运,总是离努力的人更近一些。
|
存储 大数据 数据安全/隐私保护
用Python编写一个电子考勤系统
用Python编写一个电子考勤系统
238 0
用Python编写一个电子考勤系统