【发布时间】:2016-02-09 13:54:51
【问题描述】:
相关问题How do I merge two python iterators? 适用于两个独立的迭代器。但是,我无法找到或想到合并两个迭代器所需的工具,其中一个迭代器是递归的,另一个作为输入。我有迭代器stuff,这是一个简单的列表。然后我有迭代器theta,它接受一个函数func 并产生x、func(x)、func(func(x)),其中func 的输入之一是stuff 的一个元素。我用可变状态解决了这个问题,如下所示:
theta = some_initial_theta
for thing in stuff:
theta = update_theta(theta, thing)
return theta
这种格式的具体例子:
def update_theta(theta, thing):
return thing * 2 + theta
stuff = [100, 200, 300, 400]
def my_iteration():
theta = 0
for thing in stuff:
theta = update_theta(theta, thing)
print(theta)
# This prints 2000
我确信在没有可变状态和 for 循环的情况下,有一种优雅的方法可以做到这一点。一个简单的 zip 不适合我,因为 theta 迭代器使用它的前一个元素作为下一个元素的输入。
表达 theta 的一种优雅方式是使用 more_itertools package 中提供的 iterate 方法:
iterate(lambda theta: update_theta(theta, thing), some_initial_theta)
但是,问题在于thing 将在整个迭代过程中得到修复。可以通过传入整个列表 stuff 来处理这个问题,然后从 update_theta 方法返回它的其余部分:
iterate(lambda theta: update_theta(theta[0], theta[1]), (some_initial_theta, stuff))
但是,我真的不想修改update_theta 方法来获取它不感兴趣的整个列表并处理返回该列表尾部的机制。虽然它在编程上并不困难,但它的关注点分离很差。 update_theta 不应该知道或关心整个列表 stuff。
【问题讨论】:
-
您能否提供一个简单的自包含示例来说明您在说什么(例如,以您所描述的方式运行的简单迭代器的实际示例)?
-
@BrenBarn 我添加了一个具体的例子。
-
@PeterWood 你将如何处理在reduce 的每一步中获取列表
stuff的新元素? -
我真的看不出你的做法有什么问题。同样从您的示例中,您似乎正在尝试将两个迭代器组合起来以获得单个结果(不是中间结果的可迭代),这与您链接到的问题有些不同,并且意味着发生的事情的详细信息获得该结果的方法可能不太重要。
标签: python recursion functional-programming iterator generator