郑文峰的博客 郑文峰的博客
首页
  • python之路
  • go之路
  • 其他
  • redis
  • mysql
  • docker
  • k8s
读书破万卷
周刊
关于
  • 导航 (opens new window)
  • 代码片段 (opens new window)
  • 收藏
  • 友链
  • 外部页面

    • 开往 (opens new window)
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)

zhengwenfeng

穷则变,变则通,通则久
首页
  • python之路
  • go之路
  • 其他
  • redis
  • mysql
  • docker
  • k8s
读书破万卷
周刊
关于
  • 导航 (opens new window)
  • 代码片段 (opens new window)
  • 收藏
  • 友链
  • 外部页面

    • 开往 (opens new window)
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)
  • python

    • 基础

      • python迭代器与生成器
        • 迭代器和可迭代对象
        • 如何实现迭代器?
        • 生成器和生成器函数
          • 生成器函数创建生成器
          • 生成器表达式创建生成器
      • python元编程
      • python垃圾回收机制
      • python上下文管理器
      • python装饰器的使用方法
      • 使用python实现单例模式的三种方式
      • python中import原理
    • 第三方库

    • django

    • flask

    • tornado

    • 其他

  • go

  • 其他

  • 编程
  • python
  • 基础
zhengwenfeng
2022-08-10
目录

python迭代器与生成器

# 迭代器和可迭代对象

实现了__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

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

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

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

[i for i in range(10)]
1

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

(i for i in range(10))
1

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

例子:

class A:
    def __iter__(self):
        return (x*3 for x in range(10))
1
2
3
#python
上次更新: 2023/01/15, 15:47:48
python元编程

python元编程→

最近更新
01
django rest_framework 分页
03-20
02
学习周刊-第03期-第09周
03-03
03
学习周刊-第02期-第08周
02-24
更多文章>
Theme by Vdoing | Copyright © 2022-2023 zhengwenfeng | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式