迭代器和生成器
Posted 鱼丸粗面没鱼丸
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器和生成器相关的知识,希望对你有一定的参考价值。
一迭代器
1.1)什么是可迭代?
凡是可以使用for循环取值的都是可迭代的
列表 字典 元祖 字符串 集合 range 文件句柄 enumerate 这些都是可迭代的
for i in (1,2,3,4):
print(i)
1.2)可迭代协议
可迭代协议:内部含有_iter_方法都是可迭代的
迭代器协议:内部含有_next_方法都是迭代器
迭代器的优势
节省内存
#快
# 取一个值就进行接下来计算,二不需要等到所有的值都计算出来才开始接下来的运算-快
from collections import Iterable,Iterator
print(range(1,10000))
print(isinstance(range(10000),Iterable))
print(isinstance(range(10000),Iterator))
迭代器的特性:惰性运算
二、生成器
一个包含yield关键字的函数就是一个生成器函数。
yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。
每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束。
生成器的例子
假如我想让工厂给学生做校服,生产2000000件衣服,我和工厂一说,工厂应该是先答应下来,然后再去生产,我可以一件一件的要,也可以根据学生一批一批的找工厂拿。
而不能是一说要生产2000000件衣服,工厂就先去做生产2000000件衣服,等回来做好了,学生都毕业了。。。
def cloth(num): for i in range(num): yield ("生产第%s件衣服" %i)#记录当前所在的位置,等待下一次next来触发函数的状态 # print("生产第%s件衣服" %i) # g=cloth(5) for i in g: print(i)
g=cloth(5)
for i in g:
print(i)
# print(next(g))
# print(next(g))
生成器函数的调用不会触发代码的执行,而是会返回一个生成器(迭代器0
想要生成器函数执行要用next
生成器的应用
#使用生成器来监听文件
import time
def listener_files():
with open(‘access.log‘,mode=‘r‘,encoding=‘utf-8‘) as f:
while True:
line=f.readline()
if line.strip():
yield line.strip()
else:
time.sleep(1)
g=listener_files()
for line in g:
print(line)
2.计算移动工资
def agv_monery(): sum_monery=0 day=0 argv_moeny=0 while True: monery=yield argv_moeny day += 1 sum_monery +=monery argv_moeny=sum_monery/day g=agv_monery() print(next(g)) print(g.send(300)) print(g.send(500))
三、列表表达式
以上是关于迭代器和生成器的主要内容,如果未能解决你的问题,请参考以下文章