python 从其他函数调用生成器函数

python call generator function from other function

对于下面的代码

# A simple generator function
def infinite_sequence():
    num = 1
    while True:
        yield num
        num += 1

aaa = infinite_sequence()
bbb = infinite_sequence()
ccc = infinite_sequence()

print(next(aaa))
print(next(aaa))
print(next(bbb))
print(next(bbb))
print(next(ccc))
print(next(ccc))

输出是: 1个 2个 1个 2个 1个 2

当尝试从另一个函数调用相同的生成器函数时,输出与预期不同

def switchAction(input):
  action_item = {
    "A": next(aaa),
    "B": next(bbb),
    "C": next(ccc)
  }
  return action_item.get(input)
  

print(switchAction("A"))
print(switchAction("A"))
print(switchAction("B"))
print(switchAction("B"))
print(switchAction("C"))
print(switchAction("C"))

输出为: 1个 2个 3个 4个 5个 6

为什么计数器在从另一个函数调用的情况下跨生成器函数继续?上面第二种情况如何实现和第一种情况一样的输出。

问题是您每次调用 switchAction 时都会对所有值调用 next,因为您一遍又一遍地定义字典。您的问题的解决方案如下:

# A simple generator function
def infinite_sequence():
    num = 1
    while True:
        yield num
        num += 1

aaa = infinite_sequence()
bbb = infinite_sequence()
ccc = infinite_sequence()

action_item = {
    "A": aaa,
    "B": bbb,
    "C": ccc
} # create the dict one time, and don't call next within the definition.

def switchAction(name): # also input is a dangerous var name so change it to name
    return next(action_item.get(name))


print(switchAction("A"))
print(switchAction("A"))
print(switchAction("B"))
print(switchAction("B"))
print(switchAction("C"))
print(switchAction("C"))

每次你调用switchAction函数,它都会用生成器的下一个值重新定义action_item。因此,您可以使用回调解决该问题。

def switchAction(input):
    action_item = {
        "A": lambda: next(aaa),
        "B": lambda: next(bbb),
        "C": lambda: next(ccc),
    }
    _next = action_item.get(input)
    if callable(_next):
        return _next()