<分区>
有好几次,我都希望使用 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 comprehension 那样可读
- 它可能无法像 CPython 理解一样高效或快速
- 它需要一个额外的步骤来转换输出,而这可以直接放入理解中,例如
[x.lower() for x in mylist]
- 甚至original author doesn't seem to like it much .
我的问题是,关于为什么将语法扩展到这个用例不是一个好主意,或者只是不可能因为 python 开发人员认为它很少有用,是否存在任何理论上的问题?这似乎是对该语言的一个简单补充,也是一个有用的功能,但我可能忽略了一些隐藏的微妙之处或复杂性。