python优化之用辅助函数来取代复杂的表达式

python优化之用辅助函数来取代复杂的表达式

抛出问题:

通常我们从URL中解码查询字符串:

test_values = parse_qs('parms_a=0&parms_b=2&parms_c=3&parms_d=', keep_blank_values=True)
print(test_values)

输出

{'parms_a': ['0'], 'parms_b': ['2'], 'parms_c': ['3'], 'parms_d': ['']}

这个时候我们拿到参数的方式一般是:

parms_a = test_values.get('parms_a')[0]
print(parms_a)

输出的是字符串的0

查询字符串中某些参数可能有多个值,某些参数可能只有一个值,某些参数可能是空白值,还有些参数可能没有出现在查询字符串中,如果待查询的参数没有出现在字符串中,或当该参数的值为空白的时候能够返回默认值0,那就更好了

接下来,我们改进一下

parms_q = test_values.get('parms_q', [''])[0] or 0
parms_a= test_values.get('parms_a', [''])[0] or 0
parms_b= test_values.get('parms_b', [''])[0] or 0
parms_c= test_values.get('parms_c', [''])[0] or 0
parms_d= test_values.get('parms_d', [''])[0] or 0
print(parms_q )
print(parms_a)
print(parms_b)
print(parms_c)
print(parms_d)

上述的意思是,如果字典里面有参数,我们就能拿到对应参数的值,如果没有,我们就拿到的是0
输出
0
0
2
3
0
注意:parms_a,parms_b,parms_c拿到的是str类型的0,因此我们需要转int
最终:

parms_q = test_values.get('parms_q', [''])[0] or 0
parms_a= int(test_values.get('parms_a', [''])[0]) or 0
parms_b= int(test_values.get('parms_b', [''])[0]) or 0
parms_c= int(test_values.get('parms_c', [''])[0]) or 0
parms_d= test_values.get('parms_d', [''])[0] or 0
print(parms_q, type(parms_q))
print(parms_a, type(parms_a))
print(parms_b, type(parms_b))
print(parms_c, type(parms_c))
print(parms_d, type(parms_d))

输出:
0 <class ‘int’>
0 <class ‘int’>
2 <class ‘int’>
3 <class ‘int’>
0 <class ‘int’>

我们可以看到这种写法读起来很困难,看上去很乱,这样的代码不容易被理解,初次拿到这种代码的人,可能需要花些时间拆解里面表达式,才能看懂作用,代码也不够简洁,你可以发现其中每一行的逻辑都基本相同,而且因此我们添加一个辅助函数来实现

def get_parms_int(values, key, default=0):
	parms = values.get(key, [''])
	if parms[0]:
		parms = int(parms[0])
	else:
		parms = default
	return parms

parms_q = get_parms_int(test_values, 'parms_q')
parms_a = get_parms_int(test_values, 'parms_a')
parms_b = get_parms_int(test_values, 'parms_b')
parms_c = get_parms_int(test_values, 'parms_c')
parms_d = get_parms_int(test_values, 'parms_d')
print(parms_q, type(parms_q))
print(parms_a, type(parms_a))
print(parms_b, type(parms_b))
print(parms_c, type(parms_c))
print(parms_d, type(parms_d))

输出:
0 <class ‘int’>
0 <class ‘int’>
2 <class ‘int’>
3 <class ‘int’>
0 <class ‘int’>

总结

  • 以上只是一个举例,实际我们开发中,都可以将相同的逻辑封装成一个辅助函数去调用,这样一有问题,只需要改一下辅助函数,不影响其他地方的使用,这样也可以更好的维护代码及开发,要养成这样的思想
  • 使用if/else表达式,要比用or 或者and 这样的Boolean操作符写成的表达式更加清晰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值