在这个例子中使用“yield”的正确方法

时间:2016-02-09 19:14:20

标签: python yield

我正在尝试演示如何使用Python中的yield。我想通过一个例子证明这一点。

该示例将要求用户输入yesno,并在每次输入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'

感谢。

3 个答案:

答案 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):

但是,这需要您更新生成器以获取输入。

这足以让你感动吗?