Python浅析迭代器Iterator的使用

目录
  • 前言
  • 迭代器是什么
  • 自定义迭代器

前言

当我们需要对列表(list)、元组(tuple)、字典(dictionary)和集合(set)的元素进行遍历时,其实Python内部都是启动迭代器来完成操作的。

迭代器(Iterator)并非Python独有的,在C++和Java中也出现了此概念。迭代器可以帮助我们解决面对复杂的数据场景时,快速简便的获取数据。

迭代器是什么

迭代器是访问集合的一种方式。

迭代器是一个可以记住遍历位置的对象。

迭代器从集合的第一个元素开始访问,直到所有的元素被访问完才结束。

迭代器只能往往前,不能后退。

我们已经知道,可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型:如:list,tuple,dict,set,str等;

一类是generator,包括生成器和yield的generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable.

那么怎么判断一组数据是不是Iterable对象呢?

可以使用instance()判断一个对象是否是Iterable对象。

from collections.abc import Iterable
print(isinstance([1], Iterable))  # True
print(isinstance({0, 1}, Iterable))  # True
print(isinstance((1, ''), Iterable))  # True
print(isinstance({1: 10}, Iterable))  # True
print(isinstance((i for i in range(10)), Iterable))  # True
print(isinstance(10, Iterable))  # False
'''

⽣成器不但可以作⽤于 for 循环,还可以被 next() 函数不断调⽤并返回下⼀个值,直到最后抛出 StopIteration 错 误表示⽆法继续返回下⼀个值了。

可以被next()函数调⽤并不断返回下⼀个值的对象称为迭代器:Iterator。

可以使⽤ isinstance() 判断⼀个对象是 否是Iterator 对象,这里就产生一个疑问了,生成器都是 Iterator 对象, list 、 dict 、 str 是不是 Iterator ?为什么?。

list 、 dict 、 str 不是 Iterator ,因为Python的 Iterator 对象表示的是一个数据流,Iterator对象可以 被 next() 函数调用并不断返回下一个数据,直到没有数据时抛出 StopIteration 错误。

可以把这个数据流看做 是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过 next() 函数实现按需计算下一个数据,所以Iterator 的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator 甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的 那我们还可以通过 isinstance() 来判断是否是 Iterator 对象

注意 Iterator 对象和 Iterable 对象,一个是迭代器,一个是可迭代对象

from collections.abc import Iterator
print(isinstance((i for i in range(10) if i % 2 == 0), Iterator))  # True
print(isinstance([], Iterator))  # False
print(isinstance({}, Iterator))  # False
print(isinstance('abc', Iterator))  # False

但是可以将 list 、 dict 、 str 等 Iterable 变成 Iterator,这里我们可以使用 iter() 函数

代码:

print(isinstance(iter([]), Iterator))  # True
print(isinstance(iter({}), Iterator))  # True
print(isinstance(iter('abc'), Iterator))  # True

所有可以作用于for循环的对象都是Iterable类型;

可以作用于next()函数的对象都是Ttreator类型,他们表示一个惰性计算序列;

集合数据类型list,dict,str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

自定义迭代器

class Myiter:
    def __init__(self,times):
        self.times = times
    def __iter__(self):
        self.n = 0
        return self
    def __next__(self):
        if self.n <= self.times:
           result = 3 ** self.n
            self.n += 1
            return result
        else:
            raise StopIteration
data = Myiter(4)
it = iter(data)
# 第1次
print(next(it))
# 第2次
print(next(it))
# 第3次
print(next(it))
# 第4次
print(next(it))
# 第5次
print(next(it))
# 第6次,超出范围触发StopIteration
print(next(it))
...
1
3
9
27
81
Traceback (most recent call last):
  File "E:\workspace\uiat\cookbooks\tester.py", line 67, in <module>
    print(next(it))
  File "E:\workspace\uiat\cookbooks\tester.py", line 51, in __next__
    raise StopIteration
StopIteration
...
  • 创建的对象/类需要实现 __iter__() 和 __next__()两个方法即可作为迭代器
  • 迭代器中__iter__()返回迭代器本身方法
  • 迭代器中__next__()方法允许进行其他操作,但是必须返回迭代器的下一项
  • 为了防止迭代永远进行下去,Python提供stopIterator语句,终止迭代

到此这篇关于Python浅析迭代器Iterator的使用的文章就介绍到这了,更多相关Python Iterator内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python中实现迭代器(iterator)的方法示例

    概述 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 延迟计算或惰性求值 (Lazy evaluation) 迭代器不要求你事先准备好整个迭代过程中所有的元素.仅仅是在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁.这个特点使得它特别适合用于遍历一些巨大的或是无限的集合. 今天创建了一个实体类,大致如下: class Account(): def __init__(self, account_n

  • Python迭代器iterator生成器generator使用解析

    1. 迭代 根据记录的前面的元素的位置信息 去访问后续的元素的过程 -遍历 迭代 2. 可迭代对象 iterable 如何判断可迭代对象的3种方式 能够被迭代访问的对象 for in 常用可迭代对象-list tuple str from collections import Iterable isinstance(obj, Iterable) 3. 可迭代对象 可迭代对象通过__iter__方法提供一个 可以遍历对象中数据的工具-迭代器 iter(可迭代对象) 可以获取可迭代对象的迭代器 通过

  • Python 迭代器Iterator详情

    目录 前言 1. 什么是迭代器? 2. 迭代器类型 3. 迭代器分类 容器迭代器 遍历迭代器 自定义迭代器 总结 前言 当我们需要对列表(list).元组(tuple).字典(dictionary)和集合(set)的元素进行遍历时,其实Python内部都是启动迭代器来完成操作的. 迭代器(Iterator)并非Python独有的,在C++和Java中也出现了此概念.迭代器可以帮助我们解决面对复杂的数据场景时,快速简便的获取数据. 1. 什么是迭代器? 迭代器是一个表示数据流的对象,当我们调用ne

  • python中迭代器(iterator)用法实例分析

    本文实例讲述了python中迭代器(iterator)用法.分享给大家供大家参考.具体如下: #--------------------------------------- # Name: iterators.py # Author: Kevin Harris # Last Modified: 03/11/04 # Description: This Python script demonstrates how to use iterators. #----------------------

  • 一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念

    前言 在Python中可迭代(Iterable).迭代器(Iterator)和生成器(Generator)这几个概念是经常用到的,初学时对这几个概念也是经常混淆,现在是时候把这几个概念搞清楚了. 0x00 可迭代(Iterable) 简单的说,一个对象(在Python里面一切都是对象)只要实现了只要实现了__iter__()方法,那么用isinstance()函数检查就是Iterable对象: 例如 class IterObj: def __iter__(self): # 这里简单地返回自身 #

  • Python中Iterator迭代器的使用杂谈

    迭代器是一种支持next()操作的对象.它包含一组元素,当执行next()操作时,返回其中一个元素:当所有元素都被返回后,生成一个StopIteration异常. >>>a=[1,2,3] >>>ia=iter(a) >>>next(ia) 1 >>>next(ia) 2 >>>next(ia) 3 >>>next(ia) Traceback (most recent call last): Fil

  • Python浅析迭代器Iterator的使用

    目录 前言 迭代器是什么 自定义迭代器 前言 当我们需要对列表(list).元组(tuple).字典(dictionary)和集合(set)的元素进行遍历时,其实Python内部都是启动迭代器来完成操作的. 迭代器(Iterator)并非Python独有的,在C++和Java中也出现了此概念.迭代器可以帮助我们解决面对复杂的数据场景时,快速简便的获取数据. 迭代器是什么 迭代器是访问集合的一种方式. 迭代器是一个可以记住遍历位置的对象. 迭代器从集合的第一个元素开始访问,直到所有的元素被访问完才

  • 详解Python的迭代器、生成器以及相关的itertools包

    对数学家来说,Python这门语言有着很多吸引他们的地方.举几个例子:对于tuple.lists以及sets等容器的支持,使用与传统数学类似的符号标记方式,还有列表推导式这样与数学中集合推导式和集的结构式(set-builder notation)很相似的语法结构. 另外一些很吸引数学爱好者的特性是Python中的iterator(迭代器).generator(生成器)以及相关的itertools包.这些工具帮助人们能够很轻松的写出处理诸如无穷序列(infinite sequence).随机过程

  • ES6 迭代器(Iterator)和 for.of循环使用方法学习(总结)

    一.什么是迭代器? 生成器概念在Java,Python等语言中都是具备的,ES6也添加到了JavaScript中.Iterator可以使我们不需要初始化集合,以及索引的变量,而是使用迭代器对象的 next 方法,返回集合的下一项的值,偏向程序化. 迭代器是带有特殊接口的对象.含有一个next()方法,调用返回一个包含两个属性的对象,分别是value和done,value表示当前位置的值,done表示是否迭代完,当为true的时候,调用next就无效了. ES5中遍历集合通常都是 for循环,数组

  • python遍历迭代器自动链式处理数据的实例代码

    目录 python遍历迭代器自动链式处理数据 附:python 手动遍历迭代器 总结 python遍历迭代器自动链式处理数据 pytorch.utils.data可兼容迭代数据训练处理,在dataloader中使用提高训练效率:借助迭代器避免内存溢出不足的现象.借助链式处理使得数据读取利用更高效(可类比操作系统的资源调控) 书接上文,使用迭代器链式处理数据,在Process类的__iter__方法中执行挂载的预处理方法,可以嵌套包裹多层处理方法,类似KoaJs洋葱模型,在for循环时,自动执行预

  • 详解Python中迭代器和生成器的原理与使用

    目录 1.可迭代对象.迭代器 1.1概念简介 1.2可迭代对象 1.3迭代器 1.4区分可迭代对象和迭代器 1.5可迭代对象和迭代器的关系 1.6可迭代对象和迭代器的工作机制 1.7自己动手创建可迭代对象和迭代器 1.8迭代器的优势 1.9迭代器的缺点和误区 1.10python自带的迭代器工具itertools 2.生成器 2.1生成器的创建方法 2.2生成器方法 2.3生成器的优势 2.4生成器应用场景 3.生成器节省内存.迭代器不节省内存 3.1可迭代对象 3.2迭代器 3.3生成器 3.

  • 详谈ES6中的迭代器(Iterator)和生成器(Generator)

    前面的话 用循环语句迭代数据时,必须要初始化一个变量来记录每一次迭代在数据集合中的位置,而在许多编程语言中,已经开始通过程序化的方式用迭代器对象返回迭代过程中集合的每一个元素 迭代器的使用可以极大地简化数据操作,于是ES6也向JS中添加了这个迭代器特性.新的数组方法和新的集合类型(如Set集合与Map集合)都依赖迭代器的实现,这个新特性对于高效的数据处理而言是不可或缺的,在语言的其他特性中也都有迭代器的身影:新的for-of循环.展开运算符(...),甚至连异步编程都可以使用迭代器 本文将详细介

随机推荐