我有多个yield返回的生成器对象.准备调用这台发电机是相当费时的操作.这就是我想多次重用发生器的原因.
y = FunctionWithYield()
for x in y: print(x)
#here must be something to reset 'y'
for x in y: print(x)
Run Code Online (Sandbox Code Playgroud)
当然,我正在考虑将内容复制到简单的列表中.
在python中我尝试使用赋值创建我的迭代器的副本,但是它创建了一个迭代器的副本,它引用了原始迭代器本身.例如:
my_list = [5, 4, 3,2]
first_it = iter(my_list)
second_it = first_it
print next(first_it ) #it will print 5
print next(second_it) #it will print 4
print next(first_it ) #it will print 3
Run Code Online (Sandbox Code Playgroud)
正如您在示例中看到的,first_it和second_it都引用相同的迭代器对象.是否可以创建一个不引用原始对象的迭代器对象的副本?
注意
此问题是关于如何按值创建迭代器对象的副本.所以不要提及for item in my_list:类似的解决方案.
提前致谢
我正在使用发电机功能,说:
def foo():
i=0
while (i<10):
i+=1
yield i
Run Code Online (Sandbox Code Playgroud)
现在,我希望选择在任意次数的迭代后复制生成器,以便新副本将保留内部状态(在示例中将具有相同的"i"),但现在将独立于原始状态(即迭代)副本不应该改变原来的).
我尝试过使用copy.deepcopy但是我得到了错误:
"TypeError: object.__new__(generator) is not safe, use generator.__new__()"
Run Code Online (Sandbox Code Playgroud)
显然,我可以使用带有计数器的常规函数来解决这个问题.但我真的在寻找使用发电机的解决方案.
可能重复:
如何克隆Python生成器对象?
假设我有一个生成器'stuff_to_try',我可以逐个尝试它们但是如果我有一个想要通过生成器并且该方法是递归的方法,我想让每个递归获得一个新的生成器,从第一次收益而不是最后一次递归停止的地方.
def solve(something):
if exit_condition(something):
return
next_to_try = stuff_to_try.next()
while not if_works(next_to_try):
next_to_try = stuff_to_try.next()
solve(do_something(something))
Run Code Online (Sandbox Code Playgroud)
当然我可以在递归函数中定义stuff_to_try但是有更好的方法吗?有没有相当于stuff_to_try.clone().reset()或什么?
假设我有一台这样的发电机
def gen():
a = yield "Hello World"
a_ = a + 1 #Imagine that on my computer "+ 1" is an expensive operation
print "a_ = ", a_
b = yield a_
print "b =", b
print "a_ =", a_
yield b
Run Code Online (Sandbox Code Playgroud)
现在让我说我做
>>> g = gen()
>>> g.next()
>>> g.send(42)
a_ = 43
43
Run Code Online (Sandbox Code Playgroud)
现在我们计算了a_.现在我想像这样克隆我的发电机.
>>> newG = clonify(g)
>>> newG.send(7)
b = 7
a_ = 43
7
Run Code Online (Sandbox Code Playgroud)
但我的原作g仍然有效.
>>> g.send(11)
b = 11 …Run Code Online (Sandbox Code Playgroud)