- 使用了yield关键字的函数不再是函数,而是生成器。(使用了yield的函数就是生成器)
- yield关键字有两点作用:
- 保存当前运行状态(断点),然后暂停执行,即将生成器(函数)挂起
- 将yield关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用
- 可以使用next()函数让生成器从断点处继续执行,即唤醒生成器(函数)
- Python3中的生成器可以使用return返回最终运行的返回值,而Python2中的生成器不允许使用return返回一个返回值(即可以使用return从生成器中退出,但return后不能有任何表达式)。
1. 第一次唤醒时,使用send必须传值为 None,如果传其他的,会报错
TypeError: can't send non-None value to a just-started generator
2. 当在一个函数内既有yield又有return(在末端)时,return不影响yield使用,那怎样取return的结果呢?
使用生成器的next或send方法唤醒,当抛出stopiteration异常后,取异常的值就是返回值
while True:
try:
ret = next(g)
print(ret)
except Exception as e:
print(e)
print(e.value)#这两种方式都可以取到return的值
break
利用yield实现协程(函数交替执行)
其原理,利用yield的中断函数的功能
import time
def task_1():
while True:
print("----1-----")
time.sleep(0.1)
yield
def task_2():
while True:
print("----2-----")
time.sleep(0.1)
yield
def main():
t1 = task_1()
t2 = task_2()
while True:
next(t1)
next(t2)
if __name__ == '__main__':
main()
网友评论