迭代器

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

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

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

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

list=[1,2,3,4]
it=iter(list)
printf(next(it))
printf(next(it))

输出为:

1

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

next没有对象时会抛出异常,被捕获后,执行exit退出程序。

创建一个迭代器

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

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

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

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

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

举例

class MyNumbers:def __iter__(self):self.a = 1return selfdef __next__(self):x = self.aself.a += 1return xmyclass = MyNumbers()
myiter = iter(myclass)print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

输出结果:

1

2

3

4

5

实现了两个方法,__iter__方法负责初始化,__next__方法负责定义迭代规则

StopIteration

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

生成器(Generator)
Python 一边循环一边计算的机制,使用了 yield 的函数被称为生成器;是一个返回迭代器的函数,只能用于迭代操作;可以通过生成器表达式和生成器函数获取到数据。
生成器其实是一种特殊的迭代器,但是不需要像迭代器一样实现__iter__和__next__方法,只需要使用关键字yield就可以。

        生成器函数

生成器是Python中的一个对象

对这个对象进行操作,可以依次生产出生成器内部运算产生的数据;

函数体中包含yield关键字(代替return)。

      生成器函数的定义举例:

def add():for i in range(10):yield ig = add()
print(g)       # <generator object add at 0x10f6110f8>
print(next(g))  # 0
print(next(g))  # 1

通过yield关键字定义一个生成器函数,这个生成器函数返回值就是一个生成器对象;

        举例:

生成器函数可以使用next()迭代,且每次next()只会返回一次yield的值,然后暂停,

下次next()时,会在当前位置继续,如果没有元素可以迭代了,还执行next(),则需要给定一

个默认值,不给默认值会报错。

def gen():print('111111')yield '1'print('222222')yield '2'print('333333')yield '3'
g = gen()
print(g)  # <generator object gen at 0x0026BBF0>
g1=next(g)   # 111111
g2=next(g)   # 222222
g3=next(g)   # 333333
g4=next(g, 'over')
print(g1,g2,g3,g4)    # 1 2 3 over

        举例

如果在生成器函数中使用return,则终止迭代,不能得到返回值。

def gen():print('111111')yield '1'print('222222')return '2'print('333333')yield '3'
g = gen()
print(g)  # <generator object gen at 0x0026BBF0>
g1=next(g)    # 111111
g2=next(g)    # 222222, 抛出异常
print(g1,g2)    #

生成器函数的使用场景:

在生成器中使用死循环,不会一直执行,仍旧是执行多少次next(),返回多少个值。

# 死循环
def fun():i = 0while True:i += 1yield i
c = fun()
print(next(c))   # 1
print(next(c))   # 2
print(next(c))   # 3
print(next(c))   # 4
print(next(c))   # 5

生成器函数中的语法糖:

语法糖:没有给计算机语言添加新功能,而只是对人类来说更“甜蜜”的语法,把复杂的代码写的一看就恍然大明白

语法糖给程序员提供了更实用的编码方式,有益于更好的编码风格,更易读;

生成器的语法糖也就是生成器的一种语法,作用是使代码更加简洁,易懂

# 普通生成器函数way1
def way1():for i in range(5):yield i# 带语法糖的生成器函数way2
def way2():yield from range(5,9)#循环输出way1
for i in way1():print(i,end=" ")  #0 1 2 3 4#循环输出way2
for j in way2():print(j,end=" ")  #5 6 7 8

关于yield举例:

def echo(n):while True:n = yield ng = echo(1)
print(next(g))
print(next(g))

yield的机制是暂停运行过程输出当前结果并保留状态,状态包括上次终止的位置和终止时的           数值。下一次next()时从上一次终止的地方开始,因为yield之后没有任何语句,yield的返回值是none,所以n=none了,所以打印结果是None

综上:使用了生成器,在调用函数的时候不会一次性生成所有的元素,而是在每次调用 next() 才生成一个元素;而一次性返回全部结果的方式,在调用函数的时候就生成了所有元素,相比之下,更耗费内存和CPU。

python 迭代器、生成器知识点总结相关推荐

  1. python迭代器生成器 学会再缩短一半开发效率 看看大牛是怎么写的

    一.迭代 什么叫做迭代? 比如在 Java 中,我们通过 List 集合的下标来遍历 List 集合中的元素,在 Python 中,给定一个 list 或 tuple,我们可以通过 for 循环来遍历 ...

  2. python 迭代器 生成器_Python迭代器和生成器

    迭代器认知 迭代器 (iterator): 如果一个对象同时有__iter__()和__next__()魔术方法的话,这个对象就可以称为是迭代器. __iter__()的作用是可以让for循环遍历.而 ...

  3. python迭代器生成器装饰器

    基本概念 学习python中有什么不懂的地方,小编这里推荐加小编的python学习群:895 817 687有任何不懂的都可以在里面交流,还有很好的视频教程pdf学习资料,大家一起学习交流! 1.容器 ...

  4. python 生成器装饰器_4.python迭代器生成器装饰器

    基本概念 1.容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中.通常这类数据结构把所有的元 ...

  5. python 迭代器 生成器_python 迭代器与生成器

    迭代器 迭代器就是iter(可迭代对象函数)返回的对象,说人话.......可迭代对象由一个个迭代器组成 可以用next()函数获取可迭代对象的数据 迭代是访问集合元素的一种方式(因为集合是无序的,所 ...

  6. python 迭代器 生成器

    1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. 1.1 使用迭代 ...

  7. python 生成器装饰器_七.python迭代器生成器装饰器

    1.迭代器 1.1 什么是可迭代对象(Iterable)? 定义:可以直接作用于for循环的对象统称为可迭代对象,即Iterable. 可迭代对象包括: 1.集合数据类型:如list.tuple.di ...

  8. python迭代器生成器使用技巧(2):切片、遍历、索引值、多序列、多容器对象

    1. 迭代器切片 迭代器和生成器不能使用标准的切片操作,因为它们的长度事先并不知道(并且也没有实现索引). 函数 islice() 返回一个可以生成指定元素的迭代器,通过遍历并丢弃直到切片开始索引位置 ...

  9. python迭代器生成器使用技巧(1):遍历、代理、生成器创建迭代、反向迭代

    1. 手动遍历迭代器 next() 遍历一个可迭代对象中的所有元素,但是却不想使用for循环.为了手动的遍历可迭代对象,使用 next() 函数并在代码中捕获 StopIteration 异常. 通常 ...

  10. python 迭代器生成器

    目录 一.可迭代对象 1.1 判断是否为可迭代对象 二.迭代器 2.1 判断对象是否是一个迭代器 2.2 手写一个迭代器 2.3 迭代器应用场景 三.生成器 3.1 生成器介绍 3.2 使用yield ...

最新文章

  1. java rest 序列化_http请求/restful/序列化反序列化/JSON
  2. MFC多语言实现方法
  3. [react] 在react中无状态组件有什么运用场景
  4. [html] 你是如何区分HTML和HTML5的?
  5. connect ECONNREFUSED 151.101.0.133:443 | spawn xxx ENOENT
  6. 台式计算机进入安全模式蓝屏,windows进入系统安全模式时蓝屏怎么办?
  7. 7.边缘检测:2D运算——Canny边缘原理、Canny边缘检测器、Canny-Matlab实战_2
  8. [原创]CAN总线数据计算器V1.01
  9. 自动化部署工具Fabric简介
  10. Python核心编程(第三版)课后习题解答——第二章
  11. 【手工儿童】}DIY冬南瓜小兔子
  12. Alarm Clock
  13. 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
  14. 一个玩游戏的失足青年,转行做游戏开发到教育的挣扎过程(3)
  15. 中国工程师如何获 Google 的工作机会?
  16. java arraylist.add(),Java ArrayList add()方法与示例
  17. jQuery悬浮菜单
  18. 功能室计算机宣言,教室布置标语(精选多篇)
  19. java加壳工具_加壳工具 - virbox加密空间站 - OSCHINA - 中文开源技术交流社区
  20. Flash鼠绘入门第六课:青翠竹子绘制过程-Flash鼠绘青翠竹子1

热门文章

  1. 怎么退出mysql_如何安全地关闭MySQL
  2. 高级网络配置:Bond网络接口、Team网络接口和网桥
  3. mysql8+新语法_MySQL8.0新特性
  4. python + selenium - selenium常用元素定位
  5. 读懂 SOLID 的「里氏替换」原则
  6. 项目的权限设计的小计
  7. Python元祖,列表,字典,集合的比较
  8. Windows 10 Build 9879 新变化(内含ISO下载)
  9. 用C语言实现面向对象的开发
  10. Oracle 密码过期问题