首页 > 代码库 > Python全栈之路8--迭代器(iter)和生成器(yield)

Python全栈之路8--迭代器(iter)和生成器(yield)

一、生成器( iter )

从Python2.2起,生成器提供了一种简洁的方式帮助返回列表元素的函数来完成简单和有效的代码。

它基于yield指令,允许停止函数并立即返回结果。
此函数保存其执行上下文,如果需要,可立即继续执行。

1、对比 range 和 xrange 的区别

>>> print range(10)[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]>>> print xrange(10)xrange(10)

  如上代码所示,range会在内存中创建所有指定的数字而xrange不会立即创建,只有在迭代循环时,才去创建每个数组。

技术分享
def nrange(num):    temp = -1    while True:        temp = temp + 1        if temp >= num:            return        else:            yield temp
自定义迭代数字生成器
技术分享
#!/usr/bin/env python# _*_ coding:utf-8 _*_def xrange():    print(11)    yield 1    print(22)    yield 2    print(33)    yield 3# 仅仅获取到了一个生成器 #含有yield的函数叫做生成器函数r = xrange() #这是一个生成器#生成器的__next__方法ret  = r.__next__()print(ret)ret  = r.__next__()print(ret)ret  = r.__next__()print(ret)
课上实验代买 生成器
技术分享
#!/usr/bin/env python# _*_ coding:utf-8 _*_def n2(start,stop):    start = start    while stop:        yield start        start +=1def xrange2(start,stop):    obj = n2(start,stop)    for i in range(start,stop):        j = obj.__next__()        print(j)def n1(stop):    start = 0    while stop:        yield start        start +=1def xrange1(stop):    obj = n1(stop)    for i in range(stop):        j = obj.__next__()        print(j)def xrange(*args):    if len(args) == 1:        xrange1(*args)    elif len(args) == 2:        xrange2(*args)    else:        print("参数不对 1 or 2")if __name__ == "__main__":    xrange(2,11)
课上练习

2、文件操作的 read 和 xreadlinex 的的区别

read会读取所有内容到内存xreadlines则只有在循环迭代时才获取
技术分享
def NReadlines():    with open(log,r) as f:        while True:            line = f.next()            if line:                yield line            else:                returnfor i in NReadlines():    print i
基于next自定义生成器NReadlines
技术分享
def NReadlines():    with open(log,r) as f:        seek = 0        while True:            f.seek(seek)            data = f.readline()            if data:                seek = f.tell()                yield data            else:                returnfor item in NReadlines():    print item
基于seek和tell自定义生成器NReadlines

二、迭代器  iterators

迭代器仅是一容器对象,它实现了迭代器协议。它有两个基本方法:
1)next方法
返回容器的下一个元素
2)__iter__方法
返回迭代器自身

迭代器可使用内建的iter方法创建,见例子:

>>> i = iter(‘abc‘)>>> i.next()‘a‘>>> i.next()‘b‘>>> i.next()‘c‘>>> i.next()Traceback (most recent call last):  File "<string>", line 1, in <string>StopIteration: 

  

 

Python全栈之路8--迭代器(iter)和生成器(yield)