迭代器与生成器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的主要内容,如果未能解决你的问题,请参考以下文章

Python3 迭代器与生成器

基础学习之第十三天(迭代器与生成器)

迭代器与生成器

迭代器与生成器

初学者python笔记(迭代器生成器三元表达式列表解析send()与yield())

Python: 迭代器与生成器小结