【Python】Python中的迭代器和生成器
迭代器和生成器在很多编程语言中都会以不同形式的存在,在实际编程中经常会被用到。下面我们来了解一下什么是迭代。
1 迭代
了解Java的AIAS行者(AI行者是我B站粉丝勋章名称)应该都会知道,在Java中,可以通过List集合的下标来遍历List的元素。在Python中,对于可迭代对象,如list、tuple等,可以通过for循环遍历,也可以使用下标遍历,这种遍历一个“容器”中元素的过程,就叫做迭代。
Python中for循环比较强大,只要对象是可迭代类型就可以使用for循环进行迭代。例如:
# -*- coding: UTF-8 -*-# 1、for 循环迭代字符串, 字符串之间使用空格连接
for char in 'AIASBCYD':print(char, end=' ')print('\n')# 2、for 循环迭代 list 列表,列表元素之间使用空格连接
list1 = [i for i in range(5)] # 这里使用了列表生成表达式
for num in list1:print(num, end=' ')print('\n')# 3、for 循环迭代 dict (字典)
dict1 = {'name': '菊子皮', 'age': '26', 'sex': '男'}
# 迭代 dict 中的 key(默认是迭代key)
for key in dict1:print(key, end=' ')print('\n')
# 迭代 dict 中的 value
for value in dict1.values():print(value, end=' ')print('\n')# list 中一个元素中还有多个元素
for x, y in [(1, 'a'), (2, 'b'), (3, 'c')]:print(x, y)
结果如下:
A I A S B C Y D0 1 2 3 4name age sex菊子皮 26 男1 a
2 b
3 c
2 Python中的迭代器
在上面看到了迭代过程,迭代是Python中非常强大的功能之一。但是,啥是迭代器呢?迭代器,迭代器是一个可以记住遍历的位置的对象。它具有的特征:
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
迭代器只能往前不会后退。
迭代器有两个基本的方法:iter()
和 next()
。字符串,列表或元组对象都可用于创建迭代器,迭代器对象可以使用常规 for 语句进行遍历,也可以使用 next() 函数来遍历。for的底层实现就是使用迭代器完成的。下面,来看看几个实例:
# 1、字符创创建迭代器对象
str1 = 'AIASBCYD'
# 使用iter内建函数构建迭代器对象
iter1 = iter(str1)
# 使用next内建函数访问元素
print(next(iter1)) # 每运行一次返回一个对象
# 使用for循环遍历迭代器对象
for ele in iter1:print(ele, end=' ')print('\n------------------------')# 2、list对象创建迭代器
list1 = [i for i in range(5)]
iter2 = iter(list1)
# next() 函数遍历迭代器
while True:try:print(next(iter2))except StopIteration:break
3 Python中的生成器
在前面的内容中,可以看到使用列表生成表达式创建列表,其是一个非常简单和便捷的方式。当然,也可以使用直接创建的方式list1 = [0, 1, 2, 3, 4]
。但是,直接创建的方式会受到内存的限制。当数据量特别大的时候,将数据一次性加载到内存中显然是不合适的。这就是为什么有些小白在做机器学习的时候,一次性将几个G的数据读到内存后,电脑就崩了(电脑运存本来还不大)。而且,创建一个包含 非常多的元素的列表,不仅占用很大的存储空间,在只需要访问前面几个元素时,那后面绝大多数元素占用的空间都白白浪费了。
在Python中,使用生成器(genertor)可以构建出一种一边循环一边计算的机制。那么,这样就不必创建完整的 list,从而节省大量的空间。使用yield的函数就被称为生成器(generator)。
生成器跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,也可以理解为生成器就是一个迭代器。运行过程:在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值,在下一次执行 next()
方法时从当前位置继续运行。下面来看看几个案例。
3.1 创建生成器
最简单的方式就是使用类似于列表、元组、字典等的推导表达式构建。如:
# 需要使用()包裹
gen = (2*i for i in range(5))
# 查看生成器
print(gen)
"""
<generator object <genexpr> at 0x000001544475AF48>
"""
3.2 遍历生成器中的元素
这里就可以使用for循环的方式对迭代器进行遍历。当然也可以使用next()
方法进行遍历。
for num in gen:print(num, end=' ')print('\n------------------------')
gen = (2*i for i in range(5))
while True:try:print(next(gen), end=' ')except StopIteration:break
"""
0 2 4 6 8
------------------------
0 2 4 6 8
"""
注意:这种类型生成器返回所有元素之后,就不可再生成元素了,也就是说:只能对其迭代一次。
3.4 构建函数形式的生成器
在实际编程和开发过程中,使用多的还是以函数的形式实现生成器。从下面这个函数改进:
def fun():for i in range(5):print(i)fun()
"""
0
1
2
3
4
"""
将其改进为一个生成器。
def fun():for i in range(5):yield iprint(fun())
"""
<generator object fun at 0x0000021A3C62E948>
"""
上面的函数简单,但是没有体现出生成器的优势。生成器最好的应用应该是:如果你不想同一时间将所有计算出来的大量结果集分配到内存当中,特别是结果集里还包含循环,因为这样会耗很大的资源。例如:计算斐波那契数列的生成器:
def fib(n):a, b = 1, 1for i in range(n):yield aa, b = b, a + b# 运行
for n in fib(10000):print(n, end=' ')
程序运行过程。
可以看出,运行一个这么大的参数,也不存在有卡死的状态。因为这种方式不会使用太多的资源。
需要注意得是: generator 和函数的执行流程不一样。函数是顺序执行,遇到 return 语句或者最后一行函数语句就返回。而变成 generator 的函数后,在每次调用 next() 的时候执行,遇到 yield语句返回,再次执行时从上次返回的 yield 语句处继续执行。这有点类似于中断。从下面得例子也可以看出这种效果。
def test():print('step 1')yield('A')print('step 2')yield('B')print('step 3')yield('C')t = test()
print(next(t))
print(next(t))
print(next(t))
"""
step 1
A
step 2
B
step 3
C
"""
从上面的例子可以看出test()
已经不是一个普通函数了,而变成了一个generator,在执行过程中,遇到yield后就中断,再次调用时再继续执行。当generator所有内容执行完毕后,再执行就会报错。这时就需要进行错误捕获了。
【Python】Python中的迭代器和生成器相关推荐
- 完全理解 Python 迭代对象、迭代器、生成器(转)
完全理解 Python 迭代对象.迭代器.生成器 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators » nvie.com,俺写的这篇文章是 ...
- python:容器、迭代器、生成器 简单介绍
python:容器.迭代器.生成器 简单介绍 python提供了多种数据类型来存放数据项. 之前已经介绍了几个python中常用的容器,分别是列表list.元组tuple.字典dict和集合set. ...
- dataloader 源码_pytorch :: Dataloader中的迭代器和生成器应用
在使用pytorch训练模型,经常需要加载大量图片数据,因此pytorch提供了好用的数据加载工具Dataloader. 为了实现小批量循环读取大型数据集,在Dataloader类具体实现中,使用了迭 ...
- Python3 中打的迭代器与生成器
迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退 ...
- 掌握JavaScript中的迭代器和生成器,顺便了解一下async、await的原理
掌握JavaScript中的迭代器和生成器,顺便了解一下async.await的原理 目录 掌握JavaScript中的迭代器和生成器,顺便了解一下async.await的原理 前言 1.迭代器(It ...
- python的装饰器迭代器与生成器_详解python中的生成器、迭代器、闭包、装饰器
迭代是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 1|1可迭代对象 以直接作用于 for ...
- Python中的迭代器和生成器
Python中的迭代器是非常实用的,但是迭代器只能应用在类序列对象上,比如列表.元组和字典.除非生成迭代器的类,否则无法在非类序列对象上调用next()方法. 自己可以定义迭代器的类,只要满足: 1. ...
- python 面试生成器和迭代器_Python 中的迭代器与生成器
导读 这篇文章主要介绍了 python 当中的迭代器与生成器,在涉及到大数量的场景应该考虑使用迭代器与生成器. 原文链接: https://russellgao.cn/python-iter/ 可迭代 ...
- 完全理解Python迭代对象、迭代器、生成器
本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators,俺写的这篇文章是按照自己的理解做的参考翻译,算不上是原文的中译版本,推荐阅读原文,谢谢网 ...
最新文章
- python中完善decorator
- Vue中Web组态实现方案-WebTopo的使用
- DropBox 超实用的免费文件网络同步、备份、分享工具
- 2019.5.18-5.19 ACM-ICPC 全国邀请赛(西安)赛后总结
- js变量显示在html中_PythonDjango+JS+Ajax实现网页采集并动态显示PLC变量
- 加密算法在windows,linux下的检测办法[md5,sha1]
- C语言素数的乘积,C语言,有关素数
- 计算机word表格计算教程F9,word表格计算方法详解
- GitLab之不允许用户注册-yellowcong
- matlab中样本相关系数的计算与测试
- CentOS后门入侵检测工具
- Word中怎么用MathType编辑公式
- c语言里编译错误c131,C语言习题选择题.doc
- 程序包xxx不存在解决办法
- 时间间隔输出函数 python3
- 大数据技术之Sqoop
- Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储
- App Store审核指南中文版
- 住房公积金专办员题库(含答案)
- yaf 修改php.ini,Yaf的配置
热门文章
- 怎么选合适的运动耳机、运动耳机最新推荐攻略
- kubeadm更新证书(1.23.4版本)
- 春意盎然 酷我音乐无损音质抢先来袭
- 深入理解计算机系统(第二版)读书笔记
- 推荐几个Mac超好用软件/工具 工作效率提高300%!
- 过渡线与渐灭线的构形(机械识图)
- 双十一女友闹分手,好不容易脱单的程序员又要落单
- 连接共享打印机时,出现“操作无法完成,键入的打印机名不正确…”解决办法...
- 使用SSM实现一个简单的CRUD
- [信息采集专家]如何抓取文章内容的同时将图片也下载到本地