迭代器和生成器

1.迭代器

  我们之前⼀直在⽤可迭代对象进⾏迭代操作. 那么到底什么是可迭代对象.⾸先我们先回顾⼀下⽬前我们所熟知的可迭代对象有哪些:

str, list, tuple, dict, set. 那为什么我们可以称他们为可迭代对象呢? 因为他们都遵循了可 迭代协议. 什么是可迭代协议. ⾸先我们先看⼀段错误代码:

注意看报错信息中有这样⼀句话. 'int' object is not iterable . 翻译过来就是整数类型对象 是不可迭代的. iterable表⽰可迭代的. 表⽰可迭代协议. 那么如何进⾏验证你的数据类型是否 符合可迭代协议. 我们可以通过dir函数来查看类中定义好的所有⽅法.

s = "我的哈哈哈"

print(dir(s))  # 可以打印对象中的⽅法和函数

print(dir(str))   # 也可以打印类中声明的⽅法和函数

在打印结果中,找寻这个__iter__,如果能找到,那么这个类就是可迭代对象

我们发现这⼏个可以进⾏for循环的东⻄都有__iter__函数, 包括range也有. 可以⾃⼰试⼀ 下. 综上. 我们可以确定. 如果对象中有__iter__函数. 那么我们认为这个对象遵守了可迭代协议. 就可以进⾏迭代. 这⾥的__iter__是帮助我们获取到对象的迭代器. 我们使⽤__next__()来获取 到⼀个迭代器中的元素. 那么我们之前讲的for的⼯作原理到底是什么? 继续看代码

我们可以把要迭代的内容当成⼦弹. 然后呢. 获取到迭代器__iter__(), 就把⼦弹都装在弹夹 中. 然后发射就是__next__()把每⼀个⼦弹(元素)打出来. 也就是说, for循环的时候. ⼀开始的 时候是__iter__()来获取迭代器. 后⾯每次获取元素都是通过__next__()来完成的. 当程序遇到 StopIteration将结束循环.

2.生成器

什么是⽣成器. ⽣成器实质就是迭代器.

在python中有三种⽅式来获取⽣成器:

1. 通过⽣成器函数

2. 通过各种推导式来实现⽣成器

3. 通过数据的转换也可以获取⽣成器

这里需要普及一下yield和return的区别:

1.如果函数中包含了yield, 这个函数是一个生成器函数, 执行函数的时候是:生成器

2.生成器执行__next__(),执行到下一个yield

3.yield的作用和return基本相同,但是,只负责返回生成器

4.return,结束函数

最新文章

  1. jsp页面无法识别el表达式的解决方案
  2. iOS - PackIpa App 打包
  3. windows添加虚拟网卡
  4. jfinal框架教程-学习笔记(二)
  5. 关押罪犯(noip2010)
  6. [转] 浅析HTTP协议
  7. dotnet使用Selenium执行自动化任务
  8. Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2)(A.思维题,B.思维题)
  9. pymysql.err.ProgrammingError: 1064 (Python字符串转义问题)
  10. BZOJ_1085_[SCOI2005]骑士精神_IDDFS
  11. python:数据库连接操作入门
  12. UserNotifications ios10 通知使用
  13. KVM虚拟机管理——资源调整
  14. DNSLog注入笔记
  15. AngularJS中使用$parse或$eval在运行时对Scope变量赋值
  16. C#Winform将WebBowser控件替换为Chrome内核
  17. Pyqt图标下载网站
  18. Android窗口背景的优化
  19. HDU 4716 A Computer Graphics Problem (水题)
  20. DropDownList添加客户端下拉事件操作

热门文章

  1. 获得Spring容器
  2. java内存中的对象
  3. SQL运算符
  4. attempt to write a readonly database错误的解决(C#,SQLite)
  5. Pivot
  6. C# 中 NPOI 库读写 Excel 文件的方法【摘】
  7. StreamRead和StreamWriter的使用
  8. [javaSE] 基本类型(String相关)
  9. JSTL fn:split()函数
  10. Java基础教程(17)--接口