迭代器&生成器&yield异步

迭代器

#迭代器是访问集合元素的一种形式,迭代器从集合的第一个元素开始访问,直到所有的元素被访问
# 结束才结束,迭代器只能往前访问,不能往后访问,比如你先访问1,在访问2,在访问3.如果已经
# 访问到3了,你就不能访问2了;迭代器仅仅在迭代到某个元素才计算该元素的值,而在访问之前
# 或者之后,该元素可以不存在或者被销毁,这个特点使得他适合于遍历一些巨大的或者无限的集合
#迭代器仅仅有一个方法next


name = iter(['a','b','c'])
print(type(name))

# <class 'list_iterator'>
#迭代器是不能这样的访问的
# print(name[1])

#迭代器只能这样访问

print(name.__next__())
# a
print(name.__next__())
# b
ret = name.__next__()
print(ret)
# c


#迭代器只能往后取,不能往前取,而且一次只能取一个值
#只能从头到尾依次访问
#便于循环比较大的数据集合,节省内存


生成器
#生成器:如果调用一个函数,返回的是是一个迭代器,那么这个函数就叫做生成器
# 如果函数中包含yield语法,那这个函数就会变为生成器,返回一个迭代器


def cash_money(amount):
while amount >= 0:
amount -= 100
yield 100 #这里的yield就是返回一个值,和以前的return是一样的
print('我又来取钱了!')


#cash_money这个函数就是一个生成器generator,返回的值就叫做迭代器
atm = cash_money(400)
print(type(atm))
print(atm.__next__())
print(atm.__next__())

print('交个大保健。。。。。')
print(atm.__next__())


#生成器的作用就是实现异步


yield
import time
def eator(name):
print("[%s] 我要来吃包子了。。。" %(name))
while True:
baozi = yield
print("包子[%s]来了,[%s]要吃包子了" %(baozi,name))
def producer(ddddddd):
c1 = eator('A')
c2 = eator('B')
c1.__next__()
c2.__next__()
print('老子要来做包子了。。。。')
for i in range(5):
time.sleep(2)
print('做了两个包子。。。')
c1.send(i)
c2.send(i)
producer('Bob')d