广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python迭代器资料整理
  • 226
分享到

python迭代器资料整理

迭代资料python 2023-01-31 08:01:21 226人浏览 薄情痞子

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

摘要

相关概念定义 迭代器(Iterator): 满足迭代协议的对象就是迭代器 iterator就是实现了Iteration Protocol的对象,这类对象都支持循环遍历的操作(for/while/支持迭代的函数list() sum().

相关概念定义

迭代器(Iterator):

满足迭代协议的对象就是迭代器
iterator就是实现了Iteration Protocol的对象,这类对象都支持循环遍历的操作(for/while/支持迭代的函数list() sum()...)。

迭代协议(Iteration Protocol):

内建函数iter()接收一个可迭代对象,并返回一个可迭代对象.
每次将这个可迭代对象传递给next()函数,都会返回它所包含的下一个元素,当迭代完最后一个元素时,就会触发StopIteration异常。

>>> x = iter([1, 2, 3])
>>> x
<listiterator object at 0x1004ca850>
>>> next(x)
1
>>> next(x)
2
>>> next(x)
3
>>> next(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

满足以上要求的对象,就是迭代器。

迭代隐含的操作

在每次的迭代语句中,python都会按照迭代协议去对迭代器进行迭代。其实,在实际执行中,Python会进行一些其他的操作:

  1. 将需要迭代的对象作为参数传递给iter函数

  2. iter返回一个迭代器对象

  3. 每次循环则将返回的迭代器对象传递给next函数

  4. 循环至最后一个元素,触发StopIteration

for语句为例
当我们在Python中执行循环语句for i in foo的时候,其背后的操作是:

  1. foo = iter(foo)

  2. next(foo)

next(foo)在python3中执行的是:foo.__next__(),在python2中则是:foo.next()

迭代器的实现

迭代器是用class来实现的。其中必需实现的有两个方法:__iter__next(python2)/__next__(python3)。其中,__iter__必需返回一个迭代器对象,next则负责迭代逻辑并在迭代完毕时触发异常。

如下:

def Iter(object)
    def __init__(self):
        pass
    def __iter__(self):
        pass
    def __next__(self):    # python3
        pass
    def next(self):        # python2
        pass

迭代器的__iter__返回self

迭代器的__iter__方法需要返回的是一个具有next方法的可迭代对象。如果当__iter__返回的是self的话,就会产生其他意想不到的效果。

class yrange:
    def __init__(self, n):
        self.i = 0
        self.n = n

    def __iter__(self):
        return self

    def next(self):
        if self.i < self.n:
            i = self.i
            self.i += 1
            return i
        else:
            raise StopIteration()
            
class zrange:
    def __init__(self, n):
        self.i = 0
        self.n = n

    def __iter__(self):
        return zrange(self.n)
        
    def next(self):
        if self.i < self.n:
            i = self.i
            self.i += 1
            return i
        else:
            raise StopIteration()

执行结果:

>>> y = yrange(5)
>>> list(y)
[0, 1, 2, 3, 4]
>>> list(y)
[]
>>> z = zrange(5)
>>> list(z)
[0, 1, 2, 3, 4]
>>> list(z)
[0, 1, 2, 3, 4]

yrange中,iter返回的是self,在执行list(y)iter返回的都是同一个self,所以再次调用list(y)时只会触发结束迭代异常,列表中并无内容。
而在zrange中,每次执行list(z)时,iter都是返回一个新的迭代器zrange(self.n),所以每次执行list(z)都得到完整的元素。

生成器的迭代

通常,对于数据量特别大的序列,我们会用生成器generator来代替容器对象container,这样可以利用lazy evaluable来节省内存开销。值得注意的是,生成器也是一个只能迭代一次的迭代器。

def grange(n):
    i = 0
    while i < n:
        yield i
        i += 1

执行结果:

>>> glist = grange(10)
>>> list(glist)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(glist)
[]

如果是利用便捷的生成器表达式也是一样:

>>> alist = (i for i in range(10))
>>> list(alist)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(alist)
[]

要解决这个问题,可以将迭代器和生成器组合使用:

class Grange(object):
    def __init__(self, n):
        self.n = n
    
    def __iter__(self):
        for i in range(self.n):
            yield i

结果:

>>> glist = Grange(10)
>>> list(glist)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(glist)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

值得注意的是,平常我们利用到生成器的地方都是数据量特别大的情况,这个时候,其实应该尽量避免多次迭代生成器。我想这应该也是python没有支持对生成器多次迭代的特性的原因。

在实际的编程中,往往需要在函数中多次迭代一个序列,如果这个序列是调用api得到的,而你又不能保证它是没有陷阱的迭代器时。可以在遍历迭代器的时候,加入一个判断语句,避免无法多次迭代的情况发生:

def iterator_checker(iterator):
    assert iter(iterator) is not iter(iterator), "iter() return self"
  • python官网迭代器文档

  • python practice book

  • <<Effective Python>>

--结束END--

本文标题: python迭代器资料整理

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python迭代器资料整理
    相关概念定义 迭代器(Iterator): 满足迭代协议的对象就是迭代器 iterator就是实现了Iteration Protocol的对象,这类对象都支持循环遍历的操作(for/while/支持迭代的函数list() sum()....
    99+
    2023-01-31
    迭代 资料 python
  • Python资料整理
     Python基本安装:      * http://www.python.org/ 官方标准Python开发包和支持环境,同时也是Python的官方网站;      * http://www.activestate....
    99+
    2023-01-31
    资料 Python
  • Python 学习资料整理
    Python3 Official Documentation Python3 Document Coding Style PEP 8 Encoding Python Unicode UTF Dear with string and u...
    99+
    2023-01-31
    学习资料 Python
  • Android 换肤技术资料整理
    Android换肤技术总结 背景 纵观现在各种Android app,其换肤需求可以归为 - 白天/黑夜主题切换(或者别的名字,通常2套),如同花顺/自选股/天天动听等,U...
    99+
    2022-06-06
    Android
  • Java中四种访问权限资料整理
     Java中四种访问权限总结一、Java中有四种访问权限, 其中三种有访问权限修饰符,分别为private、public、protected,还有一种不带任何修饰符(default)。 private: Java语言中对访问权限限...
    99+
    2023-05-31
    java 访问权限 ava
  • 阿里云代理需要什么资料
    一、阿里云代理的基本情况 阿里云是阿里巴巴集团旗下的云计算公司,成立于2009年。目前,阿里云在全球范围内拥有数万个代理商,覆盖了各个行业和领域。代理商可以为企业提供云计算产品和服务的销售、技术支持和售后服务。 二、阿里云代理的优势 品...
    99+
    2023-10-27
    阿里 资料
  • Android 6.0权限申请详解及权限资料整理
    在android 6.0开始,部分的权限需要我们动态申请,也就是说当我们的打开app的时候系统不会主动像您申请app所需要的部分权限,需要客户在使用app的时候主动的去申请。 ...
    99+
    2022-06-06
    Android
  • python迭代、可迭代对象、迭代器及生
    迭代 通常意义上的迭代是指:重复执行一系列运算,从前面的量依次推出后面的量的过程,每一次迭代的结果,会作为下一次迭代的初始值。 在c、c++、java等编程语言中的for循环语句,就是一个迭代过程,例如: for(int i=0;i&l...
    99+
    2023-01-30
    迭代 器及 对象
  • 详解Python迭代和迭代器
    我们将要来学习python的重要概念迭代和迭代器,通过简单实用的例子如列表迭代器和xrange。 可迭代 一个对象,物理或者虚拟存储的序列。list,tuple,strins,dicttionary,set...
    99+
    2022-06-04
    迭代 详解 Python
  • Python迭代和迭代器详解
    迭代器 迭代器(iterator)有时又称游标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如链表或阵列)上遍访的界面,设计人员无需关心容器物件的内存分配的实现细节。 摘自维...
    99+
    2022-06-04
    迭代 详解 Python
  • python 迭代器
    我们已经知道,可以直接作用于for循环的数据类型有以下几种:一类是集合数据类型,如list、tuple、dict、set、str等;一类是generator,包括生成器和带yield的generator function。这些可以直接作用于...
    99+
    2023-01-30
    迭代 python
  • python迭代器
    迭代器可以直接作用for循环的数据类型我们已经知道,可以直接作用for循环的数据类型有以下几种:  一类是集合数据类型 如:list、tuple、dict、set、str等;  一类是generator,包括生成器和带yield的gener...
    99+
    2023-01-31
    迭代 python
  • MT6750处理器参数,MT6750芯片资料
    MT6750处理器MT6750单芯片是联发科技支持LTE Cat-6技术的中端产品,以八核心的强大运算能力执行新一代的调制解调技术,支持各式主流的IP多媒体子系统(IMS),包含 VoLTE、ViLTE、VoWiFi、RCS ,以优异性能提...
    99+
    2023-06-05
  • Python进阶:迭代器与迭代器切片
    2018-12-31 更新声明:切片系列文章本是分三篇写成,现已合并成一篇。合并后,修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔接做了大量改动。原系列的单篇就不删除了,毕竟也是有单独成篇的作用。特此声明,请阅读改...
    99+
    2023-01-30
    进阶 迭代 切片
  • Python迭代器的实现原理
    目录前言:迭代器的创建迭代器的底层结构迭代器是怎么迭代元素的?小结前言: 在Python里面,只要类型对象实现了__iter__,那么它的实例对象就被称为可迭代对象(Iterable...
    99+
    2022-11-11
  • Python之迭代器
    ''' 查看可对某个变量或数据类型执行的操作 : dir(var) 迭代器 : 在同一个代码块中,依次取出可迭代对象中的每一个元素     特点 : 完全忽视可迭代对象的索引以及长度,只关注下一块内存是否有值;     实现原理(猜测) :...
    99+
    2023-01-31
    迭代 Python
  • 006-Python迭代器
    什么是迭代器 先说一些概念性的东西: 可迭代对象:列表、元组、集合、字符串、bytes、bytearray、字典和生成器。 有__iter__的对象叫可迭代对象;有__next__方法的可迭代对象叫迭代器。 可迭代对象可以用在for in...
    99+
    2023-01-31
    迭代 Python
  • python iterator(迭代器)
    迭代:重复做一件事iterable(可迭代)对象:支持“每次仅返回自身所包含的其中一个元素”的对象iterable对象实现了__iter__方法     序列类型,如:list、str、tuple     非序列类型,如:dict、file...
    99+
    2023-01-31
    迭代 python iterator
  • Python中迭代和迭代器是什么
    本篇文章给大家分享的是有关Python中迭代和迭代器是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。可迭代一个对象,物理或者虚拟存储的序列。list,tuple,strin...
    99+
    2023-06-17
  • 怎样理解Python迭代对象和迭代器以及生成器
    这篇文章将为大家详细讲解有关怎样理解Python迭代对象和迭代器以及生成器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。在了解Python的数据结构时,容器(container)、可迭代对象...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作