迭代器

什么是迭代器
  • 迭代是Python最强大的功能之一,是访问序列中元素的一种方式。
  • 迭代器是一个可以记住遍历的位置的对象。
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
  • 迭代器有两个基本的方法:iter() 和 next()。
可迭代对象
  • 字符串、列表、元组对象等都是可迭代对象
  • 字符串、列表、元组对象等都可以创建迭代器

也就是说:

字符串、列表、元组对象等暂时不是迭代器,暂时不能被迭代。但是,它们成为迭代器之后就可以被迭代了,如for循环。

利用可迭代对象Iterable创建迭代器Iterator
l=[1,2,3,4]     #l:可迭代对象
i=iter(l) #i:迭代器
print(next(i)) #输出1
print(next(i)) #输出2
print(i.__next__()) #输出3

解释:

  • iter()函数可以将可迭代对象创建为迭代器
  • 利用next函数可以得到下一个元素值
  • 迭代器能够记住遍历的位置,所以可以依次调用next()
  • 可迭代对象:Iterable
  • 迭代器:Iterator
  • 可迭代对象不能被迭代,不能调用next()。成为迭代器之后才可以。

注意:

遍历完毕后,若再次调用next()函数,则会抛出异常:StopIteration,处理此异常即可。

处理StopIteration异常
try:
l=[1,2]
i=iter(l)
print(next(i)) #输出1
print(next(i)) #输出2
print(next(i)) #抛出异常
except StopIteration as stopIteration:
print("遍历完成")
刨析for循环

for循环实现了序列的遍历,那它怎么实现的呢?

for循环做的三件事:

  1. 创建迭代器
  2. 调用next方法
  3. 处理StopIteration异常

模拟for循环:

a=[100,200,300,400,500]
j=None
i=iter(a) #1.创建迭代器
while(True):
try:
j=next(i) #2.调用next方法
except StopIteration as stopIteration: #3.处理StopIteration异常
break
print(j)

结果:

100
200
300
400
500

生成器

什么是生成器?
  • 生成器是一种特殊的迭代器。
  • 普通的迭代器将所有数据存放在内存中,极其占用内存空间。
  • 生成器不将数据存入内存,而是通过计算得到数据
生成式生成器
a=(x*x for x in range(4))
print(next(a)) #输出0
print("---------------------")
for i in a: #输出1、4、9
print(i)

解释:

  • 生成式生成器的语法与列表生成式相似,但用小括号( )包裹。列表生成式用[ ]包裹。
  • 数据不会存放在内存中,每一个调用next函数,就会计算一次数据。
  • 使用生成器的好处是:节约内存空间。
函数生成器
  • 函数生成器使用关键字yield来产生数据。
  • 通过next()来得到yield产生的数据
def get():
yield 1
yield 2
g=get()
print(next(g)) #输出1
print(next(g)) #输出2

解释:

  • 依次产生1和2,第三次调用next()则报错
  • 运行yield语句后,python立即设置断点,停止运行此函数,等待下一次调用next()
  • 每次运行,将从上一次的断点处(即上一个yield后)开始运行。
函数生成器-send
  • 通过send函数得到下一个值
  • send函数还可以传入一个值,这个值将被yield接收到
def func():
count1 = yield 1
print("count1=" , count1)
count2 = yield 2
print("count2=" , count2)
yield 3
g = func()
print(g.send(None))
print(g.send(2))

结果:

1
count1= 2
2

解释:

  • count1 = yield 1是赋值语句,先执行等号右边。
  • 运行yield语句后,暂停运行此函数,所以第一次并没有接收值。所以第一次通过send得到值需要用send(None)。
  • 此处的知识可以运用到协程上。

应用-斐波那契序列

可以得到无限多个斐波那契序列中的元素:

def fib():
a=1
b=1
yield a
yield b
while(True):
yield a+b
temp=a+b
a=b
b=temp
f = fib()
for i in range(10):
print(next(f),end=" ")

结果:

1 1 2 3 5 8 13 21 34 55

08-Python迭代器与生成器的更多相关文章

  1. Python 迭代器和生成器(转)

    Python 迭代器和生成器 在Python中,很多对象都是可以通过for语句来直接遍历的,例如list.string.dict等等,这些对象都可以被称为可迭代对象.至于说哪些对象是可以被迭代访问的, ...

  2. 一文搞懂Python迭代器和生成器

    很多童鞋搞不懂python迭代器和生成器到底是什么?它们之间又有什么样的关系? 这篇文章就是要用最简单的方式让你理解Python迭代器和生成器! 1.迭代器和迭代过程 维基百科解释道: 在Python ...

  3. Python - 迭代器与生成器 - 第十三天

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

  4. 怎么理解Python迭代器与生成器?

    怎么理解Python迭代器与生成器?在Python中,使用for ... in ... 可以对list.tuple.set和dict数据类型进行迭代,可以把所有数据都过滤出来.如下:         ...

  5. Python迭代器,生成器--精华中的精华

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

  6. python迭代器与生成器详解

    迭代器与生成器 迭代器(iterator)与生成器(generator)是 Python 中比较常用又很容易混淆的两个概念,今天就把它们梳理一遍,并举一些常用的例子. for 语句与可迭代对象(ite ...

  7. Python—迭代器与生成器

    迭代器与生成器 生成器(generator) 先来了解一下列表生成器: list = [i*2 for i in range(10)] print(list)>>>>[0, 2 ...

  8. python -迭代器与生成器 以及 iterable(可迭代对象)、yield语句

    我刚开始学习编程没多久,对于很多知识还完全不知道,而有些知道的也是一知半解,我想把学习到的知识记录下来,一是弥补记忆力差的毛病,二也是为了待以后知识能进一步理解透彻时再回来做一个补充. 参考链接: 完 ...

  9. python迭代器,生成器

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

  10. Python迭代器和生成器你学会了吗?

    在了解什么是迭代器和生成器之前,我们先来了解一下容器的概念.对于一切皆对象来说,容器就是对象的集合.例如列表.元祖.字典等等都是容器.对于容器,你可以很直观地想象成多个元素在一起的单元:而不同容器的区 ...

随机推荐

  1. MSBuild 输出日志可视化工具 MSBuild Structured Log Viewer 简介

    感谢 Vatsan Madhavan 小伙伴推荐的 MSBuild 输出日志可视化工具,这个工具可以使用漂亮的 WPF 界面预览 MSBuild 复杂的输出内容 这是一个完全开源的工具,请看 Kiri ...

  2. R4_Elasticsearch Mapping parameters

    Elasticsearch的Mapping,定义了索引的结构,类似于关系型数据库的Schema. Mapping Type:每个索引都拥有唯一的 mapping type,用来决定文档将如何被索引.从 ...

  3. git安装和git命令:全局设置用户名邮箱配置

    在网上下载并安装git:https://git-scm.com/downloads在开始菜单里面找到 "Git --> Git Bash",如下 运行Git Bash: 如果 ...

  4. C语言:实现数组的删除和增加

    /*      删除方法:     如:12  32  56  84  95     用覆盖的方法     若删除第三个,则第四个要覆盖第三个,第五个要覆盖第四个     覆盖完:12  32  84 ...

  5. 【Azure Developer】如何通过Azure Portal快速获取到对应操作的API并转换为Python代码

    问题描述 对于Azure资源进行配置操作,门户上可以正常操作.但是想通过Python代码实现,这样可以批量处理.那么在没有SDK的情况下,是否有快速办法呢? 问题解答 当然可以,Azure Porta ...

  6. AIRIOT大学计划暑期训练营圆满结束,产教融合培养物联网产业人才

    ​ 为促进物联网产业的纵深发展和创新,推进教育链.产业链与创新链的有机衔接,提高学生理论.实践和创新能力,7月3日-7月28日,由航天科技控股集团股份有限公司(简称"航天科技")开 ...

  7. vue-router单页面应用的多标签页使用问题

    正常的思维 做多vue页面应用,我们的第一反应是配置多个入口点,多个vue应用,编译成多个HTML文件,由服务器来决定路由.这是正常的思维. 但谁知道单页面应用也能做到类似的效果呢.单页面不过是服务器 ...

  8. 【C#】预处理指令的学习 条件编译

    预处理指令,我的理解是,编译器在编译过程中所做的指令,能根据用户定义的条件选择性的编译代码. 比如在debug下要打印些信息,然而release之后,不能出现debug的信息,这个时候就能用预处理指令 ...

  9. Android 11(R) MultiMedia(十五)MediaCodec同步模式实现一个简易播放器

    这一节是实践,学习android原生SimplePlayer并自己码一遍,果然学到很多. MyPlayer.h #include <media/stagefright/foundation/AH ...

  10. Rainbond 携手 TOPIAM 打造企业级云原生身份管控新体验

    TOPIAM 企业数字身份管控平台, 是一个开源的IDaas/IAM平台.用于管理账号.权限.身份认证.应用访问,帮助整合部署在本地或云端的内部办公系统.业务系统及三方 SaaS 系统的所有身份,实现 ...