如何在纯功能工作流中使用python迭代器
困扰我的是,python迭代器不属于纯不可变对象的定义,因为重新访问它们会修改它们的行为。 我理解它的工作方式,但是使用迭代器读取代码可能会变得混乱,并且看起来不太像Python 我的问题是。。。有没有一种很好的蟒蛇式的方法 也就是说,这里使用迭代器会产生副作用(输入参数被修改),使函数不纯净如何在纯功能工作流中使用python迭代器,python,functional-programming,semantics,Python,Functional Programming,Semantics,困扰我的是,python迭代器不属于纯不可变对象的定义,因为重新访问它们会修改它们的行为。 我理解它的工作方式,但是使用迭代器读取代码可能会变得混乱,并且看起来不太像Python 我的问题是。。。有没有一种很好的蟒蛇式的方法 也就是说,这里使用迭代器会产生副作用(输入参数被修改),使函数不纯净 def foo(i): 退货清单(一) b=国际热核实验堆([1,2,3]) 打印(foo(b))#输出[1,2,3] 打印(foo(b))#输出[] 打印(列表(b))#输出[] 示例中的问题是迭代器的
def foo(i):
退货清单(一)
b=国际热核实验堆([1,2,3])
打印(foo(b))#输出[1,2,3]
打印(foo(b))#输出[]
打印(列表(b))#输出[]
示例中的问题是迭代器的状态在全局范围内,这与“无副作用”规则有点冲突。一旦它耗尽(例如,它抛出StopIteration异常),它就完成了,必须重新初始化
从副本导入副本
def foo(一):
退货清单(一)
a=[1,2,3]
b=国际热核实验堆(a)
打印(foo(拷贝(b))#输出[1,2,3]
打印(foo(拷贝(b))#输出[1,2,3]
打印(列表(副本(b))#输出[1,2,3]
示例中的问题是迭代器的状态在全局范围内,这与“无副作用”规则有点冲突。一旦它耗尽(例如,它抛出StopIteration异常),它就完成了,必须重新初始化
从副本导入副本
def foo(一):
退货清单(一)
a=[1,2,3]
b=国际热核实验堆(a)
打印(foo(拷贝(b))#输出[1,2,3]
打印(foo(拷贝(b))#输出[1,2,3]
打印(列表(副本(b))#输出[1,2,3]
感谢您的关注!我已经更新了示例代码。('a'在foo方法中应该是'i')您的更改不会改变任何东西,您正在向foo()
的两个调用传递相同的迭代器。也许我没有明确指出,一旦您创建了迭代器,它将保持自身的状态。因此,一旦迭代器耗尽,它将不会产生相同的结果。你可以说迭代器的使用方式并不纯粹,这主要是迭代器的设计和/或是因为在这种情况下,迭代器是“作为引用”传递的。为了避免这种情况。看看我添加的模仿你的例子…谢谢你的发现!我已经更新了示例代码。('a'在foo方法中应该是'i')您的更改不会改变任何东西,您正在向foo()
的两个调用传递相同的迭代器。也许我没有明确指出,一旦您创建了迭代器,它将保持自身的状态。因此,一旦迭代器耗尽,它将不会产生相同的结果。你可以说迭代器的使用方式并不纯粹,这主要是迭代器的设计和/或是因为在这种情况下,迭代器是“作为引用”传递的。为了避免这种情况。请看我添加的模仿您的示例。您可以创建自己的持久化生成器,前提是您愿意丢失本机类型的功能。FP利用corecursion获得类似迭代器的行为。为了让corecursion在无限的数据结构上工作,需要懒散。我不知道如何用python来表达这一点,但在JS中,有一些懒惰的对象获取程序可以解决这个问题。下面是一个小的JS草图,您可能希望将其转换为python。您可以制作自己的持久化生成器,前提是您愿意丢失本机类型的功能。FP利用corecursion获得类似迭代器的行为。为了让corecursion在无限的数据结构上工作,需要懒散。我不知道如何用python来表达这一点,但在JS中,有一些懒惰的对象获取程序可以解决这个问题。下面是一个小的JS草图,您可能希望将其转换为python。