用辅助函数取代复杂的表达式
用辅助函数取代复杂的表达式
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