# (x for x in range()) 类型:生成器(第一种定义)
# [x for x in range()] 类型:列表对象
#回收机制
# a=1
# b=a
# a=2
# b=10
#当一个数据没有被指向时会被回收,1被回收
def foo():
print('111')
yield 1
print('222')
yield 2
#
# next(foo())
for i in foo():
print(i)
输出
111
1
222
2
生成器的一个例子
# # 生成器例子
#
# def fib(max):
# n,before,after=0,0,1
#
# while n<max:
# yield before
# before,after=after,before+after
# n=n+1
before,after=after,before+after 先对右边计算再赋值
与before=after
after=before+after不同
生成器的send方法
# def bar():
# print('ok1')
# count=yield 1
# print(count)
# yield 2
#
# b=bar() #yield时bar()是一个生成器对象
# s=b.send(None)#next() 第一次send前如果没有next,只能传一个send(None)
# print(s)
# b.send('2e') #'2e传给count
举例
import time
def consumer(name):
print("%s 准备吃包子啦!" %name)
while True:
baozi = yield #baozi接收send中传入的值
print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
def producer(name):
c = consumer('A')
c2 = consumer('B')
c.__next__()
c2.__next__()
print("开始准备做包子啦!")
for i in range(10):
time.sleep(1)
print("做了2个包子!")
c.send(i) #生成器用send传入值
c2.send(i)
producer("alex")
A 准备吃包子啦!
B 准备吃包子啦!
老子开始准备做包子啦!
做了2个包子!
包子[0]来了,被[A]吃了!
包子[0]来了,被[B]吃了!
做了2个包子!
包子[1]来了,被[A]吃了!
包子[1]来了,被[B]吃了!
什么是迭代器?
满足两个条件 1、有iter方法 2、有next方法
for 循环内部三件事:
1、 调用可迭代对象的iter方法返回一个迭代器对象
2 、不断调用迭代器对象的next方法
while:
try:
i=next(list_Iterator)
except StopIteration
break
3、处理StopIteration
生成器是特殊迭代器,迭代器不一定是生成器
注意:生成器在创建的时候已经决定了能计算出值的个数调用next的次数超过这个值就会包StopIteration