尝试在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。"
答案 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
)。