在某些情况下,我想要 python 语法用于短路列表理解或生成器表达式。
这是一个简单的列表推导,以及 python 中的等效 for 循环:
my_list = [1, 2, 3, 'potato', 4, 5]
[x for x in my_list if x != 'potato']
result = []
for element in my_list:
if element != 'potato':
result.append(element)
该语言不支持短路的理解。建议的语法,以及 python 中的等效 for 循环:
[x for x in my_list while x != 'potato']
# --> [1, 2, 3]
result = []
for element in my_list:
if element != 'potato':
result.append(element)
else:
break
它应该适用于任意迭代,包括无限序列,并且可以扩展到生成器表达式语法。我知道list(itertools.takewhile(lambda x: x != 'potato'), my_list)
作为一种选择,但是:
- 它不是特别pythonic - 不像while理解那样可读
- 它可能不如 CPython 理解那么高效或快速
- 它需要一个额外的步骤来转换输出,而这可以直接放入理解中,例如
[x.lower() for x in mylist]
- 连原作者都不太喜欢。
我的问题是,对于为什么将语法扩展到这个用例不是一个好主意,是否存在任何理论上的问题,或者它只是不可能,因为 python 开发人员认为它很少有用?这似乎是对语言的简单补充,也是一个有用的功能,但我可能忽略了一些隐藏的微妙之处或复杂性。