返回顶部
首页 > 资讯 > 后端开发 > Python >Python中的迭代器与生成器使用及说明
  • 953
分享到

Python中的迭代器与生成器使用及说明

Python迭代器Python生成器迭代器与生成器使用 2022-12-16 15:12:30 953人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、迭代器(Iterator)1.1 可迭代对象(Iterable)1.2 将可迭代对象转化为迭代器1.3 构造迭代器二、生成器(Generator)2.2 使用带有 yield

一、迭代器(Iterator)

1.1 可迭代对象(Iterable)

可迭代对象,可以简单理解为可遍历对象,即能够使用 for 循环遍历的对象。python中常见的可迭代对象有:列表、元组、字符串集合、range、字典等。

迭代器和生成器都是可迭代对象。

对于Python中的任意对象,只要它定义了可以返回一个迭代器的 __iter__ 方法,或者定义了可以支持下标索引的 __getitem__ 方法,那么它就是一个可迭代对象。

对可迭代对象使用 __iter__ 方法后,会返回一个迭代器。

如何判断一个对象是否为可迭代对象呢?请看下例。

from collections.abc import Iterable

isinstance([1, 2, 3], Iterable)  # True
isinstance((1, 2, 3), Iterable)  # True
isinstance('123', Iterable)  # True
isinstance({1, 2, 3}, Iterable)  # True
isinstance(range(3), Iterable)  # True
isinstance({'key': 'value'}, Iterable)  # True
isinstance(123, Iterable)  # False

可以看出,我们只需要使用 isinstance(object, Iterable) 即可判断给定的 object 是否为可迭代对象。

严格来讲,isinstance() 只会将有 __iter__ 方法的对象判断为 Iterable。

换言之,仅用 __getitem__ 方法实现的可迭代对象会被 isinstance() 误判为不可迭代对象。

最正确的做法是直接尝试 iter(object),如果没有报错,则说明 object 是可迭代对象。

1.2 将可迭代对象转化为迭代器

我们可以将现有的可迭代对象转化为可迭代器:

s = '12345'
myiter = iter(s)
myiter
# <str_iterator at 0x25e6f40d130>

不断调用 next 方法来依次获取迭代器的元素:

next(myiter)
# '1'
next(myiter)
# '2'
next(myiter)
# '3'
next(myiter)
# '4'
next(myiter)
# '5'
next(myiter)
# StopIteration: 

可见迭代器执行到最后时会抛出一个 StopIteration 异常。

为避免这种异常,我们完全可以用更简单的 for 循环去遍历:

for e in myiter:
    print(e)
# 1
# 2
# 3
# 4
# 5

1.3 构造迭代器

构造一个迭代器只需要在自定义的类中实现两个方法:__iter__ 和 __next__ 。

  • 迭代器是一个可以记住遍历位置的对象。
  • 迭代器对象会从第一个元素开始访问,直到所有元素都被访问为止,且只能前进不能后退。

当我们构造类时,必须要有一个名为 __init__() 的函数,该函数可以在实例化时进行一些初始化。

  • __iter__() 方法的行为类似,可以执行操作(初始化等),但必须始终返回迭代器对象本身。
  • __next__() 方法还允许你进行其他操作,并且必须返回序列中的下一项。
class MyIter:
    def __iter__(self):
        self.count = 1
        return self
    
    def __next__(self):
        x = self.count
        self.count += 1
        return x

我们创建了一个返回数字的迭代器,每次序列的数值都将 +1。

myiter = iter(MyIter())
next(myiter)
# 1
next(myiter)
# 2
next(myiter)
# 3

如果我们一直调用 next() 的方法,则序列的值将会无限递增下去。即如果我们使用 for 循环去遍历上述迭代器,循环将永远进行下去…

myiter = iter(MyIter())
for e in myiter:
    print(e)
# 循环将一直进行下去...

为了防止迭代永远进行下去,我们可以在迭代次数达到一定值时抛出 StopIteration 异常。

class MyIter:
    def __iter__(self):
        self.count = 1
        return self
    
    def __next__(self):
        if self.count <= 5:
            x = self.count
            self.count += 1
            return x
        else:
            raise StopIteration

这样再执行 for 循环就不会一直进行下去了:

myiter = iter(MyIter())
for e in myiter:
    print(e)
# 1
# 2
# 3
# 4
# 5

二、生成器(Generator)

在Python中,一边迭代(循环)一边计算的机制,称为生成器。生成器能够迭代的关键是因为它有一个 __next__ 方法。

为什么要有生成器呢?我们知道,列表中的所有数据都存储在内存中,如果有海量数据的话将会非常消耗内存。很多时候,我们只需要访问列表中前面的元素,这样一来后面的元素所占用的空间就白白浪费了。

如果列表元素能够按照某种算法推算出来,那我们就可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的列表,从而节省了大量的空间(即用多少就生成多少)。

有以下两种常用方法来创建生成器:

将列表解析式中的 [] 改为 ()。在自定义的函数中使用 yield 关键字。此时这个函数就不再是一个普通函数,而是一个生成器,调用该函数就是创建了一个生成器对象。

2.1 使用 () 构造生成器

比较以下两段代码:

a = [x for x in range(3)]
type(a)
# list

 

a = (x for x in range(3))
type(a)
# generator

我们还可以比较列表解析式和生成器的耗时:

tic = time.time()
a = sum([x for x in range(10000000)])
toc = time.time()
print(toc - tic)
# 0.9081981182098389
tic = time.time()
a = sum((x for x in range(10000000)))
toc = time.time()
print(toc - tic)
# 0.6906485557556152

我们当然可以对生成器使用 next() 方法:

next(a)
# 0
next(a)
# 1
next(a)
# 2
next(a)
# StopIteration: 

但一般我们不会用 next() 来获取下一个返回值,而是直接使用 for 循环来迭代。

2.2 使用带有 yield 关键字的函数构造生成器

带有 yield 的函数不再是一个普通函数,而是一个生成器。

yield 相当于return一个值,并且记住这个返回的位置,下次迭代时,代码从 yield 的下一条语句开始执行。

我们可以通过下面的例子先来理解一下:

def num():
    print('开始执行')
    for i in range(5):
        yield i
        print('继续执行')


mygen = num()
type(mygen)
# generator

由此,我们成功创建了一个生成器对象。接下来调用 next 方法观察这个生成器是如何工作的:

next(mygen)
# 开始执行
# 0
next(mygen)
# 继续执行
# 1
next(mygen)
# 继续执行
# 2
next(mygen)
# 继续执行
# 3
next(mygen)
# 继续执行
# 4
next(mygen)
# StopIteration:

当然我们也可以使用 for 循环来遍历这个生成器:

for step in mygen:
    print(step)
# 开始执行
# 0
# 继续执行
# 1
# 继续执行
# 2
# 继续执行
# 3
# 继续执行
# 4
# 继续执行

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Python中的迭代器与生成器使用及说明

本文链接: https://lsjlt.com/news/175079.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python中的迭代器与生成器使用及说明
    目录一、迭代器(Iterator)1.1 可迭代对象(Iterable)1.2 将可迭代对象转化为迭代器1.3 构造迭代器二、生成器(Generator)2.2 使用带有 yield...
    99+
    2022-12-16
    Python迭代器 Python生成器 迭代器与生成器使用
  • Python中迭代器与生成器怎么使用
    一、迭代器(foreach)1、可迭代的对象内置有__iter__方法的都叫可迭代的对象。Python内置str、list、tuple、dict、set、file都是可迭代对象。x = 1.__iter__ # SyntaxError: ...
    99+
    2023-05-22
    Python
  • Python中迭代器与生成器的用法
    一、迭代器(foreach) 1、可迭代的对象 内置有__iter__方法的都叫可迭代的对象。 Python内置str、list、tuple、dict、set、file都是可迭代对象...
    99+
    2024-04-02
  • Python迭代器与生成器
    生成器仅仅拥有生成某种东西的能力,如果不用__next__方法是获取不到值得。创建一个生成器函数>>> def scq(): ...    print("11") # 当函数代码块中遇到yield关键字的时候,这个函数就是...
    99+
    2023-01-31
    生成器 迭代 Python
  • Python生成器与迭代器怎么用
    这篇文章给大家分享的是有关Python生成器与迭代器怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、生成器现在可以通过生成器来直接创建一个列表,但是由于内存的限制,列表的容量肯定是有限的,如果我们需要一个...
    99+
    2023-06-25
  • 迭代器与生成器
    这一部分待加强!                (一)迭代器    一:简介    迭代是Python最强大的功能之一,是访问集合元素的一种方式。    迭代器是一个可以记住遍历的位置的对象。    迭代器对象从集合的第一个元素开始访问,...
    99+
    2023-01-30
    生成器 迭代
  • 解析Python中的生成器及其与迭代器的差异
    生成器 生成器是一种迭代器,是一种特殊的函数,使用yield操作将函数构造成迭代器。普通的函数有一个入口,有一个返回值;当函数被调用时,从入口开始执行,结束时返回相应的返回值。生成器定义的函数,有多个入口和...
    99+
    2022-06-04
    生成器 差异 迭代
  • python迭代器与生成器详解
    例子 老规矩,先上一个代码: def add(s, x): return s + x def gen(): for i in range(4): yield i base = gen() ...
    99+
    2022-06-04
    生成器 详解 迭代
  • python迭代器与生成器小结
    2016.3.10关于例子解释的补充更新 源自我的博客 例子 老规矩,先上一个代码: def add(s, x): return s + x def gen(): for i in range(4): ...
    99+
    2023-01-31
    生成器 小结 迭代
  • python基础:迭代器与生成器
    一、迭代器 迭代器只能向前访问,不能后退字典,列表,元组,字符串,range都是可以迭代的对象。 1、创建迭代器 `dict={1:3,2:4,3:5,4:6}key = iter(dict)print(key)print(next(key...
    99+
    2023-01-31
    生成器 迭代 基础
  • Python生成器与迭代器详情
    目录1、生成器 2、迭代器与可迭代的生成器1、生成器 现在可以通过生成器来直接创建一个列表,但是由于内存的限制,列表的容量肯定是有限的,如果我们需要一个包含几百个元素的列表,但是每...
    99+
    2024-04-02
  • 详解Python中迭代器和生成器的原理与使用
    目录1.可迭代对象、迭代器1.1概念简介1.2可迭代对象1.3迭代器1.4区分可迭代对象和迭代器1.5可迭代对象和迭代器的关系1.6可迭代对象和迭代器的工作机制1.7自己动手创建可迭...
    99+
    2024-04-02
  • 迭代器的应用以及说明的问题
    一般使用for循环的顺序:   先创建一个迭代器:列表,并且列表内已存在数据   接着使用 for循环遍历列表   但这样存在一个问题,假如列表内的数据量很大,这样还未使用for循环便已经被列表占用很大的资源 这时我们就可以将这个迭代器做...
    99+
    2023-01-30
    迭代
  • python 生成器&迭代器
      一、生成器 1、列表生成器:列表生成式就像是一个厨师,他只会做这n(n为任意整数)道菜,想吃甚麽做甚麽,不吃不做,不浪费空间;而列表表达式就相当于已经做好的n盘菜,占用空间。2、生成器的创建方法: s = (x*2 for x in...
    99+
    2023-01-30
    生成器 迭代 python
  • python中的迭代器,生成器与装饰器怎么用
    这篇文章主要讲解了“python中的迭代器,生成器与装饰器怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python中的迭代器,生成器与装饰器怎么用”吧!迭代器每一个可迭代类内部都要实...
    99+
    2023-06-29
  • JavaScript迭代器与生成器使用详解
    目录迭代器 (Iterator)Iterator工作原理自定义遍历数据生成器 (Generator)生成器参数传递使用生成器实现回调地狱功能生成器函数实例生成器—thro...
    99+
    2022-11-13
    JavaScript迭代器与生成器 JavaScript生成器 JavaScript迭代器
  • Python3 迭代器与生成器
    Edit笔记内容:Python3 迭代器与生成器 笔记日期:2017-10-28迭代器迭代是Python最强大的功能之一,是访问集合元素的一种方式。 迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元...
    99+
    2023-01-31
    生成器 迭代
  • python基础之迭代器与生成器
    目录1. 迭代器1.1 迭代器的使用1.2 创建类的迭代器2. 生成器2.1 生成器的使用2.2 生成器表达式总结 1. 迭代器 1.1 迭代器的使用 迭代器对象从集合的第一个元素开...
    99+
    2024-04-02
  • JavaScript中的迭代器和可迭代对象与生成器
    目录1. 什么是迭代器?1.1 迭代器的基本实现1.2 迭代器的封装实现2. 什么是可迭代对象2.1 原生可迭代对象(JS内置)2.1.1 部分for of 演示2.1.2 查看内置...
    99+
    2024-04-02
  • Python 中迭代器与生成器实例详解
    Python 中迭代器与生成器实例详解 本文通过针对不同应用场景及其解决方案的方式,总结了Python中迭代器与生成器的一些相关知识,具体如下: 1.手动遍历迭代器 应用场景:想遍历一个可迭代对象中的所...
    99+
    2022-06-04
    生成器 详解 实例
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作