广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python 拓展之迭代器
  • 795
分享到

Python 拓展之迭代器

迭代Python 2023-01-30 23:01:31 795人浏览 泡泡鱼

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

摘要

写在之前 今天来讲讲「迭代器」的内容,其实已经拖了好多天了,感觉再不写就要忘记了。「迭代」相信对你来说已经不陌生了,我前面曾经专门用一篇文章来讲,如果你已经没有什么印象的话,就再点进去看看(零基础学习 python 之初识迭代)。 迭代器

写在之前

今天来讲讲「迭代器」的内容,其实已经拖了好多天了,感觉再不写就要忘记了。「迭代」相信对你来说已经不陌生了,我前面曾经专门用一篇文章来讲,如果你已经没有什么印象的话,就再点进去看看(零基础学习 python 之初识迭代)。

迭代器

首先我们先来看一种检查是否可迭代的方法:

>>> hasattr(list,'__iter__')
True

可以用上面的这种方法检查已经学习过的其他默认类型的对象,比如字符串,列表,字典等是否是可迭代的。

iter() 是一个特殊方法,它是迭代规则的基础,有了它,就说明对象是可迭代的。跟迭代有关的一个内建函数 iter(),这个函数我们在之前的文章中介绍过,它返回的是一个迭代器对象,比如像下面这样:

>>> list1 = [1,2,3,4]
>>> iter_list = iter(list1)
>>> iter_list
<list_iterator object at 0x00000000021CE438>

从上述代码的结果可以看出,iter_list 引用的是迭代器对象。那么在这里有一个问题,iter_list 和 list1 有区别吗?我们来试一下:

>>> hasattr(list1,'__iter__')
True
>>> hasattr(iter_list,'__iter__')
True

从上面看出它们都有 iter,说明它们都是可迭代的。

>>> hasattr(list1,"__next__")
False
>>> hasattr(iter_list,"__next__")
True

我们把像 iter_list 所引用的对象那样,称之为「迭代器对象」。显而易见的是,迭代器对象必然是可迭代的,反正则不一定。且 Python 中迭代器对象实现的是 next() 方法。

为了体现一下 Python 在这的强大之处,我们先来写一个迭代器对象:

class MyRange:
   def __init__(self,n):
       self.i = 1
       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()

if __name__ == "__main__":
   x = MyRange(5)
   print([i for i in x])

上述代码的运行结果如下所示:

[1,2,3,4,5]

上述的代码仿写了类似 range() 的类,但是与 range() 又有所不同,除了结果不同以外还包括以下 2 点:

1.__iter__() 是类中的核心,它返回了迭代器的本身,一个实现了 iter() 方法的对象,就意味着它是可迭代的。

2.实现了 next() 方法,从而使得这个对象是迭代器对象。

接下来我们来看看 range() 本身:

>>> a = range(5)
>>> hasattr(a,'__iter__')
True
>>> hasattr(a,'__next__')
False
>>> print(a)
range(0, 5)

由上面我们就可以看出,其实我们所写的类和 range() 本身还是有很大区别的。

通过上面的内容和我们之前的文章对迭代的讲述,下面我们对迭代器做一个概括:

1.在 Python 中,迭代器是遵循迭代协议的对象。我们可以使用 iter() 从任何序列得到迭代器(exp: list,turple,set and so on)。

2.当自己编写迭代器的类的时候,其中实现 iter() 和 next() 方法,如果没有元素的话,会引发 StopIteration 异常。

3.如果有很多值的话,列表会占用太多的内存,而迭代器则占用的更少,它从第一个元素开始访问,直到所有的元素被访问完结束,只能向前冲,不能后退。

迭代器不仅仅是实用而已,而且也非常的有趣,让我们来看下面的操作:

>>> list1 = [x**x for x in range(3)]
>>> list1
[1, 1, 4]
>>> for i in list1:print(i)
...
1
1
4
>>> for i in list1:print(i)
...
1
1
4

我们在上面重复两次调用列表 list1 进行循环,都是能正常进行的,这个列表相当于一个可以长久使用的东西,可以重复使用。

在 Python 中,除了列表解析式以外,还可以做成元组解析式,方法也是非常的简单:

>>> tuple1 = (x**x for x in range(3))
>>> tuple1
<generator object <genexpr> at 0x0000000001DF16D8>
>>> for i in tuple1:print(i)
...
1
1
4
>>> for i in tuple1:print(i)
...

对于 tuple1,我们可以看到它是一个 generator 对象,关于这个是啥我们先不管,后面我会单独来说的。当我们把它用到循环中的时候,它明显是个一次性用品,再次使用的时候它就什么也不显示了。

>>> type(list1)
<class 'list'>
>>> type(tuple1)
<class 'generator'>

由上面可以看出,list1 和 tuple1 是两种不同的对象,它们之间的区别不仅仅是 tuple1 是一个元组这么简单,它还是 generator。其它的我们先不管,你可以尝试一下在交互模式下输入 dir(tuple1),查看它是否有 iternext,我可以先告诉你,是有的。

既然是有的,那么 tuple1 引用的就是一个迭代器的对象,它的 next() 方法促使它只能向前。

写在之后

迭代器到这就写完了,从内容来看迭代器确实有其过人之处,但是它不是万能的,比如它只能向前,不能回退。还有一个是迭代器并不适合在多线程的环境中对可变集合使用,现在这个东西看起来可能还是有点困难,如果以后有机会写多线程的话,再做解释。

更多内容,欢迎关注公众号「Python空间」,期待和你的交流。

--结束END--

本文标题: Python 拓展之迭代器

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

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

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

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

下载Word文档
猜你喜欢
  • Python 拓展之迭代器
    写在之前 今天来讲讲「迭代器」的内容,其实已经拖了好多天了,感觉再不写就要忘记了。「迭代」相信对你来说已经不陌生了,我前面曾经专门用一篇文章来讲,如果你已经没有什么印象的话,就再点进去看看(零基础学习 Python 之初识迭代)。 迭代器...
    99+
    2023-01-30
    迭代 Python
  • Python之迭代器
    ''' 查看可对某个变量或数据类型执行的操作 : dir(var) 迭代器 : 在同一个代码块中,依次取出可迭代对象中的每一个元素     特点 : 完全忽视可迭代对象的索引以及长度,只关注下一块内存是否有值;     实现原理(猜测) :...
    99+
    2023-01-31
    迭代 Python
  • Python 拓展之特殊函数(lambd
    写在之前 今天给大家介绍几个比较特殊的函数,他们具有函数式编程的特点,有人将它们视为 Python 可进行 “函数式编程” 的见证,至于什么是函数式编程,不是本篇文章的重点,感兴趣的可以去了解一下。老读者可能都知道,我非常推崇 Pytho...
    99+
    2023-01-30
    函数 Python lambd
  • python之迭代
    Iterable是迭代在各种语言中常见,在API中的解释 在python中主要通过for  in 实现 迭代对象用isinstance(str,Iterable)去判断则要植入collections集合库 最后一个小问题,如果要对lis...
    99+
    2023-01-30
    迭代 python
  • python学习之可迭代对象、迭代器、生成器
    Iterable – 可迭代对象 能够逐一返回其成员项的对象。 可迭代对象的例子包括所有序列类型 (例如 list, str 和 tuple) 以及某些非序列类型例如 dict, 文...
    99+
    2022-11-12
  • 详解Python之可迭代对象,迭代器和生成器
    目录一、概念描述二、序列的可迭代性三、经典的迭代器模式四、生成器也是迭代器五、实现惰性迭代器六、使用生成器表达式简化惰性迭代器总结 一、概念描述 可迭代对象就是可以迭代的对象,我们可...
    99+
    2022-11-12
  • Python学习之迭代器详解
    目录什么是迭代器如何生成迭代器迭代器函数 - iter() 函数 与 next() 函数可迭代的对象生成迭代器迭代器的用法 - 演示案例什么是迭代器 迭代是 python 中访问集合...
    99+
    2022-11-13
  • python基础之迭代器与生成器
    目录1. 迭代器1.1 迭代器的使用1.2 创建类的迭代器2. 生成器2.1 生成器的使用2.2 生成器表达式总结 1. 迭代器 1.1 迭代器的使用 迭代器对象从集合的第一个元素开...
    99+
    2022-11-12
  • Python学习之迭代器和生成器
    迭代器 在Python如果一个对象可被循环(遍历)该对象中每一个元素的过程叫做迭代。例如 ,字典、字符串、列表、元祖、集合等。他们可被迭代的原因是,都有一个共同的内置函数__iter__。通过执行内置对象的__next__函数,可以依次打...
    99+
    2023-01-30
    生成器 迭代 Python
  • 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
  • Python异步之迭代器怎么使用
    这篇文章主要介绍“Python异步之迭代器怎么使用”,在日常操作中,相信很多人在Python异步之迭代器怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python异步之迭代器怎么使用”的疑惑有所帮助!...
    99+
    2023-07-05
  • 学会javascript之迭代器
    目录简介 js 中的迭代器是什么样子的 迭代协议 可迭代协议 迭代器协议 迭代过程 迭代总结 自定义迭代 传统写法 生成器函数写法 简介   迭代器是一种设计模式,可在容器对象 如...
    99+
    2022-11-12
  • Python进阶:迭代器与迭代器切片
    2018-12-31 更新声明:切片系列文章本是分三篇写成,现已合并成一篇。合并后,修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔接做了大量改动。原系列的单篇就不删除了,毕竟也是有单独成篇的作用。特此声明,请阅读改...
    99+
    2023-01-30
    进阶 迭代 切片
  • python三大器之迭代器、生成器、装饰器
    目录迭代器生成器装饰器(非常实用!)迭代器 聊迭代器前我们要先清楚迭代的概念:通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭...
    99+
    2022-11-12
  • 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
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作