Python生成器协同程序

时间:2017-04-06 20:15:50

标签: python generator coroutine

尝试在python中了解更多的generator / send函数。我在链接中阅读了一些内容:generator send function purpose这对我有很大帮助。

但我想了解下面的代码。为什么next(checker)必要?发送功能是否自动询问发电机中的下一个项目?我尝试在for循环之前只有next(checker)但是它的功能不同。我认为发送功能发送'尝试'作为x并产生x == password。我只是不明白为什么必须在循环中使用下一个(检查器)。

def checkPassword(attempts, password):
    def check():
        while True:
            x = yield
            yield x == password

    checker = check()
    for i, attempt in enumerate(attempts):
        next(checker)
        if checker.send(attempt):
            return i + 1

    return -1

上述功能基于以下问题:

"为了验证您的功能,您想在本地测试它。给定尝试列表和正确的密码,返回第一次正确尝试的从1开始的索引,如果没有,则返回-1。

实施例

attempts = ["hello", "world", "I", "like", "coding"]和。{ password = "like",输出应为 checkPassword(尝试,密码)= 4。"

1 个答案:

答案 0 :(得分:5)

  

发送功能是否自动要求生成器中的下一个项目?

是的,但是编写这个生成器的方式,一半的值来自yield

x = yield

只会产生None。拨打next的电话会消耗None

生成器可能采用不同的方式编写,以消除大多数next调用:

def checkPassword(attempts, password):
    def check():
        x = yield
        while True:
            x = yield x == password

    checker = check()
    next(checker)
    for i, attempt in enumerate(attempts):
        if checker.send(attempt):
            return i + 1

    return -1

但是,生成器与其用户之间的yield / send通信不能以send开头,因为新的生成器在函数体的开头而不是在可以获得值的yield。因此,在开始next生成器将使用的值之前,始终必须有send(None)(或等效于send)。

相关问题