第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个有效方法》,仅作为个人学习使用,如有侵权请告知,将及时删除,如果觉得有益,请购买原版书籍,知识需要传递和支持,谢谢。