一 迭代器

一 迭代的概念

#迭代器即迭代的工具,那什么是迭代呢?#迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值
while True: #只是单纯地重复,因而不是迭代print('===>') l=[1,2,3]
count=0
while count < len(l): #迭代print(l[count])count+=1

二 为何要有迭代器?什么是可迭代对象?什么是迭代器对象?

 1 #1、为何要有迭代器?
 2 对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器
 3
 4 #2、什么是可迭代对象?
 5 可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__,如下
 6 'hello'.__iter__
 7 (1,2,3).__iter__
 8 [1,2,3].__iter__
 9 {'a':1}.__iter__
10 {'a','b'}.__iter__
11 open('a.txt').__iter__
12
13 #3、什么是迭代器对象?
14 可迭代对象执行obj.__iter__()得到的结果就是迭代器对象
15 而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象
16
17 文件类型是迭代器对象
18 open('a.txt').__iter__()
19 open('a.txt').__next__()
20
21
22 #4、注意:
23 迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象

三 迭代器对象的使用

 1 dic={'a':1,'b':2,'c':3}
 2 iter_dic=dic.__iter__() #得到迭代器对象,迭代器对象即有__iter__又有__next__,但是:迭代器.__iter__()得到的仍然是迭代器本身
 3 iter_dic.__iter__() is iter_dic #True
 4
 5 print(iter_dic.__next__()) #等同于next(iter_dic)
 6 print(iter_dic.__next__()) #等同于next(iter_dic)
 7 print(iter_dic.__next__()) #等同于next(iter_dic)
 8 # print(iter_dic.__next__()) #抛出异常StopIteration,或者说结束标志
 9
10 #有了迭代器,我们就可以不依赖索引迭代取值了
11 iter_dic=dic.__iter__()
12 while 1:
13     try:
14         k=next(iter_dic)
15         print(dic[k])
16     except StopIteration:
17         break
18
19 #这么写太丑陋了,需要我们自己捕捉异常,控制next,python这么牛逼,能不能帮我解决呢?能,请看for循环

四 for循环

#基于for循环,我们可以完全不再依赖索引去取值了
dic={'a':1,'b':2,'c':3}
for k in dic:print(dic[k])#for循环的工作原理
#1:执行in后对象的dic.__iter__()方法,得到一个迭代器对象iter_dic
#2: 执行next(iter_dic),将得到的值赋值给k,然后执行循环体代码
#3: 重复过程2,直到捕捉到异常StopIteration,结束循环

五 迭代器的优缺点

#优点:- 提供一种统一的、不依赖于索引的迭代方式- 惰性计算,节省内存
#缺点:- 无法获取长度(只有在next完毕才知道到底有几个值)- 一次性的,只能往后走,不能往前退

二 生成器

一 什么是生成器

#只要函数内部包含有yield关键字,那么函数名()的到的结果就是生成器,并且不会执行函数内部代码def func():print('====>first')yield 1print('====>second')yield 2print('====>third')yield 3print('====>end')g=func()
print(g) #<generator object func at 0x0000000002184360> 

二 生成器就是迭代器

g.__iter__
g.__next__
#2、所以生成器就是迭代器,因此可以这么取值
res=next(g)
print(res)

转载于:https://www.cnblogs.com/fu-yong/p/8178532.html

函数 (四) 迭代器和生成器相关推荐

  1. python函数知识四 迭代器、生成器

    15.迭代器:工具 1.可迭代对象: ​ 官方声明,只要具有__iter__方法的就是可迭代对象 list,dict,str,set,tuple -- 可迭代对象,使用灵活 #方法一: list.__ ...

  2. 函数、迭代器、生成器、装饰器

    函数 函数基础 一.为什么要使用函数 把重复的代码提取出来,节省代码量 二.函数分类 内置函数,如len(),sun() 自定义函数 三.如何定义函数 def 函数名(参数1,参数2,参数3,...) ...

  3. Python开发——函数【迭代器、生成器、三元表达式、列表解析】

    递归和迭代 小明问路篇解释说明 递归:小明-->小红-->小于-->小东:小东-->小于-->小红-->小明 小明向小红问路,因小红不知道,所以向小于问路,因小于不 ...

  4. python魔法函数和装饰器_python魔法方法、构造函数、序列与映射、迭代器、生成器...

    在Python中,所有以__双下划线包起来的方法,都统称为"魔术方法".比如我们接触最多的__init__,魔法方法也就是具有特殊功能的方法. 构造函数 构造函数不同于普通方法,将 ...

  5. python 可迭代对象_Python3学习笔记(十四):可迭代对象、迭代器和生成器

    记得在刚开始学Python的时候,看到可迭代对象(iterable).迭代器(iterator)和生成器(generator)这三个名词时,完全懵逼了,根本就不知道是啥意识.现在以自己的理解来详解下这 ...

  6. 五分钟学会python函数_五分钟带你搞懂python 迭代器与生成器

    前言 大家周末好,今天给大家带来的是Python当中生成器和迭代器的使用. 我当初第一次学到迭代器和生成器的时候,并没有太在意,只是觉得这是一种新的获取数据的方法.对于获取数据的方法而言,我们会一种就 ...

  7. python学习笔记分享(二十四)python学习笔记分期补充(二)复数,randint与sample,进制转换表,转义字符,二维数组,键,end,pass,迭代器和生成器

    一:复数 Python支持复数,复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型. complex(x) 将x转换到一个复数,实数部 ...

  8. python 如何判断一个函数执行完成_Python核心编程的四大神兽迭代器、生成器 、闭包以及装饰器...

    本文将主要分为4大部分,分别介绍Python核心编程中的迭代器.生成器 .闭包以及装饰器. 生成器 生成器是生成一个值的特殊函数,它具有这样的特点:第一次执行该函数时,先从头按顺序执行,在碰到yiel ...

  9. python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)

    1.1迭代器 什么是迭代器: 迭代器是一个可以记住遍历的位置对象 迭代器对象从集合的第一个元素元素开始访问,直到所有元素被访问完结束,迭代器只能往前不会后退. 迭代器有两个基本方法:iter ,nex ...

  10. python四大器_Python编程四大神兽:迭代器、生成器、闭包和装饰器

    生成器 生成器是生成一个值的特殊函数,它具有这样一个特点:第一次执行该函数时,先从头按顺序执行,在碰到yield关键字时该函数会暂停执行该函数后续的代码,并且返回一个值:在下一次调用该函数执行时,程序 ...

最新文章

  1. javascript:document的属性和方法,title,innerHTML,
  2. 刷新存储器的容量单位是什么_存储系统 半导体存储器
  3. Linux内核调试技术——kprobe使用与实现
  4. linux命令(常用)
  5. Debug a Server–Side Rendered SAP Spartacus Storefront Using Chrome Dev Tools
  6. bat 调用class文件_【Java视频教程】day42-??什么是Class???
  7. docker--删除container和image
  8. Java 中 final 内存语义
  9. ST7200.11固件门DIY全程记录[2009-05-03修复成功!]
  10. python说句心里话a_python第一周作业
  11. 修改HOST文件屏蔽网站
  12. 冉宝的每日一题-8月16日回溯法+ 动态规划压缩
  13. Linux 文件后面带星号
  14. CTE递归 MAXRECURSION 遇到的问题
  15. Linux监控平台介绍
  16. 原本 1.3绿色版-扫描仪/相机/手机拍摄照片变清晰软件
  17. kindle paperwhite 使用体验
  18. NEW RDSP MODE I
  19. 方块填数 “数独”是当下炙手可热的智力游戏。一般认为它的起源是“拉丁方块”,是大数学家欧拉于1783年发明的。 如图[1.jpg]所示:6x6的小格被分为6个部分(图中用不同的颜色区分),每个部
  20. Android PackageManagerService分析一:PMS的启动

热门文章

  1. 自定义实现moveable button
  2. MSN和QQ文件传输速度解析
  3. dvd管理器java,简单DVD管理-java练习题
  4. python把英语句子成分字母_句子成分的表达字母
  5. matlab求最短路径代码_【高等数学】复数,通往真理的最短路径
  6. 球球大作战测试服android版,球球大作战10.0体验服
  7. php 输出读取结果集,php获取数据库结果集实例详解
  8. mysql 表单属性_php表单常用属性有什么?
  9. 思考产品架构的4个视角:业务、场景、数据/功能、实现
  10. linux日志自动按天保存,linux实现按天生成日志文件并自动清理