温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

迭代器与生成器yield

发布时间:2020-07-10 02:17:46 来源:网络 阅读:496 作者:silihedayuan 栏目:开发技术


迭代器

迭代器是一个可以记住遍历的位置的对象,迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

方法: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


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI