迭代器

迭代就类似于循环,每次重复的过程被称为迭代的过程,每次迭代的结果将被用来作为下一次迭代的初始值,提供迭代方法的容器被称为迭代器。

常见的迭代器有 (列表、元祖、字典、字符串、文件 等),通常我们是使用for语句完成迭代

  1. #使用for 迭代字典的例子:>>> links = {"鱼C工作室":"http://www.fishc.com/",
  2. "鱼C论坛":"http://bbc.fishc.com"}
  3. >>> for each in links:
  4. print("%s-->%s" %(each,links[each]));
  5.  
  6. C论坛-->http://bbc.fishc.com
  7. C工作室-->http://www.fishc.com/
  8. >>>

Python自己提供了两个BIF函数  iter() ,   next()  

  对于一个对象使用iter()函数就得到它的迭代器对象

  调用next()迭代器就会返回下一个值

  迭代结束的标识:Python抛出一个StopIteration异常.

  1. >>> string = "
  2. >>> it = iter(string)
  3. >>> next(it)
  4. '
  5. >>> next(it)
  6. '
  7. >>> next(it)
  8. '
  9. >>> next(it)
  10. Traceback (most recent call last):
  11. File "<pyshell#24>", line 1, in <module>
  12. next(it)
  13. StopIteration
  14. >>>

iter()对应的魔法方法是__iter__(), next()对应的魔法方法是__next__()

__iter__() 实际上是 return self, next()决定了迭代器的规则

  1. >>> class Fibs:
  2. def __init__(self,n=10):
  3. self.a = 0
  4. self.b = 1
  5. self.n = n
  6.  
  7. def __iter__(self):
  8. return self
  9.  
  10. def __next__(self):
  11. self.a,self.b = self.b,self.a+self.b
  12. if self.a>self.n:
  13. raise StopIteration
  14. return self.a
  15.  
  16. >>> fibs = Fibs()
  17. >>> for each in fibs:
  18. print(each)
  19.  
  20. 1
  21. 1
  22. 2
  23. 3
  24. 5
  25. 8
  26. >>> fibs = Fibs(100)
  27. >>> for each in fibs:
  28. print(each)
  29.  
  30. 1
  31. 1
  32. 2
  33. 3
  34. 5
  35. 8
  36. 13
  37. 21
  38. 34
  39. 55
  40. 89
  41. >>>

 生成器

一旦一个函数中有 yield,它就是生成器 , yield相当于return,函数遇到yield就会返回yield后面的值,函数处于暂停状态

生成器是一个特殊的迭代器

协同程序:可以运行的独立函数调用,函数可以暂停或者挂起,并在需要的时候从程序离开的地方继续或者重新开始.

  1. >>> def MyGen():
  2. print ("生成器被执行!")
  3. yield 1
  4. yield 2
  5.  
  6. >>> myG = MyGen()
  7. >>> next(myG)
  8. 生成器被执行!
  9. 1
  10. >>> next(myG)
  11. 2
  12. >>> next(myG)
  13. Traceback (most recent call last):
  14. File "<pyshell#69>", line 1, in <module>
  15. next(myG)
  16. StopIteration
  17. >>>

生成器推导式的应用.

  1. >>> #列表推导式
  2. >>> # 在列表中加一个for语句
  3. >>> a = [i for i in range(50) if not (i%2) and i%3]
  4. >>> a
  5. [2, 4, 8, 10, 14, 16, 20, 22, 26, 28, 32, 34, 38, 40, 44, 46]
  6. >>>
  7. >>> #字典推导式
  8. >>> b = {i:i%2==0 for i in range(10)}
  9. >>> b
  10. {0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False}
  11. >>>
  12. >>> # 集合推导式
  13. >>> c = {i for i in [1,2,3,2,4,2,4,6,4,7]}
  14. >>> c
  15. {1, 2, 3, 4, 6, 7}
  16. >>> #元组
  17. >>> e = (i for i in range(10))
  18. >>> e
  19. <generator object <genexpr> at 0x02113030>
  20. >>> # 这里的e就是生成器 推导式
  21. >>> next(e)
  22. 0
  23. >>> for each in e:
  24. print(each)
  25.  
  26. 1
  27. 2
  28. 3
  29. 4
  30. 5
  31. 6
  32. 7
  33. 8
  34. 9
  35. >>> # 生成器推导式作为函数的参数时,不用加括号
  36. >>> sum(i for i in range(100) if i%2)
  37. 2500
  38. >>>

扩展阅读:解释 yield 和 Generators(生成器)

Python学习笔记010_迭代器_生成器的更多相关文章

  1. python学习笔记四 迭代器,生成器,装饰器(基础篇)

    迭代器 __iter__方法返回一个迭代器,它是具有__next__方法的对象.在调用__next__方法时,迭代器会返回它的下一个值,若__next__方法调用迭代器 没有值返回,就会引发一个Sto ...

  2. python学习笔记之迭代器和函数(第三天)

    一.collection系列: 1.counter计数器 如果counter(dict)是对字典的一个补充,如果counter(list)则是对列表的补充,初步测试对字典的值进行排序. ####### ...

  3. python学习笔记(5)--迭代器,生成器,装饰器,常用模块,序列化

    生成器 在Python中,一边循环一边计算的机制,称为生成器:generator. 如: >>> g = (x * x for xin range(10)) >>> ...

  4. python 3.x 学习笔记6 ( 迭代器 and 生成器 )

    1.迭代器(Iterator):   可以被next()函数调用并不断返回下一个值的对象,成为迭代器:Iterator  可以直接用于for 循环的对象统称为可迭代对象:Iterable 迭代,顾名思 ...

  5. Python学习之路——迭代器、生成器、算法基础、正则

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

  6. Python学习(三):迭代器、生成器、装饰器、递归、算法、正则

    1.迭代器 迭代器是访问集合的一种方式,迭代对象从集合的第一个元素开始访问,直到元素被访问结束,迭代器只能往前不能后退,最大的优点是不要求事先准备好整个迭代过程中的元素,这个特点使得它特别适合用于遍历 ...

  7. python3学习笔记10(迭代器和生成器)

    参考http://www.runoob.com/python3/python3-iterator-generator.html 迭代器 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束 ...

  8. Python学习笔记014——迭代器 Iterator

    1 迭代器的定义 凡是能被next()函数调用并不断返回一个值的对象均称之为迭代器(Iterator) 2 迭代器的说明 Python中的Iterator对象表示的是一个数据流,被函数next()函数 ...

  9. Python学习笔记:迭代器(Iterator)详解

    一.可迭代的对象(Iterable) 1.定义:可以直接用在循环的数据类型,如list,tuple,dict,set,str,还有generator(生成器), 和带yield的函数,这些直接可以用在 ...

随机推荐

  1. java源文件中是否必须要有一个public类?

    java源文件中不必有一个public类,如果没有public类的话,那么文件名可以是任意合法名称,且编译完成之后如果该源文件中有多个独立的类,则会生成多个对应的.class文件.

  2. AT24C02使用详解

    ---恢复内容开始--- 这篇文章是写给一个学弟看的,关于IIC,关于24C02的单字节写入\读取..页写入和读取,,学弟总是害怕协议,,,我总是对人家说,本来就这样的,协议就是人家这样规定的,,,如 ...

  3. 运维开发工程师 面试题 shell编程

    1. 32位随机密码生成 cat /proc/sys/kernel/random/uuid | tr -d '-' 2.查看当前系统每个ip的tcp连接数 -n 强制显示IP地址 -t 显示TCP连接 ...

  4. Redis笔记——技术点汇总

    目录 · 特点 · 安装 · 数据库 · 服务器命令 · 数据类型及其操作命令 · 数据结构 · string · list · set · hash · zset · 发布与订阅 · 排序 · 事务 ...

  5. Git初学二(SSH免密)

    在管理Git项目上,初学者使用HTTPS直接克隆项目到本地是最方便的.但是之后的fetch和push代码需要输入账号和密码也是比较烦的. 这章在上一章的基础上,将HTTPS切换成SSH.SSH的优点就 ...

  6. 【JBoss】Linux下JBoss服务器"Too many open files"的解决方法

    linux中,每个socket连接都使用文件描述符进行标识,文件描述符属于系统资源,存在使用上的限制:缺省情况下JBoss能使用的最大描述符数是系统默认的最大文件描述符数(通过命令ulimit -H ...

  7. $MarkDown$ 中使用$ \LaTeX$ 数学式

    最近看了些机器学习的书籍, 想写点笔记记录下. 由于需要使用到很多的数学推导, 所以就看了下如何在 Markdown 中插入数学式,发现在 Markdown 中可以直接插入 LaTeX 数学式. 排版 ...

  8. Java自定义注解及使用

    本文通过一个简单的例子展示注解的工作原理. 1.声明注解类型 @Target(value = ElementType.METHOD) //声明该注解的运行目标: 方法 @Retention(value ...

  9. InvalidateRect和UpdateWindow

    The UpdateWindow function updates the client area of the specified window by sending a WM_PAINT mess ...

  10. Form表单提交,Ajax请求,$http请求的区别

    做过前端同学想必都避免不了要和后台server打交道.而以下这三种与后台交互的方式想必大家都不陌生. Form表单提交,Ajax请求,Angular的$http请求 以前一直搞不清楚什么时候应该用哪种 ...