没有合适的资源?快使用搜索试试~ 我知道了~
五分钟带你搞懂python 迭代器与生成器
5星 · 超过95%的资源 7 下载量 49 浏览量
2020-12-17
02:12:34
上传
评论
收藏 103KB PDF 举报
温馨提示
试读
5页
前言 大家周末好,今天给大家带来的是Python当中生成器和迭代器的使用。 我当初第一次学到迭代器和生成器的时候,并没有太在意,只是觉得这是一种新的获取数据的方法。对于获取数据的方法而言,我们会一种就足够了。但是在我后来Python的使用以及TensorFlow等学习使用当中,我发现很多地方都用到了迭代器和生成器,或者是直接使用,或者是借鉴了思路。今天就让我们仔细来看看,它们到底是怎么回事。 迭代器 我们先从迭代器开始入手,迭代器并不是Python独有的概念,在C++和Java当中都有iterator的概念,两者的使用也都差不多。迭代器主要解决了一个问题,在一个复杂场景下,获取数据怎么尽可
资源推荐
资源详情
资源评论
五分钟带你搞懂五分钟带你搞懂python 迭代器与生成器迭代器与生成器
前言前言
大家周末好,今天给大家带来的是Python当中生成器和迭代器的使用。
我当初第一次学到迭代器和生成器的时候,并没有太在意,只是觉得这是一种新的获取数据的方法。对于获取数据的方法而
言,我们会一种就足够了。但是在我后来Python的使用以及TensorFlow等学习使用当中,我发现很多地方都用到了迭代器和
生成器,或者是直接使用,或者是借鉴了思路。今天就让我们仔细来看看,它们到底是怎么回事。
迭代器迭代器
我们先从迭代器开始入手,迭代器并不是Python独有的概念,在C++和Java当中都有iterator的概念,两者的使用也都差不
多。迭代器主要解决了一个问题,在一个复杂场景下,获取数据怎么尽可能简便。
我们来假设一个场景,假设我们从某个数据源获取了一批数据。然后我们需要调用前一万条生成一个结果,得到结果之后,我
们要将剩下的数据交给另一个调用方去处理。这个过程看起来非常平常,但是隐藏了两个问题,第一个问题是如果我们能保证
第一次处理的时候,每次都是使用一万条还好说,如果我们使用的条数是一个动态的值呢?显然,我们需要一个变量来记录我
们究竟用了多少条数据,和这批数据的状态。其次,如果这个数据量很大会存在一个数据传输的问题。我们每次都要将一大批
数据传来传去,显然会消耗很多资源。
还有一个场景是如果我们开发的是一个比较复杂的数据结构,比如一棵多叉树,下游想要遍历它的时候,必须要了解它的实现
原理才行。这显然也不太友好。
迭代器的出现正是针对以上这些问题,它的含义也很简单,有点像是我们遍历链表的时候用到的cur的指针。永远指向当前的
位置,永远知道下一个位置在哪里。
容器迭代器容器迭代器
我们先从简单的元素迭代器开始了解它的用途,我们都知道Python当中经典的几个容器:list, tuple和dict。它们都是一个可迭代
对象,我们可以直接使用关键字iter获取一个对应的迭代器。
我们来看一个例子:
arr = [1, 3, 4, 5, 9]
it = iter(arr)
print(next(it))
print(next(it))
这是一个非常经典的例子,我们首先定义了一个数组,然后通过iter关键字获取了一个读取它的迭代器。有了迭代器之后我们
可以通过next关键字获取迭代器当中的下一个元素,我们一共调用了两次next,第一次输出的结果是1,第二次的结果是3。和
我们刚才说的一样,我们每一次调用,它会自动往后移动一格,获取后面一位的数据。
这里有一点需要注意,因为我们创建的数组当中一共只有5个元素,如果我们调用it的次数超过5次,那么会引发超界,Python
的解释器会抛出StopIterat****ion的error。
除了使用next,我们也可以使用for循环来迭代它:
for i in it:
print(i)
这种用法就和我们用for循环遍历元素是一样的。
自定义迭代器自定义迭代器
官方的迭代器的用法就这么多,这也不是它的主要用法,它最主要的用法是我们自己创建迭代器。和之前介绍Python自定义
排序的时候的思路一样,我们为类添加上__iter__方法和__next__方法即可。
其中__iter__方法用来初始化并返回迭代器,关于它的解释比较复杂。在Python当中迭代有两个概念一个是iterable,一个
是iterator。协议规定iteratble的__iter__方法会返回一个iterator。而iterator本身也是一个iterable对象,自然也需要实现__iter__
方法。
我知道这么说可能听不太明白,我举个例子,比如说员工和老板,员工没有审批权限,只能转达给老板。我们把员工比喻成
iterable对象,老板比喻成iterator。
员工面临一个问题的时候没有权限处理,只能找来老板决定。也就是最终决定的是老板,但如果是老板自己发现的问题,他完
全可以自己就解决了,不需要再去找其他人。所以说我们用iter调用iterable对象的__iter__的时候,会得到一个iterator,也就是
调用员工返回老板,然后通过调用iterator的__next__来进行迭代。
weixin_38748263
- 粉丝: 6
- 资源: 894
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页