博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 迭代器和生成器
阅读量:3705 次
发布时间:2019-05-21

本文共 1314 字,大约阅读时间需要 4 分钟。

迭代器与生成器

迭代器和可迭代对象

实现了__iter__的对象是可迭代对象.

实现了__iter____next__的是迭代器.

两者之间的关系: Python从可迭代的对象中获取迭代器

可迭代对象的抽象基类是abc.Iterable

迭代器的抽象基类是abc.Iterator

在这里插入图片描述

如何实现迭代器?

定义__iter__方法返回带有__next__方法的对象,__iter__可以简单的返回self.

当没有数据返回时,会抛出StopIteration异常停止返回数据。

class MyIter():    def __init__(self, data):        self.data = data        self.index = len(data)    def __iter__(self):        return self    def __next__(self):        if self.index == 0:            raise StopIteration                self.index = self.index - 1        return self.data[self.index]my_iter = MyIter()iter(my_iter)   # 返回一个迭代器

生成器和生成器函数

函数中有yield关键字的,就是生成器函数

生成器函数创建生成器

下面的__iter__是一个生成器函数,通过该生成器函数创建生成器对象,包装生成器函数的定义。把生成器传给next(...)函数时,生成器函数会向前,执行函数定义体中的下一个yield语句,返回产出的值,并在函数定义体的当前位置暂停。当无数据返回时,生成器对象会抛出StopIteration异常。

在这里插入图片描述

例子:

import reimport reprlibRE_WORD = re.compile("\w+")class Sentence:    def __init__(self, text):        self.text = text            def __iter__(self):        for match in RE_WORD.finditer(self.text):            yield matc.group()
生成器表达式创建生成器

生成器表达式可以理解为列表推导的惰性版本: 不会迫切地构建列表,而是返回一个生成器,按需惰性生成元素。

列表表达式。 会马上加载所有的元素到内存中

[i for i in range(10)]

生成器表达式: 会得到一个生成器对象,可以通过next或者循环的方式惰性求值。

(i for i in range(10))

虽然下面的__iter__没有yield关键字,但是却有具有生成器表达式,所以__iter__得到的也是一个生成器对象

例子:

class A:    def __iter__(self):        return (x*3 for x in range(10))

转载地址:http://kakjn.baihongyu.com/

你可能感兴趣的文章
零基础Java学习笔记(五)
查看>>
零基础Java学习笔记(六)
查看>>
分组密码(二)分组密码的运行模式
查看>>
古典密码特点(换位密码、替代密码)
查看>>
古典密码分析(冗余度,唯一解距离,语言统计,重合指数)
查看>>
现代密码学的公钥密码体制
查看>>
OS Review Chapter 4: Process
查看>>
OS Review Chapter 5: Thread
查看>>
OS Review Chapter 6: CPU Scheduling
查看>>
Docker镜像文件存放
查看>>
搭建区块链--部署Hyperledger Fabric:incomplete package
查看>>
Linux搭建Hyperledger Fabric整体思路
查看>>
OS Review Chapter 7: Process Synchronization
查看>>
信号量解决经典进程同步问题:生产者消费者模型,读者写者问题以及哲学家问题
查看>>
证明:DES解密算法是DES加密算法的逆
查看>>
OS Review Chapter 8: Deadlocks
查看>>
OS Review Chapter 9: Memory Management
查看>>
fabric-go-sdk 学习
查看>>
OS Review Chapter 10: Virtual Memory
查看>>
OS Review Chapter 11:File System Interface
查看>>