Python 迭代器Iterator详情

作者:??盆友圈的小可爱???? 时间:2021-10-12 07:01:42 

前言

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

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

1. 什么是迭代器?

  • 迭代器是一个表示数据流的对象,当我们调用next()方法时会返回容器中的下一个值

  • 迭代器中包含__iter____next__()方法。通过__iter__方法可以返回迭代器对象本身的方法。__next__()方法会使cur指针始终指向当前位置,即返回容器中的下一个值,如果容器中没有更多元素了,则会抛出StopIteration异常。

  • 迭代器(iterator)也是可迭代的对象(iterable)

2. 迭代器类型

  • Python中支持容器进行迭代,同时也提供迭代器协议支持用户自定义类进行迭代

  • 容器迭代器:container.__iter__()方法实现容器对象迭代

  • 迭代器协议:__iter__()方法和__next__()方法

  • __iter__():返回迭代器本身,容器可以与for...in结合使用

  • __next__():返回迭代器返回下一项

3. 迭代器分类

容器迭代器

data = [1,2,3,4]
it = iter(data)
print(next(it))
print(next(it))
  • Python中提供的内置容器有:list、tuple、dictionary 和 set都是可迭代对象

  • 调用iter()方法获取对应的迭代对象

  • 调用next()方法获取迭代对象下一项值。每一次调用next之后,会自动往后移到到一位,获取后面一位的数据。

遍历迭代器

for i in it:
   print(i)

对于可迭代对象,我们也可以使用for...in来进行迭代

自定义迭代器

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语句,终止迭代

来源:https://juejin.cn/post/7102018713028657160

标签:Python,迭代器,Iterator
0
投稿

猜你喜欢

  • 用Python实现协同过滤的教程

    2023-08-30 12:28:55
  • PHP排序二叉树基本功能实现方法示例

    2023-07-10 04:45:53
  • 2022年最新Typora的破解方法

    2023-08-29 04:36:03
  • oblog4.6转换ucenterHome1.5过程全记录,提供老用户无法登陆的补丁

    2009-10-29 12:04:00
  • 用pytorch的nn.Module构造简单全链接层实例

    2022-01-04 00:00:17
  • 关于tf.reverse_sequence()简述

    2022-05-23 03:05:08
  • Python+appium框架原生代码实现App自动化测试详解

    2023-02-26 11:59:32
  • vue.js整合vux中的上拉加载下拉刷新实例教程

    2024-04-30 10:30:17
  • [翻译]标记语言和样式手册 chapter 6 短语元素

    2008-01-25 16:37:00
  • python判断元素是否存在的实例方法

    2021-02-24 23:20:08
  • 页面自动刷新javascript代码大全

    2010-06-28 18:54:00
  • vue3中使用ref和emit来减少props的使用示例详解

    2024-04-27 16:02:02
  • python基于concurrent模块实现多线程

    2023-09-10 18:33:46
  • django基础之数据库操作方法(详解)

    2024-01-19 12:42:25
  • networkx库绘制带权图给无权图加权重输出

    2022-01-29 05:54:23
  • php打包压缩文件之ZipArchive方法用法分析

    2024-05-11 09:46:05
  • MySQL单表查询常见操作实例总结

    2024-01-20 05:47:17
  • 简单form标准化实例——语义结构

    2007-06-20 16:32:00
  • JS字符串和数组如何实现相互转化

    2024-04-18 09:39:10
  • 老生常谈CSS网页布局的意义与副作用

    2008-09-12 12:31:00
  • asp之家 网络编程 m.aspxhome.com