用辅助函数取代复杂的表达式

用辅助函数取代复杂的表达式

  Python的语法非常精简,很容易就能用一行表达式来实现许多逻辑。

  例如,要从URL中解码查看字符串。在下列所举的查询字符串中,每个参数都可以表示一个整数值:

1、parse_qs

from urllib.parse import parse_qs
''' 补充知识点: from urllib.parse import parse_qs parse_qs可以对字符串中以&分隔的key=value的值进行分割并转成字典。 把key值当做字典的key,把value存放在一个列表中当做字典的value。 ''' url = "name=jason&pwd=123&nickname=虹桥炮王" # keep_blank_values: True表示保留空格, 默认False表示忽略空格 dict1 = parse_qs(url, keep_blank_values=True) print(dict1) >>> {'name': ['jason'], 'pwd': ['123'], 'nickname': ['虹桥炮王']}

2、复杂表达式 or

from urllib.parse import parse_qs

url = "name=jason&pwd=123&nickname=虹桥炮王"

# keep_blank_values: True表示保留空格, 默认False表示忽略空格
dict1 = parse_qs(url, keep_blank_values=True)
'''
复杂表达式 or
'''
val1 = dict1.get('name', [""])[0] or 0
val2 = dict1.get('pwd', [""])[0] or 0
val3 = dict1.get('nickname', [""])[0] or 0

print(val1)  # jason
print(val2)  # 123
print(val3)  # 虹桥炮王

 

3、三元表达式

  上面我们使用or这种表达式语法虽然正确,但却很难阅读。所以我们可以使用Python中的三元表达式。

from urllib.parse import parse_qs

url = "name=jason&pwd=123&nickname=虹桥炮王"

dict1 = parse_qs(url, keep_blank_values=True)

val1 = dict1.get('name', [""])

# 如果val1[0]有值返回,没有值返回0
val1 = val1 if val1[0] else 0
print(val1)  # jason

 

4、if/else语句

用三元表达式相比较or已经清晰一点了,但是相对于这个例子来说,清晰程度还是比不上跨越多行的完整if/else语句。

from urllib.parse import parse_qs

url = "name=jason&pwd=123&nickname=虹桥炮王"

dict1 = parse_qs(url, keep_blank_values=True)

val2 = dict1.get('pwd', [""])
if val2[0]:
    val2 = val2[0]
else:
    val2 = 0

 

重点: 函数辅助

根据以上几点的总结,如果需要频繁使用这种逻辑、或者是表达式比较复杂,那就应该考虑将其拆解成一小块一小块,并通过辅助函数来解决这种问题。

from urllib.parse import parse_qs

url = "name=jason&pwd=123&nickname=虹桥炮王"

dict1 = parse_qs(url, keep_blank_values=True)

# 辅助函数
def get_first_val(values, key, default=0):
    value = values.get(key, [""])
    if value[0]:
        value = value[0]
    else:
        value = default

    return value


name = get_first_val(dict1, 'name')

print(name)  # jason

 

总结

1.开发者很容易过度运用python语法的特性,从而写出特别复杂及难以理解的单行表达式,并且违背了python推崇语法简介的初衷。

2.把复杂的表达式转换到辅助函数中,如果遇到需要反复使用相同逻辑场景,那就更应该拆分成一小块一小块。

3.使用if/else表达式,要比or或者and这样的布尔值表达式更加清晰。


posted @ 2019-07-10 13:18  tank_jam  阅读(346)  评论(0编辑  收藏  举报