相关疑难解决方法(0)

在Python中重置生成器对象

我有多个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 yield generator

133
推荐指数
8
解决办法
6万
查看次数

如何创建python迭代器的副本?

在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:类似的解决方案.
提前致谢

python iterator python-2.7 python-3.x

17
推荐指数
1
解决办法
1万
查看次数

在python中深度复制生成器

我正在使用发电机功能,说:

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 generator

16
推荐指数
2
解决办法
5422
查看次数

如何获取生成器函数的多个实例

可能重复:
如何克隆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()或什么?

python generator

5
推荐指数
1
解决办法
789
查看次数

复制发电机

假设我有一台这样的发电机

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)

python clone generator coroutine python-2.7

4
推荐指数
2
解决办法
5567
查看次数

标签 统计

python ×5

generator ×4

python-2.7 ×2

clone ×1

coroutine ×1

iterator ×1

python-3.x ×1

yield ×1