[快学Python3]迭代器和生成器
时间:2022-05-07
本文章向大家介绍[快学Python3]迭代器和生成器,主要内容包括生成器、实践提升题、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
迭代器
迭代是Python最强大的功能特色,是遍历访问序列元素的一种方式。
迭代器的特性是:
- 可以记住当前遍历位置
- 只能往前遍历,不能后退
- 从序列的第一个元素开始访问,直至所有元素被访问完
- 有两个基本方法: iter() 和 next()
- 字符串、列表或元组对象可以用于创建迭代器
下面看以下实例:
# -*- coding:utf-8 -*-
__author__ = '苦叶子'
import sys
if __name__ == "__main__":
seq_tuple = (1, 2, 3, 4, 5)
# 创建迭代器
seq_it = iter(seq_tuple)
# 访问打印第一个元素
print("第一个元素:%s" % next(seq_it))
# 访问打印第二个元素
print("第二个元素:%s" % next(seq_it))
# 访问打印第三个元素
print("第三个元素:%s" % next(seq_it))
# 使用for循环来遍历迭代器对象
print("nfor循环遍历迭代器对象: ")
for_it = iter(seq_tuple)
for x in for_it:
print(x, end=' ')
# 使用while结合next遍历迭代器对象
print("nnwhile & next遍历迭代器对象: ")
while_it = iter(seq_tuple)
while True:
try:
print(next(while_it))
except StopAsyncIteration:
sys.exit()
运行结果如下:
Traceback (most recent call last):
File "D:/版权/快学Python3/samples/迭代器.py", line 33, in <module>
print(next(while_it))
StopIteration
第一个元素:1
第二个元素:2
第三个元素:3
for循环遍历迭代器对象:
1 2 3 4 5
while & next遍历迭代器对象:
1
2
3
4
5
请注意上述才异常抛出,因为这里已经遍历超出了序列的边界了。
生成器
在Python中使用了yield的函数,我们称之为生成器。
与普通函数不同的是:生成器返回的是一个迭代器的函数,只能用于迭代操作,直接理解就是:生成器就是功能更强大的迭代器。
在调用生成器的过程中,每次遇到yield时,函数就会暂停并保存当前运行状态,返回yield的值,并在下一次执行next() 方法时从当前位置继续运行。
下面我们通过使用生成器来实现斐波那契数列:
# -*- coding:utf-8 -*-
__author__ = '苦叶子'
import sys
# 生成器函数
# 实现斐波那契数列
def fibonacci(n):
# 初始化变量
a, b, count = 0, 1, 0
while True:
if count > n:
return
yield a
a, b = b, a + b
count = count + 1
if __name__ == "__main__":
# 初始化生成器函数,产生一个生成器函数
f = fibonacci(10)
while True:
try:
print(next(f), end=' ')
except StopAsyncIteration:
sys.exit(0)
运行结果如下:
C:Python36python.exe D:/版权/快学Python3/samples/04/生成器.py
Traceback (most recent call last):
File "D:/版权/快学Python3/samples/04/生成器.py", line 30, in <module>
print(next(f), end=' ')
StopIteration
0 1 1 2 3 5 8 13 21 34 55
注:上述输出有异常抛出,是正常的。
实践提升题
大家可以尝试利用生成器函数去读大文件,例如10G的文件,你可以利用生成器函数,每次只读100M进行处理,处理完后再读取下一个100M,如此迭代下去。
- 自编码器是什么?有什么用?这里有一份入门指南(附代码)
- UWP基础教程 - {x:DeferLoadStrategy}
- UWP基础教程 - 重启应用
- html5打开摄像头
- UWP基础教程 - App多语言支持
- Golang实现Fibonacii的几种算法
- 【译】使用 dotnet watch 开发 ASP.NET Core 应用
- vmware安装ubuntu12.04嵌套安装xen server(实现嵌套虚拟化)
- Golang语言切片slice的线程协程安全问题
- ASP.NET Core 在 Azure 开启 HTTPS
- 算法基础:最大递减数问题(Golang实现)
- 亲身经历的痛--database/sql: Stmt的使用以及坑
- Ubuntu上通过nginx部署Django笔记
- Go学习笔记:golang交叉编译
- 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 数组属性和方法
- vue常用的修饰符有哪些?
- 在 ASP.NET WebAPI 中使用 DataAnnotations 验证数据
- CSS简笔画:纯CSS绘制一艘邮轮
- NHibernate 多对多映射的数据更新
- 使用 AngularJS 的 $resource 连接 WebAPI Controller
- CentOS7.8下编译muduo库找不到Boost库报错的解决方法
- 使用 OWIN 搭建 OAuth2 服务器
- Hive on spark下insert overwrite partition慢的优化
- 系统学习Lambda表达式
- 一文搞懂 Flink Kafka Consumer 类两阶段提交
- 在 Nowin 下运行 ASP.NET 5 Beta 2
- Bytom侧链Vapor源码浅析-节点出块过程
- Kubernetes Pod OOM 排查日记
- Netty之旅:你想要的NIO知识点,这里都有!
- (数据科学学习手札92)利用query()与eval()优化pandas代码