在列表推导或生成器表达式中使用while
我可以在列表推导式和生成器表达式中使用 if
和 for
,像这样:
list(i for i in range(100) if i*i < 30)
我知道这样做不是最有效率的,但请耐心听我解释,因为条件可能会复杂得多,这只是一个例子。不过,这样的代码会执行几百次,但只在前六次返回值。有没有办法告诉生成器表达式在哪里停止,比如这样:
list(i for i in range(100) while i*i < 30)
不过,生成器表达式不支持 while
。所以,我的问题是,如何写一个带有停止条件的生成器表达式,这样即使没有新的返回值,它也不会继续计算。
2 个回答
27
因为 takewhile()
和 dropwhile()
的写法不是特别清晰,这里给你一些实际的例子来帮助理解:
>>> [i for i in itertools.takewhile(lambda x: x*x<30, range(10))]
[0, 1, 2, 3, 4, 5]
>>> [i for i in itertools.dropwhile(lambda x: x*x<30, range(10))]
[6, 7, 8, 9]
要知道,itertools 的作者曾经 质疑过 是否应该废弃这两个函数。
14
itertools
这个库里的各种函数(比如说takewhile()
)可以提供帮助。