第4条:用辅助函数来取代复杂的表达式

Python的语法非常精炼,很容易用一行表达式来实现许多逻辑,但是很多时候这样会导致代码的可读性降低,此时使用辅助函数会让代码保持灵动性。

>>> my_values = {'red':['5'],'green':[''],'blue':['0']}

现在有一个字典,我们想从中取值:

>>> print('Red:',my_values.get('red'))
Red: ['5']
>>> print('Green:',my_values.get('green'))
Green: ['']
>>> print('Opacity:',my_values.get('opacity'))
Opacity: None   #值不存在返回空值

取值的结果在我们的意料之内,但是,我想让它只返回数字,没有值或者空值返回0,那该如何解决了,有的同学临机一动:

#这样不就行了,呵呵
>>> red = my_values.get('red',[''])[0] or 0
>>> green = my_values.get('green',[''])[0] or 0
>>> opacity = my_values.get('opacity',[''])[0] or 0

我们来看一下结果:

#没毛病,大兄弟
>>> print('Red:%r' % red )
Red:'5'
>>> print('Green:%r' % green )
Green:0
>>> print('opacity:%r' % opacity )
opacity:0

虽然解决了问题,但是我觉得有两个问题:

首先,每次取值难道都要重新进行赋值,如果要取1000次,这个工作也许就会变得沉重;

其次,难道你不觉的看“my_values.get('green',[''])[0] or 0”你的眼睛不花,这说明代码的可读性不强。

那该怎么办了?

它的取值只可能是['数字']、['']或者None,而我们要数字,我们在结果打印出来之前,把结果加工一下,要么数字要么0,这样不久行了!

实现的过程:

>>> def get_first_int(values,key,default=0):
...     found = values.get(key,[''])
...     if found[0]:
...         found = int(found[0])
...     else:
...         found = default
...     return found
... 

查看一下结果:

复制代码
>>> red = get_first_int(my_values,'red')
>>> print(red)
5
>>> opacity = get_first_int(my_values,'opacity')
>>> print(opacity)
0
>>> green = get_first_int(my_values,'green')
>>> print(green)
0
#没毛病
复制代码

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

所以,如果表达式变得复杂,那就应该考虑将其拆成小块,并把这些逻辑移入辅助函数中。

这会让代码更加易读,也比原来那种密集的写法更好。编写python程序时,不要一味追求过于紧凑的写法,那样会写出非常复杂的表达式。

也许刚开始的时候这种思维方式你有点不习惯,相信我,只要你习惯了你会爱上它。

 

 文章摘抄于Brett Slatkin的《编写高质量Python代码的59个有效方法》,仅作为个人学习使用,如有侵权请告知,将及时删除,如果觉得有益,请购买原版书籍,知识需要传递和支持,谢谢。 

 

posted @   明王不动心  阅读(345)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示