3 回答
TA贡献1815条经验 获得超10个赞
我们还对Python 3进行了另一项修改,以改进列表理解和生成器表达式之间的等价性。在Python 2中,列表理解“泄漏”循环控制变量到周围的作用域中: x = 'before'a = [x for x in 1, 2, 3]print x # this prints '3', not 'before'
这是列表理解的原始实现的一个工件;多年来它一直是Python的“肮脏的小秘密”之一。它最初是一种有意的妥协,目的是让列表理解得快得让人目瞪口呆,虽然对于初学者来说这不是一个常见的陷阱,但它确实偶尔会刺痛人们。对于生成器表达式,我们不能这样做。生成器表达式是使用生成器实现的,生成器的执行需要一个单独的执行框架。因此,生成器表达式(特别是在短序列上迭代时)的效率低于列表理解。
然而,在Python 3中,我们决定通过使用与生成器表达式相同的实现策略来修正列表理解的“肮脏的小秘密”。因此,在Python 3中,上述示例(修改后使用print(X):-)将打印“Are”,证明列表理解中的“x”暂时阴影,但不覆盖周围范围中的“x”。
TA贡献1880条经验 获得超4个赞
list(x for x in a if x>32)set(x//4 for x in a if x>32) # just another generator exp.dict((x, x//16) for x in a if x>32) # yet another generator exp.{x//4 for x in a if x>32} # 2.7+ syntax{x: x//16 for x in a if x>32} # 2.7+ syntax
x
[x for x in a if x>32]set([x//4 for x in a if x>32]) # just another list comp.dict([(x, x//16) for x in a if x>32]) # yet another list comp.
x
更新Python3.8(?): :=
any()
all()
:
if any((comment := line).startswith('#') for line in lines): print("First comment:", comment)else: print("There are no comments")
total = 0partial_sums = [total := total + v for v in values]
def
lambda
nonlocal
global
.
TA贡献1877条经验 获得超1个赞
for
>>> x=0>>> a=[1,54,4,2,32,234,5234,]>>> [x for x in a if x>32][54, 234, 5234]>>> x5234
添加回答
举报