在python中迭代具有停止点的无限容器

在python中迭代具有停止点的无限容器,python,Python,假设我想在python中生成一组平方小于100的正整数列表 我最初的想法是这样做 from itertools import count numbers = [x for x in count() if x**2<100] 来自itertools导入计数 如果x**2这将是以下情况的一个用例: 话虽如此,基于循环的方法也是完全合法的,有一种不需要任何库工具就可以在一行中实现它的黑客方法,通过引起“人为的”: numbers=list(x如果x**2我会使用takewhile: nums

假设我想在python中生成一组平方小于100的正整数列表

我最初的想法是这样做

from itertools import count
numbers = [x for x in count() if x**2<100]
来自itertools导入计数

如果x**2这将是以下情况的一个用例:

话虽如此,基于循环的方法也是完全合法的,有一种不需要任何库工具就可以在一行中实现它的黑客方法,通过引起“人为的”:


numbers=list(x如果x**2我会使用
takewhile

nums = itertools.takewhile(lambda x: x**2 < 100, count())
nums=itertools.takewhile(lambda x:x**2<100,count())

从字面上看,当正方形小于100时,如果你使用range,我会这样写

import math
[x for x in range(int(math.sqrt(100))+1) if (x**2) < 100]
导入数学
[x表示范围内的x(整数(数学平方比(100))+1)如果(x**2)<100]

您可以将100更改为您喜欢的值或将其设置为变量,但您知道数字列表将以目标数字的平方根结束。

您也可以使用for循环,并在必要时中断它,这是完美的Pythonic。不要将Pythonic与“将列表理解用于所有内容”联系起来
numbers = list(x if x**2<100 else next(iter([])) for x in count())
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
nums = itertools.takewhile(lambda x: x**2 < 100, count())
import math
[x for x in range(int(math.sqrt(100))+1) if (x**2) < 100]