用于 Python 的简单且符合人体工程学的迭代器链接
项目描述
Iterchain:Python 的迭代器链
Iterchain 是一个旨在使 Python 中的迭代器操作更容易且更符合人体工程学的库。该设计深受Rust 迭代器设计的启发,许多功能来自标准 Python itertools库。
为什么我需要这个?
假设我们想知道不超过 100 的偶数的所有平方和。
我们该怎么做呢?
让我们尝试一些简单的程序化 Python:
>>> total = 0
>>> for i in range(100):
... if i % 2 is 0:
... total += i ** 2
...
>>> total
161700
这行得通,但是如果您是第一次阅读本文,可能需要花费一些精力来弄清楚发生了什么,尤其是在稍微不那么琐碎的情况下。那么,我们如何使用迭代器呢?
好吧,走着瞧:
>>> sum(i**2 for i in range(100) if i % 2 is 0)
161700
这很不错!更短,更容易理解。
但是有一个问题,这种模式只适用于相对简单的操作。在这些情况下,您可以尝试使用 pythonmap
和filter
builtins(以及稍微更隐藏的functools.reduce
)。它们使您可以构建更复杂的处理链。
让我们重写我们的迭代器来使用这些函数:
>>> sum(map(lambda x: x**2, filter(lambda x: x % 2 is 0, range(100))))
161700
好吧,现在情况一团糟……
我不了解你,但我需要很长时间才能弄清楚这里发生的事情。问题是整个表达式是由内而外的。首先filter
应用gets,但它隐藏在表达式的中间,sum
最后应用gets但它一直在前面。没有意义...
那么,我们该如何改进呢?iterchain
当然!
(你可能已经看到了)
所以,让我们看看它是如何使用的iterchain
:
>>> import iterchain
>>> (iterchain.count(stop=100)
... .filter(lambda x: x % 2 is 0)
... .map(lambda x: x**2)
... .sum())
161700
这不是好多了吗?这些操作按执行顺序列出,清晰分开,您可以根据需要进行尽可能少或尽可能多的操作。这就是你应该使用的原因iterchain
!
迭代器操作
这个图书馆的心脏<3
。
发电机
iterchain
还提供了方便的方法,让您Iterator
从头开始构建新实例。它们包含在iterchain.generators
子模块中,但也可以直接从iterchain
模块中访问,这是使用它们的首选方式。
例如:
>>> import iterchain
>>> iterchain.count().take(4).map(lambda x: x**2).to_list()
[0, 1, 4, 9]
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。