‘‘‘生成器函数的好处‘‘‘
# def test():
# for i in range(1, 101):
# print(‘开始做第%s屉包子‘ % i)
# yield (‘第%s屉包子做好了‘ % i) #运行一次函数到这里就结束且返回一个值,再运行函数执行yield下面的代码及循环,保留着函数运行状态
# print(‘开始卖第%s屉包子‘ % i)
# n = test()
# print(n)
# print(n.__next__())
# print(n.__next__())
‘‘‘
生成器总结
生成器函数总结:
1.语法上和函数类似:生成器函数和常规函数几乎是一样的。它们都是使用def语句进行定义,差别在于,生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值
2.自动实现迭代器协议:对于生成器,python会自动实现迭代器协议,以便应用到迭代背景中(如for循环,sum函数)。由于生成器自动实现了迭代器协议,所以,我们可以调用它的next方法,并且,在没有值可以返回的时候,生成器自动产生Stopiteration异常
3.状态挂起:生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行
优点一:生成器的好处是延迟计算,一次返回一个结果。也就是说,他不会一次生成所有的结果,这对于大量数据处理,将会非常有用
优点二:生成器还能有效提高代码可读性
*****注意事项:生成器只能遍历一次(遍历一次后就不能再遍历了,会报错)*****
‘‘‘
‘‘‘生产者消费者模型‘‘‘
# def producer():
# ret = []
# for i in range(1, 10001):
# ret.append(‘第%s个包子‘ % i)
# return ret
#
# def consumer(l1):
# for index, baozi in enumerate(l1, start=1):
# print(‘第%s人吃了%s‘ % (index, baozi))
#
# res = producer()
# consumer(res)
# def producer():
# for i in range(1, 10001):
# yield (‘第%s个人吃了第%s个包子‘ % (i, i))
#
# def consumer():
# return producer()
#
# res = consumer()
# print(next(res))
import time
def consumer(name):
‘‘‘消费者,只负责消费‘‘‘
print(‘我是%s,我准备开始吃包子了‘ % name)
while True:
baozi = yield
time.sleep(1)
print(‘%s很开心的把%s给吃掉了‘ % (name, baozi))
def producer():
‘‘‘生产者,只负责生产‘‘‘
c1 = consumer(‘alex‘)
c2 = consumer(‘wupeiqi‘)
c1.__next__()
c2.__next__()
for i in range(10):
time.sleep(1)
c1.send(‘第%s个肉包子‘ % i)
c2.send(‘第%s个香菇包子‘ % i)
# 两个功能独立存在,由send触发另一个函数运行,相当于A程序跳到B程序,B程序运行完又跳到A程序;这就叫并发(同时运行两个程序,两个程序之间彼此互不干扰,单线程并发),用一个程序模拟了一个并发的效果
producer()
‘‘‘send()触发生成器函数运行‘‘‘
# def test():
# print(‘第一次打印‘)
# first = yield 1 # yield可以通过send进行传值,再赋值给一个变量;send的传值是传给所停留位置的yield,然后再执行生成器直到下一个yield为止
# print(‘第二次打印‘, first)
# yield 2
# print(‘结束打印‘)
# t = test()
# x = next(t)
# print(x)
# y = t.send(‘第一次赋值‘)
# print(y)
生成器函数的好处及总结,send()第三种触发生成器函数方法,生产者消费者模型
原文:https://www.cnblogs.com/xuewei95/p/14461004.html