《编写高质量Python代码的59个有效方法》——第4条:用辅助函数来取代复杂的表达式

简介:

本节书摘来自华章社区《编写高质量Python代码的59个有效方法》一书中的第4条:用辅助函数来取代复杂的表达式,作者[美]布雷特·斯拉特金(Brett Slatkin),更多章节内容可以访问云栖社区“华章社区”公众号查看

第4条:用辅助函数来取代复杂的表达式
Python的语法非常精练,很容易就能用一行表达式来实现许多逻辑。例如,要从URL中解码查询字符串。在下例所举的查询字符串中,每个参数都可以表示一个整数值:

查询字符串中的某些参数可能有多个值,某些参数可能只有一个值,某些参数可能是空白(blank)值,还有些参数则没有出现在查询字符串之中。用get方法在my_values字典中查询不同的参数时,就有可能获得不同的返回值。

如果待查询的参数没有出现在字符串中,或当该参数的值为空白时能够返回默认值0,那就更好了。这个逻辑看上去似乎并不值得用完整的if语句或辅助函数来实现,于是,你可能会考虑用Boolean表达式。
由于Python的语法非常精练,所以我们很容易就想到了这种做法。空字符串、空列表及零值,都会评估为False。因此,在下面这个例子中,如果or操作符左侧的子表达式估值为False,那么整个表达式的值就将是or操作符右侧那个子表达式的值。

red那一行代码是正确的,因为my_values字典里确实有'red'这个键。该键所对应的值是个列表,列表中只有一个元素,也就是字符串'5'。这个字符串会自动估值为True,所以,or表达式第一部分的值就会赋给red。
green那一行代码也是正确的,因为get方法从my_values字典中获取的值是个列表,该列表只有一个元素,这个元素是个空字符串。由于空字符串会自动估值为False,所以整个or表达式的值就成了0。
opacity那一行代码也没有错。my_values字典里面没有名为'opacity'的键,而当字典中没有待查询的键时,get方法会返回第二个参数的值,所以,在本例中,get方法就会返回仅包含一个元素的列表,那个元素是个空字符串。当字典里没有待查询的'opacity'键时,这行代码的执行效果与green那行代码相同。
这样的长表达式虽然语法正确,但却很难阅读,而且有时也未必完全符合要求。由于我们想在数学表达式中使用这些参数值,所以还要确保每个参数的值都是整数。为了实现这一点,我们需要把每个长表达式都包裹在内置的int函数中,以便把字符串解析为整数。

这种写法读起来很困难,而且看上去很乱。这样的代码不容易理解,初次拿到这种代码的人,可能先要花些功夫把表达式拆解开,然后才能看明白它的作用。即使想把代码写得简省一些,也没有必要将全部内容都挤在一行里面。
Python 2.5添加了if/else条件表达式(又称三元操作符),使我们可以把上述逻辑写得清晰一些,同时还能保持代码简洁。

这种写法比原来好了一些。对于不太复杂的情况来说,if/else条件表达式可以令代码变得清晰。但对于上面这个例子来说,它的清晰程度还是比不上跨越多行的完整if/else语句。如果把上述逻辑全都改成下面这种形式,那我们能就感觉到:刚才那种紧缩的写法其实挺复杂的。

现在应该把它总结成辅助函数了,如果需要频繁使用这种逻辑,那就更应该这样做。

调用这个辅助函数时所使用的代码,要比使用or操作符的长表达式版本,以及使用if/else表达式的两行版本更加清晰。

表达式如果变得比较复杂,那就应该考虑将其拆解成小块,并把这些逻辑移入辅助函数中。这会令代码更加易读,它比原来那种密集的写法更好。编写Python程序时,不要一味追求过于紧凑的写法,那样会写出非常复杂的表达式。
要点
开发者很容易过度运用Python的语法特性,从而写出那种特别复杂并且难以理解的单行表达式。
请把复杂的表达式移入辅助函数之中,如果要反复使用相同的逻辑,那就更应该这么做。
使用if/else表达式,要比用or或and这样的Boolean操作符写成的表达式更加清晰。

相关文章
|
1月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
169 1
|
1月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
257 1
|
1月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
152 0
|
1月前
|
测试技术 Python
Python装饰器:为你的代码施展“魔法”
Python装饰器:为你的代码施展“魔法”
236 100
|
1月前
|
开发者 Python
Python列表推导式:一行代码的艺术与力量
Python列表推导式:一行代码的艺术与力量
370 95
|
2月前
|
设计模式 缓存 监控
Python装饰器:优雅增强函数功能
Python装饰器:优雅增强函数功能
267 101
|
2月前
|
开发者 Python
Python神技:用列表推导式让你的代码更优雅
Python神技:用列表推导式让你的代码更优雅
432 99
|
1月前
|
缓存 Python
Python装饰器:为你的代码施展“魔法
Python装饰器:为你的代码施展“魔法
153 88
|
2月前
|
人工智能 数据安全/隐私保护 异构计算
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
388 8
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
|
1月前
|
监控 机器人 编译器
如何将python代码打包成exe文件---PyInstaller打包之神
PyInstaller可将Python程序打包为独立可执行文件,无需用户安装Python环境。它自动分析代码依赖,整合解释器、库及资源,支持一键生成exe,方便分发。使用pip安装后,通过简单命令即可完成打包,适合各类项目部署。