18 迭代器和生成器的使用[python基础]

迭代器的介绍

1. 

迭代(iterate)意味着重复多次,就像循环那样(list, tuple)
2.
实现了方法iter的对象是可迭代的,而实现了方法next的对象是迭代器
3.
调用方法next时(或next()),迭代器返回其下一个值
4.
如果迭代器没有可供返回的值,触发StopIteration异常

如何从迭代器创建序列

//通过可迭代对象调用内置函数iter,可获得一个迭代器
l = [1,2,3,4,5] //列表l,是一个可迭代对象
ll = iter(l) //获得迭代器
ll.next()或者next(ll) //用next()可以顺序取值

//做一个迭代器
class PowNumber(object):
    //迭代器  1,2,3,4,5,6..的平方

    value = 0

def __next__(self):
    self.value += 1
    if self.value > 10:         //要加入一个跳出口,不然会无限迭代
        raise StopIteration
    return self.value * self.value
def __iter__(self):            //迭代器必须包含__next__和__iter__
    return self

if __name__ = '__main__':
    pow = PowNumber()
    //手动迭代
    print(next(pow))  //1
    print(next(pow))  //4
    print(next(pow))  //9
    print(next(pow))  //16

    //循环迭代器
    for i in pow:
        print(i)

生成器的介绍

1. 

生成器是一种使用跟普通函数语法定义的迭代器
2.
包含yield语句的函数都被成为生成器
3.
不适用return返回一个值,而是可以生成多个值,每次一个
4.
每次使用yield生成一个值后,函数都将冻结,即在此停止执行
5.
被重新唤醒后,函数将从停止的地方开始继续执行

// code实现
def pow():
    yield 1
    yield 2
    yield 3
    yield 4

def pow_number():
    return (x * x for x in [1,2,3,4,5])   //列表推导式,用(  )会得到一个generator生成器,用[ ]会得到一个列表
    //return [x * x for x in [1,2,3,4,5]] 

def pow_number2():
    for x in [1,2,3,4,5]:
        yield x * x

if __name__ == '__main__':
    rest = pow_number2()  //得到一个generator对象
    print(next(rest))    //

//生成器是一种特殊的迭代器,也有三种方式可以拿到里面的值
//1,  l.__next__()
//2,  next(l)
//3,  for循环

用迭代器和生成器模拟range()函数

def use_range():
//python内置的range函数
for i in range(5, 10):
print(i)

class IterRange(object):
//用迭代器模拟range
def init(self, start, end):
self.start = start - 1
self.end = end

def __next__(self):
    self.start += 1
    if self.start >= self.end:
        raise StopIteration
    return self.start

def __iter__(self):         //迭代器最少要包括 __next__  __iter__两个方法
    return self

class GenRange(object):
//用生成器模拟range
def init(self, start, end):
self.start = start - 1
self.end = end

def get_num(self):
    while True:
        if self.start >= self.end - 1:
            break
        se;f.start += 1
        yield self.start

//用写成函数面向过程的方式模拟range
def get_num(start, end):
start -= 1
while True:
if start > = end -1:
break
start += 1
yield start

if name = 'main':
use_range()
print('--------------')
iter = IterRange(5, 10)
print(next(iter))
print(list(iter)) //迭代器模拟range

gen = GenRange(5, 10)    
print(next(gen))
print(list(gen))  //生成器模拟range

gen_f = get_num(5, 10)
print(gen_f)   
print(list(gen_f))
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容