Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在纯功能工作流中使用python迭代器_Python_Functional Programming_Semantics - Fatal编程技术网

如何在纯功能工作流中使用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))#输出[] 示例中的问题是迭代器的

困扰我的是,python迭代器不属于纯不可变对象的定义,因为重新访问它们会修改它们的行为。 我理解它的工作方式,但是使用迭代器读取代码可能会变得混乱,并且看起来不太像Python

我的问题是。。。有没有一种很好的蟒蛇式的方法

也就是说,这里使用迭代器会产生副作用(输入参数被修改),使函数不纯净

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。