惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
G
Google Developers Blog
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
云风的 BLOG
云风的 BLOG
小众软件
小众软件
月光博客
月光博客
Recent Announcements
Recent Announcements
人人都是产品经理
人人都是产品经理
P
Proofpoint News Feed
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
雷峰网
雷峰网
The Cloudflare Blog
博客园_首页
美团技术团队
大猫的无限游戏
大猫的无限游戏
B
Blog
IT之家
IT之家
Jina AI
Jina AI
H
Hackread – Cybersecurity News, Data Breaches, AI and More
C
Check Point Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

郑文峰的博客

使用dify对接飞书多维表格 使用n8n对接飞书多维表格 服务启动时出现 OOM 一次服务升级时pg表DDL执行超时失败 Go语言高效IO缓冲技术详解 Go语言延迟初始化(Lazy Initialization)最佳实践 Go语言字符串拼接性能对比与优化指南 Go语言结构体内存对齐完全指南 Go语言空结构体:零内存消耗的高效编程 Go语言堆栈分配与逃逸分析深度解析 Go语言原子操作完全指南 Go语言内存预分配完全指南 Go语言不可变数据共享:无锁并发编程实践 Go语言零拷贝技术完全指南 Go语言遍历性能深度解析:从原理到优化实践 Go语言Interface Boxing原理与性能优化指南 Go协程池深度解析:原理、实现与最佳实践 使用etcd分布式锁导致的协程泄露与死锁问题 基于pre-commit的Python代码规范落地实践 初识 MCP Server pulsar阻塞导致logstash无法接入日志 django-prometheus使用及源码分析 kube-proxy源码分析 kubernetes service如何通过iptables转发 tcp缓存引起的日志丢失 django-apschedule定时任务异常停止 理解calico容器网络通信方案原理 理解flannel的三种容器网络方案原理 理解Linux IPIP隧道 理解VXLAN网络
python迭代器与生成器
zhengwenfeng · 2022-08-10 · via 郑文峰的博客

# 迭代器和可迭代对象

实现了__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)   # 返回一个迭代器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 生成器和生成器函数

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

# 生成器函数创建生成器

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

在这里插入图片描述

例子:


import re
import reprlib

RE_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()

1
2
3
4
5
6
7
8
9
10
11
12
13

# 生成器表达式创建生成器

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

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

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

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

例子:

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

1
2
3