考虑一个小的属性解析器片段:
testx="""var1 = foo
var2 = bar"""
dd = { l.split('=')[0].strip():l.split('=')[1].strip() for l in testx.split('\n')}
print(dd)
# {'var1': 'foo', 'var2': 'bar'}
这是可行的,但由于在l.split('=')[0].strip():l.split('=')[1].strip()
中两次调用了“split”,所以很难看。如何将字典理解更改为只需要拆分一次,然后将字典条目构建为:
l[0].strip():l[1].strip()
这种重构需要嵌套的理解还是不同的方式来构造单级理解?
2条答案
按热度按时间ryhaxcpt1#
如果你使用的是Python >= 3.8,这就是为什么要添加赋值表达式的原因:
在此之前,您可以执行以下操作:
老实说,我觉得更有可读性。
但老实说,这两个对我来说都是相当不可读的。在一天结束的时候,我不认为你能打败:
编辑
注意,
for <target list> in [<expression>]
习惯用法实际上在Python 3.9中已经 * 优化 *:https://docs.python.org/3/whatsnew/3.9.html#optimizations
优化了解析中分配临时变量的习惯用法。现在,解析式中的
for y in [expr]
与简单赋值y = expr
一样快。例如:sums = [s for s in [0] for x in data for s in [s + x]]
与
:=
操作符不同,该习惯用法不会将变量泄漏到外部作用域。比较Pyhton 3.8和Pyhton 3.9中的字节码,你会注意到Python 3.9版本中没有嵌套迭代:
Python 3.8:
对比Python 3.9:
uujelgoq2#
使用
re.findall
: