简单且符合人体工程学的python迭代器链接
iterchain的Python项目详细描述
iterchan:python的迭代器链接
iterchain是一个库,旨在使在python中操作迭代器更容易,更符合人体工程学。 这个设计受到了Rust iterator design的极大启发,很多功能都来自标准的python itertools库。
为什么我需要这个?
假设我们想知道100以下偶数的平方和。
我们怎么能这样做?
让我们尝试一些简单的程序化python:
>>>total=0>>>foriinrange(100):...ifi%2is0:...total+=i**2...>>>total161700
这是有效的,但是如果你第一次读到这篇文章的话,你可能需要花一点功夫来弄清楚发生了什么,特别是在一些不那么琐碎的情况下。 那么,我们改用迭代器怎么样?
好吧,让我们看看:
>>>sum(i**2foriinrange(100)ifi%2is0)161700
太好了!更短,更容易理解。
但有一个问题,这个模式只适用于相对简单的操作。在这些情况下,您可以尝试使用pythonmap
和filter
内置(以及稍微隐藏的functools.reduce
)。它们允许您构建更复杂的处理链。
让我们重写迭代器以使用这些函数:
>>>sum(map(lambdax:x**2,filter(lambdax:x%2is0,range(100))))161700
好吧,现在那一团糟…
我不知道你的情况,但我要花很长时间才能弄清楚这里发生了什么。问题是整个表达式是由内而外的。首先应用filter
,但它隐藏在表达式的中间,最后应用sum
,但它一直位于前面。毫无意义…
那么,我们该如何改进呢?iterchain
当然!
(您可能已经看到了这一点)
那么,让我们看看使用iterchain
:
>>>importiterchain>>>(iterchain.count(stop=100)....filter(lambdax:x%2is0)....map(lambdax:x**2)....sum())161700
这不是更好吗?这些操作按执行顺序列出,并清楚地分开,您可以拥有任意数量的操作。这就是为什么你应该使用iterchain
!
迭代器操作
这个图书馆的核心。
发电机
iterchain
还提供了方便的方法,让您可以从头开始构建新的Iterator
实例。它们包含在iterchain.generators
子模块中,但是也可以直接从iterchain
模块访问它们,这是使用它们的首选方式。
例如:
>>> import iterchain
>>> iterchain.count().take(4).map(lambda x: x**2).to_list()
[0, 1, 4, 9]