Python中的迭代器和生成器详解

 更新时间:2023年07月26日 10:06:22   作者:Looooking  
这篇文章主要介绍了Python中的迭代器和生成器详解,生成器表达式是用来生成函数调用时序列参数的一种迭代器写法,生成器对象可以遍历或转化为列表或元组等数据结构,但不能切片,需要的朋友可以参考下

可迭代对象(Iterable)

任何实现了 __iter__ 方法的对象都可以称为可迭代对象。

class Fib:
    def __init__(self, n):
        self.prev = 0
        self.cur = 1
        self.n = n
    def __iter__(self):
        return self
fib = Fib(5)
import collections
print('fib is Iterable? ', isinstance(fib, collections.Iterable))
print('fib is Iterator? ', isinstance(fib, collections.Iterator))
print(next(fib))
fib is Iterable?  True
fib is Iterator?  False
Traceback (most recent call last):
  File "D:/MyProject/Python/insight-tools-rest/test.py", line 27, in <module>
    print(next(fib))
TypeError: 'Fib' object is not an iterator

迭代器(Iterator)

迭代器是用于进行迭代操作的对象,它可以像列表一样使用 for 迭代获取其中的每一个元素。当然,列表、字典属于可迭代对象,但并不是迭代器。

要将列表、字典等常见的可迭代对象变成迭代器,需要使用 iter 或者 __iter__() 进行作用:

l = [1, 2, 3]
d = {'a': 1, 'b': 2, 'c': 3}
print(type(l))
print(type(d))
l = l.__iter__()
d = iter(d)
print(type(l))
print(type(d))
<class 'list'>
<class 'dict'>
<class 'list_iterator'>
<class 'dict_keyiterator'>

迭代器与列表的区别在于,列表是一次性把所有的元素加载到内存,迭代器则是使用延迟计算的方式返回元素,只有在调用 next 方法的时候才去计算并返回该元素,也即 call by need 的方式,for 循环本质上也是不断调用迭代器的 next 方法来进行遍历。

如果要将一个可迭代对象变成迭代器的话,还需要实现一个 __next__ 方法:

class Fib:
    def __init__(self, n):
        self.prev = 0
        self.cur = 1
        self.n = n
    def __iter__(self):
        return self
    def __next__(self):
        if self.n > 0:
            value = self.cur
            self.cur += self.prev
            self.prev = value
            self.n -= 1
            return value
        else:
            raise StopIteration()
fib = Fib(5)
import collections
print('fib is Iterable? ', isinstance(fib, collections.Iterable))
print('fib is Iterator? ', isinstance(fib, collections.Iterator))
print([i for i in fib])

fib is Iterable?  True
fib is Iterator?  True
[1, 1, 2, 3, 5]

生成器(Generator)

普通函数一般使用 return 返回一个值,但在 Python 中还有一种函数,用关键字 yield 来返回值,这种函数叫生成器。函数被调用时会返回一个生成器对象,生成器本质上还是一个迭代器(特殊的迭代器,实现方式不一样),因此在迭代操作中,生成器对象的行为和迭代器非常相似。下面是使用生成器实现的斐波那契数列:

def fib(n):
    prev = 0
    cur = 1
    while n > 0:
        yield cur
        n -= 1
        prev, cur = cur, cur + prev
        # tmp = prev
        # prev = cur
        # cur = cur + tmp
print([i for i in fib(5)])

[1, 1, 2, 3, 5]

当然也可以使用 next 不断去遍历:

fib = fib(5)
print(next(fib))
print(next(fib))
print(next(fib))
print(next(fib))
print(next(fib))

1
1
2
3
5

到此这篇关于Python中的迭代器和生成器详解的文章就介绍到这了,更多相关迭代器和生成器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python对XML文件实现增删改查操作

    Python对XML文件实现增删改查操作

    这篇文章主要为大家详细介绍了Python对XML文件进行实现增删改查操作的方法,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的可以了解一下
    2022-11-11
  • 关于pip install uwsgi安装失败问题的解决方案

    关于pip install uwsgi安装失败问题的解决方案

    这篇文章主要介绍了关于pip install uwsgi安装失败问题的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Conda命令教程小结

    Conda命令教程小结

    Conda 是一个开源的包管理器和环境管理器,主要用于安装和管理 Python 包及依赖项,本文就来介绍一下Conda命令,具有一定的参考价值,感兴趣的可以了解一下
    2025-01-01
  • 完美解决python针对hdfs上传和下载的问题

    完美解决python针对hdfs上传和下载的问题

    这篇文章主要介绍了完美解决python针对hdfs上传和下载的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python自动化实现将PDF文档高效转换为HTML文件

    Python自动化实现将PDF文档高效转换为HTML文件

    PDF作为一种广泛使用的文档格式,以其版面固定、跨平台兼容的特性,在商务和学术领域占据主导地位,本文将深入探讨如何利用Python,高效精准地将PDF文档转换为HTML文件,感兴趣的可以了解下
    2025-10-10
  • Python小游戏实现实例之接苹果

    Python小游戏实现实例之接苹果

    其实利用Python编写的小游戏很简单,下面这篇文章主要给大家介绍了关于Python小游戏实现实例之接苹果的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • Pytest测试报告工具Allure的高级用法

    Pytest测试报告工具Allure的高级用法

    这篇文章介绍了Pytest测试报告工具Allure的高级用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • python 已知三条边求三角形的角度案例

    python 已知三条边求三角形的角度案例

    这篇文章主要介绍了python 已知三条边求三角形的角度案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python3.10新特性之match语句示例详解

    Python3.10新特性之match语句示例详解

    这篇文章主要为大家介绍了Python3.10新特性之match语句示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Python获取当前路径实现代码

    Python获取当前路径实现代码

    这篇文章主要介绍了 Python获取当前路径实现代码的相关资料,需要的朋友可以参考下
    2017-05-05

最新评论