Skip to main content

用于 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

这很不错!更短,更容易理解。
但是有一个问题,这种模式只适用于相对简单的操作。在这些情况下,您可以尝试使用 pythonmapfilterbuiltins(以及稍微更隐藏的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]

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

iterchain-0.1.3.tar.gz (4.4 kB 查看哈希)

已上传 source

内置分布

iterchain-0.1.3-py3-none-any.whl (17.3 kB 查看哈希

已上传 py3