使用Python生成器时出现直方图问题?

使用Python生成器时出现直方图问题?,python,python-2.x,Python,Python 2.x,我不熟悉发电机和协同程序。我试图使用生成器模拟常见的直方图问题(给定一个列表,返回该列表中每个元素的出现次数) def genFunc(): dct = {} while True: num = yield if num not in dct.keys(): dct[num]=1 else: dct[num]+=1 print dct g = genFunc() n

我不熟悉发电机和协同程序。我试图使用生成器模拟常见的直方图问题(给定一个列表,返回该列表中每个元素的出现次数)

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,我会得到一个错误-不能使用带有yield的return

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

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
返回生成的内容。

您正在使用Python2吗?原因是什么?Python2将在18天内下线…@AndrejKesely它会突然停止工作吗?@Carcigenicate“没有必要使用2.7”是一个相当大胆的说法。我一直在开发一个庞大的Python2.x代码库,并不打算迁移到3.x,因此显然有必要。@Selcuk我理解在需要维护遗留应用程序时使用Python2。“但是把它作为“第一条”Python学习,是不可能的……”AndrejKesely同意。虽然OP声明它们是“生成器和协同程序的新手”,但一般来说不是Python。谢谢!这很有帮助。。我对发送和放弃感到困惑。。