迭代器与生成器yield
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迭代器与生成器yield相关的知识,希望对你有一定的参考价值。
迭代器
迭代器是一个可以记住遍历的位置的对象,迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
方法:iter() ,next()。
载体:字符串,列表或元组对象都可用于创建迭代器:
示例:for循环取出列表和字符串中的元素
list=[1,2,3] it_list = iter(list) for it in it_list: print it str = "abc" it_str = iter(str) for it in it_str: print it
生成器
使用了yield 的函数被称为生成器(generator),生成器是一个返回迭代器的函数,只能用于迭代操作。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回yield的值。它最大的特点在于并非一次性全部生成,而在于每次调用都生成当前一轮循环,再次调用则再次生成,直到循环结束或是本次生成数据已到终点(例如文件读取完毕或是判断条件变成false)。
使用yield的函数并不会一次执行完毕,仅仅返回一个迭代对象,当读取该迭代对象时,它并没有完全读取迭代内容,而是根据代码需求每次读取一部分,从而节约了资源。
函数执行结束时,生成器自动抛出StopIteration异常,表示迭代完成,在for循环里,无需处理 StopIteration 异常,循环会正常结束。
在一个生成器函数中,如果没有return,则默认执行至函数完毕,如果在执行过程中return,则直接抛出 StopIteration 终止迭代。
可以利用 isgeneratorfunction 判断一个函数是否是一个特殊的 generator 函数isgeneratorfunction(readfile)
while True必须有,否则迭代器无法驻留,轮询一行就会结束;
示例:yield字段将readfile函数变成一个文件迭代器,每次的输出都是文件中的一行内容,for循环调用该函数时,每次执行到yield data语句时,该函数就会将当前数据保留并传递给item,接着再次下一个循环。
def readfile(): seek = 0 while True: with open(‘test_server.py‘,‘r‘) as f: f.seek(seek) data = f.readline() if data: seek = f.tell() yield data else: return for item in readfile(): print item
以上是关于迭代器与生成器yield的主要内容,如果未能解决你的问题,请参考以下文章