迭代器

迭代是Python最强大的功能之一,是访问集合元素的一种方式。

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

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next()。

字符串,列表或元组对象都可用于创建迭代器:

>>>list=[1,2,3,4]

>>> it = iter(list) # 创建迭代器对象

>>> print (next(it)) # 输出迭代器的下一个元素

1

>>> print (next(it))

2

>>>

迭代器对象可以使用常规for语句进行遍历:

list=[1,2,3,4]

it = iter(list) # 创建迭代器对象

for x in it:

print (x, end=" ")

执行以上程序,输出结果如下:

1 2 3 4

也可以使用 next() 函数:

import sys # 引入 sys 模块

list=[1,2,3,4]

it = iter(list) # 创建迭代器对象

while True:

try:

print (next(it))

except StopIteration:

sys.exit()

执行以上程序,输出结果如下:

1

2

3

4

创建一个迭代器

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

如果你已经了解的面向对象编程,就知道类都有一个构造函数,Python 的构造函数为 __init__(), 它会在对象初始化的时候执行。

更多内容查阅:Python3 面向对象

__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。

__next__() 方法(Python 2 里是 next())会返回下一个迭代器对象。

创建一个返回数字的迭代器,初始值为 1,逐步递增 1:

class MyNumbers:

def __iter__(self):

self.a = 1

return self

def __next__(self):

x = self.a

self.a += 1

return x

myclass = MyNumbers()

myiter = iter(myclass)

print(next(myiter))

print(next(myiter))

print(next(myiter))

print(next(myiter))

print(next(myiter))

执行输出结果为:

1

2

3

4

5

StopIteration

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

在 20 次迭代后停止执行:

class MyNumbers: def __iter__(self): self.a = 1

return self

def __next__(self): if self.a <= 20: x = self.a

self.a += 1

return x

else: raise StopIteration

myclass = MyNumbers()myiter = iter(myclass)

for x in myiter: print(x)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

调用一个生成器函数,返回的是一个迭代器对象。

以下实例使用 yield 实现斐波那契数列:

import sys

def fibonacci(n): # 生成器函数 - 斐波那契

a, b, counter = 0, 1, 0

while True:

if (counter > n):

return

yield a

a, b = b, a + b

counter += 1

f = fibonacci(10) # f 是一个迭代器,由生成器返回生成

while True:

try:

print (next(f), end=" ")

except StopIteration:

sys.exit()

执行以上程序,输出结果如下:

0 1 1 2 3 5 8 13 21 34 55

python3生成器与迭代器_Python3迭代器与生成器相关推荐

  1. python3生成器与迭代器_python3迭代器和生成器 | 吴老二

    迭代函数就是一个利用for...in来完成的一个过程,但是呢?在没说迭代函数之前我们需要了解一下什么是迭代器,什么是生成器,两者的区别是什么,先一个一个的学习. 迭代器 先学习一下什么是迭代器,迭代器 ...

  2. python3迭代器和可迭代对象_一文读懂 Python3 可迭代对象、迭代器、生成器区别...

    笔者学习Python已有一段时间,一直以为对于可迭代对象(iterable).迭代器(iterator).生成器(generator)有一定理解了,直到看到<流畅的python>中的讲解才 ...

  3. python3生成器_Python3.7之生成器

    Python3.7之生成器 一.生成器概念 Python使用生成器对延迟操作提供了支持.所谓延迟操作,是指在需要的时候才产生结果,而不是立即产生结果.主要有两种结构可以延迟结果创建.生成器函数和生成器 ...

  4. python列表迭代器_python迭代器生成器-迭代器和list区别

    迭代 生成 for循环遍历的原理 for循环遍历的原理就是迭代,in后面必须是可迭代对象 为什么要有迭代器 对于序列类型:字符串.列表.元组,我们可以使用索引的方式迭代取出其包含的元素.但对于字典.集 ...

  5. python迭代器和生成器的作用_python迭代器与生成器的详细介绍

    一.什么玩意是迭代器? 先说说什么是迭代吧,迭代就是一件事情重复很多次,比如说for循环. for循环可以对一切有iter方法的对象进行迭代,那么什么是iter方法呢? 一个对象是否可迭代,全都取决于 ...

  6. python迭代器与生成器实际用途_python迭代器和生成器

    python迭代器和生成器 一.迭代器 1.什么是迭代器 说迭代器之前有个相关的名词需要介绍: 可迭代对象:只要定义了iter()方法,我们就说该对象是可迭代对象,并且可迭代对象能提供迭代器. 在Py ...

  7. python3 生成器_python3基础之生成器

    初识生成器 说到生成器还是要从列表推导式说起,关于列表推导式可以看看<python3基础之如何使用列表推导式>.先看一个简单的列表推导式: 可以看到列表推导式是用中括号将式子括起来的,如果 ...

  8. 生成器、生成器函数、推导式、生成器表达式

    一.生成器 生成器的本质就是迭代器 生成器的特点和迭代器一样.取值方式和迭代器一样(__next__(),send():给上一个yield传值) 生成器一般由生成器函数或者生成器表达式来创建 其实就是 ...

  9. python生成器函数_【python】生成器和生成器函数

    1.生成器函数: 普通函数: def func(): print("周杰伦") return "昆凌" func() #执行func()函数,"周杰伦 ...

最新文章

  1. 线段树区间扫描线超详解,一篇文章搞懂扫描线
  2. HTML基础标签入门
  3. [原创] 毕设---在myeclipes中安装Hadoop开发插件
  4. 带权并查集-Building Block
  5. UILabel使用自定义字体
  6. CODEVS 3269 混合背包
  7. mysql xtrabackup安装与原理
  8. mysql中的replication_MySQL Replication(主从服务器)配置实例
  9. 拉电阻、下拉电阻的原理和作用
  10. CorelDRAWX4的VBA插件开发(十八)命令合并与一键多步撤销
  11. 计算机统计硕士排名,卡内基梅隆大学硕士统计学专业排名务必稳重的去看
  12. i7-1160G7 怎么样 相当于什么水平
  13. Android Studio实现文字识别(基于百度云OCR)
  14. python3绘制皮卡丘
  15. 学习淘宝分享出来的链接web检测打开原生App
  16. hello.c的一生
  17. echarts饼图图例总结
  18. 在Ubuntu下从Python连接到Microsoft SQL Server数据库
  19. 4、Kafka API实战
  20. 十个细节透露女人心思

热门文章

  1. 安装django框架:虚拟环境准备 框架安装
  2. matplolib绘图
  3. flask-02-简单认识
  4. 建站利器 | 阿里巴巴上线静态开源站点搭建工具 Docsite
  5. 十四个方法提高博客的页面访问量
  6. App 留客率出炉:iPhone 大胜 Android!
  7. oracle,EBS的库存数据视图
  8. 写在2009年的开始
  9. 初学UML,画了几个UML图
  10. Nginx负载均衡配置和健康检查