Python迭代器和生成器
迭代器 (iterator): 如果一个对象同时有__iter__()和__next__()魔术方法的话,这个对象就可以称为是迭代器。__iter__()的作用是可以让for循环遍历。而__next__()方法是让对象可以通过 next(实例对象) 的方式访问下一个元素,通常从序列第一个元素开始访问,直到所有的元素都被访问才结束。
列表List、元组Tuple、字典Dictionary、字符串String等数据类型虽然是可迭代的,但不是迭代器,因为他们都没有next( )方法,但是可用于创建迭代器。
迭代器不需要事先准备好整个迭代过程中的所有元素。仅仅在迭代到某个元素时才计算该元素,而在这之前或之后元素可以不存在或者被销毁。因此迭代器适合遍历一些数量巨大甚至无限的序列。
创建迭代器对象
list1 = ['python', 'java', 'c', 'php']
it = iter(list1)
print(it)
C:UsersadminAppDataLocalProgramsPythonPython37python.exe C:/Users/admin/Desktop/AutoTest/Test/test/test_01/test_01.py
<list_iterator object at 0x000001DDB3A6F788>
Process finished with exit code 0
调next()方法,输出迭代器下个值
list1 = ['python', 'java', 'c', 'php']
it = iter(list1)
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))
C:UsersadminAppDataLocalProgramsPythonPython37python.exe C:/Users/admin/Desktop/AutoTest/Test/test/test_01/test_01.py
python
java
c
php
Traceback (most recent call last):
File "C:/Users/admin/Desktop/AutoTest/Test/test/test_01/test_01.py", line 12, in <module>
print(next(it))
StopIteration
Process finished with exit code 1
迭代器对象可以使用for语句进行遍历
list1 = ['python', 'java', 'c', 'php']
it = iter(list1)
print(it)
for i in it:
print(i)
"C:Program FilesPython35python.exe" C:/Users/wangli/Desktop/AutoTest/Test/test/test_02.py
<list_iterator object at 0x0000017DFA6D4518>
python
java
c
php
Process finished with exit code 0
生成器(generator),可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己的内置的__iter__方法),
所以生成器就是可迭代对象,Python使用生成器,是指在需要的时候才产生结果,而不是立即产生结果。
a.生成器就是一个迭代器
b.调用一个生成器函数,返回的是一个迭代器对象
c.只有在调用时才产生相应数据,节省内存空间
d.生成器本质和其他的数据类型一样,都是实现了迭代器协议,只不过生成器附加了一个延迟计算省内存的好处
1、生成器函数:常规函数的定义,但是,使用yield语句而不是return语句返回结果。yield语句语句一次返回一个结果,
在每个结果中间,挂起函数的状态,以便下次从它离开的地方继续执行
def test():
for i in range(0, 100):
yield i
print(test())
for i in test():
print(i)
"C:Program FilesPython35python.exe" C:/Users/wangli/Desktop/AutoTest/Test/test/test_02.py
<generator object test at 0x00000258DD61E258>
0
1
2
3
4
5
……
99
Process finished with exit code 0
2、生成器表达式:类似于列表推导,生成器返回按需产生结果的一个对象,迭代调用,而不是一次构建一个结果列表,浪费内存
it = (i*2 for i in range(0, 20))
print(it)
for i in it:
print(i)
"C:Program FilesPython35python.exe" C:/Users/wangli/Desktop/AutoTest/Test/test/test_02.py
<generator object <genexpr> at 0x000001A03F40E258>
0
2
4
6
8
10
12
14
16
18
20
22
24
26
28
30
32
34
36
38
Process finished with exit code 0
- 简单易学的机器学习算法——协同过滤推荐算法(1)
- 深入seajs源码系列三
- 并行爬虫和数据清洗工具(开源)
- 响应式web布局中iframe的自适应
- 简单易学的机器学习算法——协同过滤推荐算法(2)
- 详解ROC/AUC计算过程
- 汉字数组排序及如何检测汉字
- 简单易学的机器学习算法——主成分分析(PCA)
- 基于Xgboost + LR + Keras 建模评估用户信用状态
- canvas实现拖动页面时显示窗口视频
- 鼠标滚轮事件介绍
- Understanding delete
- objC与js通信实现--WebViewJavascriptBridge
- 简单易学的机器学习算法——岭回归(Ridge Regression)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux 中指定使用的GPU
- 未读消息(小红点),前端 与 RabbitMQ 实时消息推送实践,贼简单~
- Day13 :调整数组顺序使奇数位于偶数前面
- TensorFlow 指定GPU 日志却显示的是第0块
- bazel 出现no such package '@org_tensorflow//tensorflow' 错误
- tensorflow API——tf.random_uniform 使用
- go cannot find package "golang.org/x/crypto/ssh/terminal" 解决方案
- go 中的 defer 使用及其规则
- 数据结构算法操作试题(C++/Python/Go)——938 二叉搜索树的范围和
- Android Studio 代理配置了Gradle依旧连接超时
- Dart 中变量类型 var, Object, dynamic 区别
- C++ 中的static关键字使用场景
- Dart 中的生产模式和检查模式
- 使用mysqladmin工具统计mysql当前的T/QPS
- MixIn 理解