[快学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,如此迭代下去。
- GraphQL 浅谈,从理解 Graph 开始
- 分布式系统CAP理论
- 美媒盘点2018年将改变世界的四大技术趋势
- 如果你想深刻理解ASP.NET Core请求处理管道,可以试着写一个自定义的Server
- 路面能发电,智慧交通不遥远
- 小程序:企鹅帝国身后,微信帝国正悄悄露出冰山一角!
- ASP.NET MVC路由扩展:路由映射
- 如何改善遗留的代码库
- ASP.NET的路由系统:根据路由规则生成URL
- ASP.NET Core 1.0中实现文件上传的两种方式(提交表单和采用AJAX)
- 通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(1)
- 工业X.0将至 企业数字化转型该怎么做?
- 通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(2)
- 通过3个Hello World应用来了解ASP.NET 5应用是如何运行的(3)
- 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 数组属性和方法
- 总结 | DataFrame、Series、array、tensor的创建及相互转化
- 这就是你日日夜夜想要的docker!!!---------Harbor私有仓库
- Go by Example 中文版: 写文件
- PWN:House Of Force
- Windwos10下使用VS2017搭建cocos2d-x 4.0开发环境
- JavaScript 中的函数式编程:函数,组合和柯里化
- 如何设置一个生产级别的高可用etcd集群
- NVIDIA Jetson nano可以处理4K相机吗?来验证编码性能吧(中)
- House Of Lore原理学习
- 使用 rush 进行命令并行处理
- 老生常谈 Spring Aop 日志收集与处理做的工具包,贼好用?
- Kaggle金牌得主的Python数据挖掘框架,机器学习基本流程都讲清楚了
- Go by Example 中文版: 行过滤器
- Elasticsearch重要知识点 | 选举流程详解
- 妹妹问我:Dubbo集群容错负载均衡