《编写高质量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操作符写成的表达式更加清晰。

相关文章
|
4天前
|
Python
python魔法方法如何应用
这个Python示例展示了类继承和方法重写。`Student`类继承自`Person`,并覆盖了`say_hello`方法。通过`super().__init__(name)`调用父类的`__init__`初始化`name`属性,`Student`添加了`age`属性,并在重写的`say_hello`中使用。创建`Student`实例`student`并调用其`say_hello`,输出定制的问候信息。
15 1
|
5天前
|
Python
python函数的参数学习
学习Python函数参数涉及五个方面:1) 位置参数按顺序传递,如`func(1, 2, 3)`;2) 关键字参数通过名称传值,如`func(a=1, b=2, c=3)`;3) 默认参数设定默认值,如`func(a, b, c=0)`;4) 可变参数用*和**接收任意数量的位置和关键字参数,如`func(1, 2, 3, a=4, b=5, c=6)`;5) 参数组合结合不同类型的参数,如`func(1, 2, 3, a=4, b=5, c=6)`。
10 1
|
6天前
|
监控 Python
Python中的装饰器:提升代码灵活性与可读性
在Python编程中,装饰器是一种强大的工具,能够提升代码的灵活性和可读性。本文将介绍装饰器的基本概念、使用方法以及实际应用场景,帮助读者更好地理解和利用这一功能。
|
7天前
|
缓存 监控 算法
优化Python代码性能的10个技巧
提高Python代码性能是每个开发者都需要关注的重要问题。本文将介绍10个实用的技巧,帮助你优化Python代码,提升程序的运行效率和性能表现。无论是避免内存泄漏、减少函数调用次数,还是使用适当的数据结构,都能在不同场景下发挥作用,使你的Python应用更加高效稳定。
|
1天前
|
Python
python学习10-函数
python学习10-函数
|
1天前
|
Python
python学习4-内置函数range()、循环结构、循环控制语句、else语句、嵌套循环
python学习4-内置函数range()、循环结构、循环控制语句、else语句、嵌套循环
|
1天前
|
缓存 算法 Python
优化Python代码的十大技巧
本文介绍了十种优化Python代码的技巧,涵盖了从代码结构到性能调优的方方面面。通过学习和应用这些技巧,你可以提高Python程序的执行效率,提升代码质量,以及更好地应对复杂的编程任务。
|
1天前
|
程序员 Python
Python中的装饰器:提升代码可读性与灵活性
在Python编程中,装饰器是一种强大的工具,可以在不修改原始代码的情况下,动态地添加功能。本文将深入探讨Python中装饰器的原理、用法和实际应用,以及如何利用装饰器提升代码的可读性和灵活性。
|
3天前
|
缓存 开发者 Python
深入探讨Python中的装饰器:提升代码可读性与灵活性
在Python编程中,装饰器是一种强大的工具,可以在不修改原始函数代码的情况下,对其行为进行扩展或修改。本文将深入探讨装饰器的原理和用法,以及如何利用装饰器提升代码的可读性和灵活性,为Python开发者提供更加优雅和高效的编程方式。
|
4天前
|
测试技术 开发者 Python
Python中的装饰器:优雅而强大的函数修饰工具
在Python编程中,装饰器是一种强大的工具,用于修改函数或方法的行为。本文将深入探讨Python中装饰器的概念、用法和实际应用,以及如何利用装饰器实现代码的优雅和高效。