python基础-第六篇-6.1生成器与迭代器
迭代器
特点:
-
访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
-
不能随机访问集合中的某个值 ,只能从头到尾依次访问
-
访问到一半时不能往回退
-
便于循环比较大的数据集合,节省内存
names = iter(['alex','wupeiqi','eva']) print(names) print(names.__next__()) print(names.__next__()) print(names.__next__()) #在往下取就报错 # print(names.__next__())
生成器
一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器
#ATM def cash_money(amount): while amount > 0: amount -= 100 yield 100 print('又来取钱啦!') #这里没有真正执行函数,只是把函数变成一个迭代器 atm = cash_money(500) # print(atm) print(atm.__next__()) print(atm.__next__()) print('叫个大保健') print(atm.__next__())
yield单线程异步并发
#消费者生产者模型 import time def consumer(name1): print('{name}准备吃包子啦!'.format(name = name1)) while True: baozi = yield print('第{baozi_num}个包子来了,被{name}吃了!'.format(baozi_num=baozi,name=name1)) def producer(name2): c = consumer('a') c2 = consumer('b') c.__next__() c2.__next__() print('{name}开始准备做包子啦!'.format(name=name2)) for i in range(1,6): time.sleep(1) print('做了两个包子!') c.send(i) c2.send(i) producer('alex')
生成器表达式
列表解析和生成器表达式非常的相似,不过有一点明显的区别:列表解析是用中括号括起来,而生成器表达式则是小括号
#列表解析 li = [i+100 for i in range(10)] print(li) #加条件 li2 = [i+100 for i in range(10) if i % 2 == 0] print(li2)
由于列表解析非常占内存,所以不适用大数据的场景
#生成器表达式 li = (i+100 for i in range(10)) print(li) #<generator object <genexpr> at 0x0000000000A2AE08> #加条件 li2 = (i+100 for i in range(10) if i % 2 == 0) for x in li2: print(x)
欢迎大家对我的博客内容提出质疑和提问!谢谢
笔者:拍省先生