⽣成器
利⽤迭代器,我们可以在每次迭代获取数据(通过next()⽅法)时按照特定的规律进⾏⽣成。但是我们在实现⼀个迭代器时,关于当前迭代到的状态需要我们⾃⼰记录,进⽽才能根据当前状态⽣成下⼀个数据。为了达到记录当前状态,并配合next()函数进⾏迭代使⽤,我们可以采⽤更简便的语法,即⽣成器(generator)。⽣成器是⼀类特殊的迭代器。
yield
- 使⽤了yield关键字的函数不再是函数,⽽是⽣成器。(使⽤了yield的函数就是⽣成器)
- yield关键字有两点作⽤:
1.保存当前运⾏状态(断点),然后暂停执⾏,即将⽣成器(函数)挂起
2.将yield关键字后⾯表达式的值作为返回值返回,此时可以理解为起到了return的作⽤ - 可以使⽤next()函数让⽣成器从断点处继续执⾏,即唤醒⽣成器(函数)
- Python3中的⽣成器可以使⽤return返回最终运⾏的返回值,⽽Python2中的⽣成器不允许使⽤return返回⼀个返回值(即可以使⽤return从⽣成器中退出,但return后不能有任何表达式)。
产生生成器方法
推导式[]换成()
使用yield next执行程序,于yield处暂停,下次调用next继续执行。
生成器模板:
1.next启动方式:
注:
- 生成器通过next执行
- ret.value于异常捕捉处得到上方return的值
2.send方法启动:
同next方法,但能传参数,得到yield前的传的参数的值ret值及同next的值(得到两个值)
给新的一个参考值,通过send传进去,并同执行一次next,结果得到send值及next值
注意: send不能在第一次执行,或第一次用send(None)
使用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()
# 先让t1运行一会,当t1中遇到yield的时候,再返回到24行,然后
# 执行t2,当它遇到yield的时候,再次切换到t1中
# 这样t1/t2/t1/t2的交替运行,最终实现了多任务....协程
while True:
next(t1)
next(t2)
if __name__ == "__main__":
main()