第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 @ 2017-12-06 01:46  明王不动心  阅读(340)  评论(0编辑  收藏  举报