itertools 的 islice(count()) vs range()

Posted

技术标签:

【中文标题】itertools 的 islice(count()) vs range()【英文标题】:itertools' islice(count()) vs range() 【发布时间】:2020-11-29 14:47:29 【问题描述】:

真正的快速:

我刚刚看到tutorial,他们表明我们可以像这样一起使用 itertools 的 islice() 和 count():

for num in islice(count(), start, stop, step):
    print(num)

这样做而不是使用 range() 有什么好处吗?

【问题讨论】:

本教程并未暗示这是range 的理想替代方案。这只是一个人为的示例,用于演示这些函数的用法。 【参考方案1】:

这样做而不是使用 range() 有什么好处吗?

在这个例子中没有优势,range 将是规范的解决方案。

itertools.islice 如果你有一个任意的迭代器(特别是没有像范围这样的随机访问行为),它就变得很重要。 假设您打开了一个文件并想忽略前四行,然后每隔一行打印一次。 使用 islice,这变得很简单:

with open(path, 'r') as f:
    for line in islice(f, start=5, stop=None, step=2):
        print(line)

islicecounter 的一种可能组合是不能用 range 替换的,如果您有一个未完成的循环 (stop = None)。假设您要打印从 3 开始的所有素数。

uneven_numbers = islice(count(), start=3, stop=None, step=2):
for num in uneven_numbers:
    if is_prime(num):
        print(num)

这里特别重要的是uneven_numbers 是一个生成器而不是一个列表(这肯定会耗尽你的内存。)

【讨论】:

以上是关于itertools 的 islice(count()) vs range()的主要内容,如果未能解决你的问题,请参考以下文章

如何在不包含列/行标题的制表符分隔文件中使用 itertools.islice()

如果我使用itertool中的islice从第5行开始,如何使用DictReader?

Python标准库(3.x): itertools库扫盲

Python标准库--itertools模块

迭代器

python常用函数 I