我是发电机和协程的新手。我试图使用生成器来模仿常见的直方图问题(给出一个列表,返回该列表中每个元素的出现情况)。

def genFunc():
    dct = {}
    while True:
        num = yield
        if num not in dct.keys():
            dct[num]=1
        else:
            dct[num]+=1
        print dct


g = genFunc()
next(g)

for each in [1,1,1,2]:
    print g.send(each)


使用上面的代码,我可以在每个阶段打印出字典“ dct”的状态。如何将其返回给调用函数?如果我在while块之外使用return,则会出现错误-无法将return与yield一起使用。

据我了解,在send中传递的值由yield语句的生成器接收。在这种情况下,理想情况下,我希望传递一个数字/整数并返回dict的当前状态。

最佳答案

yield将数据“返回”。您正在使用它来接收来自呼叫者的数据,但它也可以用于发送数据:

def genFunc():
    dct = {}
    while True:
        num = yield dct  # I'm yielding the dictionary
        if num not in dct.keys():
            dct[num] = 1

        else:
            dct[num] += 1


g = genFunc()
next(g)

for each in [1, 1, 1, 2]:
    print g.send(each)

{1: 1}
{1: 2}
{1: 3}
{1: 3, 2: 1}


send返回产生的结果。

关于python - 使用Python生成器的直方图问题?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59314071/

10-12 23:12