可迭代对象(Iterable)

  • 包含

    • 迭代器

      • 生成器
    • 序列
      • list
      • str
      • tuple
    • 字典
  • 迭代器协议

  对象需要提供next()方法,它要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代。

迭代器(Iterator)

定义

  • 有两个基本的方法:iter() 和 next()。
  • 访问集合元素的一种方式。
  • 可以记住遍历的位置的对象。
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不能后退。

迭代器和可迭代对象的区别

  • 可迭代对象包含迭代器。
  • 如果一个对象拥有__iter__()方法,就是可迭代对象。
  • 定义迭代器,必须在实现__iter__()的基础上,再实现next()方法。
  • 可迭代对象可被for遍历,迭代器在此基础上可以调用next()方法

创建一个迭代器

创建一个迭代器类

把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__()__next__()

  • iter() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 next() 方法并通过 StopIteration 异常标识迭代的完成。
  • next() 方法(Python 2 里是 next())会返回下一个迭代器对象。

例:

  1. from collections import Iterable,Iterator
  2. #创建一个返回数字的迭代器, 初始值为 1, 逐步递增1
  3. class MyNumbers:
  4. def __init__(self):
  5. self.a = 1
  6. def __iter__(self):
  7. return self
  8. def __next__(self):
  9. x = self.a
  10. self.a += 1
  11. return x
  12. a = MyNumbers()
  13. print(isinstance(a, Iterator))#判断是否是迭代器
  14. print(next(a))
  15. print(next(a))
  16. print(next(a))
  17. print(next(a))
  18. print(next(a))

运行结果如下:

  1. True
  2. 1
  3. 2
  4. 3
  5. 4
  6. 5

使用内置iter()函数

使用iter()函数将可迭代对象转换为迭代器

例:

  1. from collections import Iterable,Iterator
  2. a = [1,2,3,4]
  3. b = iter(a)
  4. print(type(a))#查看类型
  5. print(type(b))
  6. print(isinstance(a, Iterable))#判断是否为可迭代对象
  7. print(isinstance(b, Iterable))
  8. print(isinstance(a, Iterator))#判断是否是迭代器
  9. print(isinstance(b, Iterator))
  10. print(next(b))
  11. print(next(b))
  12. print(next(b))
  13. print(next(b))

运行结果如下:

  1. <class 'list'>
  2. <class 'list_iterator'>
  3. True
  4. True
  5. False
  6. True
  7. 1
  8. 2
  9. 3
  10. 4

StopIteration异常

  StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在__next__()方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。

例:在 10 次迭代后停止执行

  1. class MyNumbers:
  2. def __init__(self):
  3. self.a = 1
  4. def __iter__(self):
  5. return self
  6. def __next__(self):
  7. if self.a <= 10:
  8. x = self.a
  9. self.a += 1
  10. return x
  11. else:
  12. raise StopIteration
  13. a = MyNumbers()
  14. for i in a:
  15. print(i)

执行结果如下

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10

生成器(generator)

定义

  生成器是一种特殊的迭代器,生成器自动实现了“迭代器协议”(即__iter__和next方法),不需要再手动实现两方法。

  生成器在迭代的过程中可以改变当前迭代值,而修改普通迭代器的当前迭代值往往会发生异常,影响程序的执行。

Python有两种不同的方式提供生成器

生成器函数:

  常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行

例:

  1. def abc():
  2. yield "a"
  3. yield "b"
  4. yield "c"
  5. x = abc()
  6. print(next(x))
  7. print(next(x))
  8. print(next(x))

执行结果如下:

  1. a
  2. b
  3. c

生成器表达式:

  类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

  1. a = [i for i in range(5)]#列表推导
  2. b = (i for i in range(5))#生成器表达式
  3. print(type(a))
  4. print(type(b))

执行结果如下:

  1. <class 'list'>
  2. <class 'generator'>

特点

语法上和函数类似:

  生成器函数和常规函数几乎是一样的。它们都是使用def语句进行定义。差别在于,生成器使用yield语句返回一个值,而常规函数使用return语句返回一个值

自动实现迭代器协议:

  对于生成器,Python会自动实现迭代器协议,以便应用到迭代背景中(如for循环,sum函数)。由于生成器自动实现了迭代器协议,所以,我们可以调用它的next()方法,并且,在没有值可以返回的时候,生成器自动产生StopIteration异常

状态挂起:

  生成器使用yield语句返回一个值。yield语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行。

延迟计算:

  一次返回一个结果。不会一次生成所有的结果,在对于大数据量处理时,不一会因为一次性生成大量结果导致机器直接卡死。

生成器只能遍历一次:

例:

  1. a = (x ** 2 for x in range(4))
  2. for i in a:
  3. print(i)
  4. for i in a:
  5. print(i)
  6. else:
  7. print("再次遍历什么都没有输出")

执行结果如下:

  1. 0
  2. 1
  3. 4
  4. 9
  5. 再次遍历什么都没有输出

Python3 迭代器与生成器 - 学习笔记的更多相关文章

  1. python中的迭代器和生成器学习笔记总结

    生成器就是一个在行为上和迭代器非常类似的对象.   是个对象! 迭代,顾名思意就是不停的代换的意思,迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果.每一次对过程的重复称为一次“迭代”,而 ...

  2. python014 Python3 迭代器与生成器

    Python3 迭代器与生成器迭代器迭代是Python最强大的功能之一,是访问集合元素的一种方式..迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结 ...

  3. Python3+迭代器与生成器

    转载Python3 迭代器与生成器 迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素 ...

  4. python3: 迭代器与生成器(1)

    1. 手动遍历迭代器 你想遍历一个可迭代对象中的所有元素,但是却不想使用for循环. >>> items = [1, 2, 3] >>> # Get the ite ...

  5. python3迭代器和生成器

    1.手动访问迭代器中的元素 #要手动访问迭代器中的元素,可以使用next()函数 In [3]: with open('/etc/passwd') as f: ...: try: ...: while ...

  6. Python3 迭代器和生成器

    想要搞明白什么是迭代器,首先要了解几个名词:容器(container).迭代(iteration).可迭代对象(iterable).迭代器(iterator).生成器(generator). 看图是不 ...

  7. 吴裕雄--天生自然python学习笔记:Python3 迭代器与生成器

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...

  8. Python3迭代器与生成器

    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...

  9. 潭州课堂25班:Ph201805201 第十五课 迭代器,生成器 (课堂笔记)

    推导表达式 li1 = list() for i in range(10): # 迭代循环内容 li1.append(i) print( li1 ) ---->>> [0, 1, 2 ...

随机推荐

  1. webWMS开发过程记录(五)- 详细设计之系统界面框架设计

    界面区域划分 使用frameset分了上中下三个区域 上:显示系统名称和用户信息,以及一些提示信息(需通过Ajax定时更新提示信息),显示高度固定 中:再次使用frameset分成左右区域 左:显示导 ...

  2. PDF各种骚操作如何用python实现

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: wLsq PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...

  3. 负载均衡服务之HAProxy基础入门

    首先我们来了解下haproxy是干嘛的?haproxy是一个法国人名叫Willy Tarreau开发的一个开源软件:这款软件主要用于解决客户端10000以上的同时连接的高性能的TCP和HTTP负载均衡 ...

  4. Python巩固 - 第N天

    一.函数解释: def fact(n, m = 1): s = 1 for j in range(1, n+1): s = s*j return n, m, s//m print(fact(10, 5 ...

  5. MySQL的单表查询

    单表查询 单表查询语法: select distinct 字段1,字段2... from 表名 where 条件 group by field having筛选 order by 关键字执行的优先级: ...

  6. Navicat自动备份数据库

    @ 目录 Navicat自动备份数据库 备份与还原 修改备份位置 MySQL:5.7 Navicat:11 Windows10 重要数据库的定时备份是非常重要的,使用Navicat可以非常方便快捷地自 ...

  7. Everything信息泄露

    Everything漏洞描述 [Everything]一款搜索文件非常快的工具,其速度之快令人震惊!它还有一个可以通过HTTP 或 FTP 分享搜索结果 的功能.它可以让用户在本地或局域网上的其他电脑 ...

  8. 使用openmp进行并行编程

    预处理指令pragma 在系统中加入预处理器指令一般是用来允许不是基本c语言规范部分的行为.不支持pragma的编译器会忽略pragma指令提示的那些语句,这样就允许使用pragma的程序在不支持它们 ...

  9. 0day堆(1)堆的管理策略

    基本概念 堆块:堆区内存的基本单位 包括两个部分:块首,块身 块首:标识这个堆块自身的信息:如大小,是否被占用等 块身:分配给用户使用的数据区 堆表:一般位于堆区的起始位置,用于索引堆区所有堆块的信息 ...

  10. JavaScript type="text/template"的用法

    JavaScript type="text/template"相当于定义一个模板,如果没有使用html()方法的话,是显示不出来的,我们直接看例子(我是在tp框架的里面写的) &l ...