【问题标题】:How do change a parameter in a generator using a send method?如何使用发送方法更改生成器中的参数?
【发布时间】:2022-01-05 07:10:01
【问题描述】:

我想更改我的生成器中的一个参数,但我不知道如何正确执行我认为我的生成器无法正常工作,因为它在 while 循环中工作,我希望它带来 0,1,2,3,4,0,1,2,3,4,5,6,7,8,9

def gen(k=None):
    z = 0
    exc = 0
    while True:
        yield z
        z += 1
        if z > 10:
            break
        if k is not None:
            z = k
            exc += 1
        if exc > 1:
            break


gen1 = gen()
for i in gen1:
    print(i)
    if i == 5:
        gen1.send(0)

【问题讨论】:

  • 当你调用send函数时,你是不是想改变k的值?

标签: python python-3.x generator


【解决方案1】:
def gen():
    z, exc = 0, 0
    while True:
        k = yield z
        if k is not None:
            if exc:
                z -= 1
            else:
                z, k, exc = k - 2, None, exc + 1
        z += 1
        if z > 9 or exc > 1:
            break


gen1 = gen()
for i in gen1:
    print(i)
    if i == 4:
        gen1.send(0)
0
1
2
3
4
0
1
2
3
4
5
6
7
8
9

【讨论】:

    【解决方案2】:

    我认为您误用了 send 函数。这里有一个很好的解释:python generator "send" function purpose?

    我无法找到一种方法来从生成器中获得您正在寻找的东西,但是使用一个小的迭代器类有点难看:

    class gen2:
    
        def __init__(self, k=None):
    
            self.k = k
            self.z = -1
            self.exc = 0
            self.firstRet = False
    
        def __next__(self):
    
            if self.firstRet and (self.k is not None):
                self.z = self.k
                self.exc += 1
    
            if self.exc > 1:
                raise StopIteration
    
            self.z += 1
            if self.z > 10:
                raise StopIteration
            else:
                self.firstRet = True
                return self.z
    
        def __iter__(self):
            return self
    
        def reset_z(self, value):
            self.z = value-1
    
    
    gen1 = gen2()
    for i in gen1:
        print(i)
        if i == 5:
            gen1.reset_z(0)
    

    我认为这具有您正在寻找的行为。

    【讨论】:

      猜你喜欢
      • 2019-02-25
      • 1970-01-01
      • 2012-09-20
      • 2019-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-16
      • 2022-06-15
      相关资源
      最近更新 更多