【发布时间】:2020-10-29 21:59:15
【问题描述】:
困扰我的是,python 迭代器不属于纯不可变对象的定义,因为重新访问它们会修改它们的行为。 我了解它的工作方式,但使用迭代器阅读代码可能会变得混乱,而且看起来不是很 Python。
我的问题是......有没有一种很好的 Pythonic 方法来解决这个问题?
即此处使用迭代器会产生副作用(修改输入参数)使函数不纯
def foo(i):
return list(i)
b = iter([1,2,3])
print(foo(b)) # outputs [1,2,3]
print(foo(b)) # outputs []
print(list(b)) # outputs []
【问题讨论】:
-
你可以制作自己的持久化生成器,前提是你愿意失去原生类型的特性。 FP 利用 corecursion 来获得类似迭代器的行为。为了让 corecursion 在无限数据结构上工作,虽然需要惰性。我不知道如何用 python 来表达这一点,但在 JS 中有惰性对象获取器来拯救。这是一个 persistent iterator based on corecursion 的小 JS 草图,您可能希望将其转换为 python。
标签: python functional-programming semantics