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()
对于下面的代码
# 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()