Python生成器generator原理及用法解析

 更新时间:2020年07月20日 10:16:31   作者:吃着东西不想停  
这篇文章主要介绍了Python生成器generator原理及用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

前言

生成器generator

生成器的本质是一个迭代器(iterator)

要理解生成器,就要在理解一下迭代,可迭代对象,迭代器,这三个概念

Python生成器generator简介

iteration, iterable, iterator

迭代(iteration):在python中迭代通常是通过for...in...来实现的.而且只要是可迭代对象iterable,都能进行迭代.

可迭代对象(iterable):Python中的任意的对象,只要它定义了可以返回一个迭代器的 __iter__方法,或者定义了可以支持下标索引的__getitem __方法,那么它就是一个可迭代对象。简单说,可迭代对象就是能提供迭代器的任意对象.返回的是一个iterator 对象.官方解释

迭代器(iterator ) : 简单的说,迭代器就是实现了iterator.__iter__() 和iterator.__next__() 的对象,iterator.__iter__()方法返回的是iterator对象本身.根据官方的说法,正是这个方法,实现了for ... in ...语句.而iterator.__next__()是iterator区别于iterable的关键了,它允许我们显式地获取一个元素.当调用next()方法时,实际上产生了2个操作:

更新iterator状态,令其指向后一项,以便下一次调用,每一个值过后,指针移动到下一位,对iterator遍历完后,其变成了一个空的容器,但不是None ,需要注意的是,迭代结束后,指针不会自动返回到首位,而是依旧停留在末位置,想要在开始,需要重新载入迭代对象.

实例理解:

 >>> from collections import Iterable, Iterator
 >>> a = [1,2,3]  # 众所周知,list是一个iterable
 >>> b = iter(a)  # 通过iter()方法,得到iterator,iter()实际上调用了__iter__(),
 >>> isinstance(a, Iterable)
 True
 >>> isinstance(a, Iterator)
 False
 >>> isinstance(b, Iterable)
 True
 >>> isinstance(b, Iterator)
 True

可见,itertor 一定是iterable ,但iterable不一定是itertor

 >>> dir(a)
 ['__add__','__class__','__contains__','__delattr__','__delitem__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__getitem__','__gt__','__hash__','__iadd__','__imul__','__init__','__iter__','__le__','__len__','__lt__','__mul__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__', '__reversed__','__rmul__', '__setattr__','__setitem__','__sizeof__','__str__', '__subclasshook__','append','clear' 'copy','count','extend','index','insert', 'pop','remove', 'reverse','sort']
 
 >>>dir(b)
 ['__class__','__delattr__', '__dir__', '__doc__','__eq__', '__format__','__ge__' ,'__getattribute__', '__gt__','__hash__','__init__','__iter__','__le__','__length_hint__',
 '__lt__','__ne__','__new__','__next__','__reduce__','__reduce_ex__','__repr__','__setattr__', '__setstate__','__sizeof__','__str__','__subclasshook__']

可以看到迭代器具有__next__ 这个方法,可迭代对象具有__getitem__

迭代器是消耗型的,随着指针的移动,遍历完毕以后,就为空,但是不是None

 >>> c = list(b)
 >>> c
 [1, 2, 3]
 >>> d = list(b)
 >>> d
 []
 
 
 # 空的iterator并不等于None.
 >>> if b:
 ...  print(1)
 ...
 1
 >>> if b == None:
 ...  print(1)
 ...

使用迭代器的内置方法 __next__ 和 next() 方法,遍历元素

 In [73]: e = iter(a)
 
 In [74]: next(e)
 Out[74]: 1
 
 In [75]: e.__next__
 Out[75]: <method-wrapper '__next__' of list_iterator object at 0x7f05571c8518>
 
 In [76]: e.__next__()
 Out[76]: 2
 
 In [77]: e.__next__()
 Out[77]: 3
 
 In [78]: e.__next__()
 ---------------------------------------------------------------------------
 StopIteration               Traceback (most recent call last)
 <ipython-input-78-6024b5bd9bd2> in <module>()
 ----> 1 e.__next__()
 StopIteration:

当遍历完毕时,会返回一个StopIteration 的错误.

for...in.... 遍历迭代

当我们对一个iterable 使用for ....in... 进行遍历时,实际上是想调用iter() 方法得到一个iterator ,假设为x ,然后循环的调用x 的__next__() (next())方法,取得每一次的值,直到iterator为空,返回StopIteration 作为循环的结束的标准.for....in...会自动处理 StopIteration 异常,从而避免了抛出异常,从而使程序中断.流程图为:

x = [1, 2, 3]
for i in x:
print(x)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 使用 Python 实现文件递归遍历的三种方式

    使用 Python 实现文件递归遍历的三种方式

    这篇文章主要介绍了使用 Python 实现文件递归遍历的三种方式,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-07-07
  • 基于python对B站收藏夹按照视频发布时间进行排序的问题

    基于python对B站收藏夹按照视频发布时间进行排序的问题

    这篇文章主要介绍了基于python对B站收藏夹按照视频发布时间进行排序,在实现过程中中间程序可能因为各种原因挂掉,因此在中间加入了储存中间状态的功能,否则每次挂掉都要重新爬速度非常慢,本文给大家介绍具体使用方法,一起看看吧
    2021-05-05
  • Python中创建相关系数矩阵的方法小结

    Python中创建相关系数矩阵的方法小结

    相关系数矩阵是一种用于衡量变量之间关系的重要工具,本文将介绍在 Python 中创建相关系数矩阵的不同方法,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • 如何实现Python调用Golang代码详解

    如何实现Python调用Golang代码详解

    这篇文章主要介绍了如何实现Python调用Golang代码,Python和Golang都是当下非常流行的编程语言,在实际开发中,我们可能会遇到需要将Python和Golang进行组合使用的场景,感兴趣想要详细了解可以参考下文
    2023-05-05
  • 浅谈怎么给Python添加类型标注

    浅谈怎么给Python添加类型标注

    今天给大家带来的文章是Python的相关知识,文章围绕着怎么给Python添加类型标注展开,文中有非常详细的介绍,需要的朋友可以参考下
    2021-06-06
  • python机器学习之神经网络实现

    python机器学习之神经网络实现

    这篇文章主要为大家详细介绍了python机器学习之神经网络的实现方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • python中flatten()函数用法详解

    python中flatten()函数用法详解

    本文主要介绍了python中flatten()函数用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • python练习之循环控制语句 break 与 continue

    python练习之循环控制语句 break 与 continue

    这篇文章主要介绍了python循环控制语句 break 与 continue,break就像是终止按键,不管执行到哪一步,只要遇到break,不管什么后续步骤,直接跳出当前循环
    2022-06-06
  • pycharm设置默认的UTF-8编码模式的方法详解

    pycharm设置默认的UTF-8编码模式的方法详解

    这篇文章主要介绍了pycharm设置默认的UTF-8编码模式,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • 利用Python实现斐波那契数列的方法实例

    利用Python实现斐波那契数列的方法实例

    这篇文章主要给大家介绍了关于如何利用Python实现斐波那契数列的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07

最新评论