我正在尝试演示如何使用Python中的yield
。我想通过一个例子证明这一点。
该示例将要求用户输入yes
或no
,并在每次输入n
时将计数器yes
增加1。
我要展示yield
如何工作的部分是当用户再次调用该函数并获取更新的次数值时。例如,如果使用了return,并且用户再次运行脚本,它将从头开始,次数为1
。相反,我希望用户得到1,2,3,...等,这是输入的次数。
此处的问题是如何使用yield
来演示此类示例。在我下面写的代码中,我总是返回generator object
而不是n
的值。如何才能获得返回的整数值n
?
def yes_times(answer):
n = 0
if answer == 'yes':
n = n + 1
yield n
answer = raw_input('"yes" or "no": ')
times = yes_times(answer)
print 'You answered yes ' + str(times) + ' times'
感谢。
答案 0 :(得分:4)
我正在尝试演示如何使用Python中的
yield
。......示例问题......
此处的问题是如何使用
yield
来演示此类示例。
你正在倒退。
不要通过选择与生成器行为无关的任意示例演示如何使用yield
,并尝试使用yield
实现它。
相反,选择yield
擅长的内容并实施 - 最好使用可比较的非yield
实施方式,以便展示其优势。
简单示例:range
def naive_range(begin, end):
i = begin
result = []
while i < end:
result.append(i)
i = i + 1
return result
def generate_range(begin, end):
i = begin
while i < end:
yield i
i = i + 1
现在,您能说出天真实施的弊端吗?什么时候会比发电机差得多,为什么?
答案 1 :(得分:1)
对于您的示例,您可以尝试:
def yes_times(answer = None):
count = 0
while True:
if answer=="yes":
count += 1
answer = yield count
else:
answer = yield count
gen = yes_times()
gen.next()
while True:
answer = raw_input('"yes" or "no": ')
print 'You answered yes ' + str(gen.send(answer)) + ' times'
答案 2 :(得分:0)
问题是你正在尝试使用生成器,就像它是一个函数一样。我强烈建议你在线阅读一个教程,直到你掌握了它的不同之处 - 毕竟,这就是我如何戒掉这个错误。 : - )
您的陈述
times = yes_times(answer)
实例化生成器,这是打印时获得的。相反,您需要使用下一个功能......
times = next(yes_times(answer))
......或者正确使用能够满足您需求的发电机。生成器的一般用途是将其识别为 stream 数据,如
for times in yes_times(answer):
但是,这需要您更新生成器以获取输入。
这足以让你感动吗?