迭代器与生成器yield-创新互联

迭代器

成都网站设计、做网站,成都做网站公司-创新互联建站已向1000多家企业提供了,网站设计,网站制作,网络营销等服务!设计与技术结合,多年网站推广经验,合理的价格为您打造企业品质网站。

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

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

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


文章题目:迭代器与生成器yield-创新互联
本文链接:http://ybzwz.com/article/djschd.html