设为首页 加入收藏

TOP

Python迭代器详解
2023-07-26 08:18:17 】 浏览:87
Tags:Python

那底层的原理是什么样的呢?这其中涉及到了几个概念,“可迭代”,“迭代器”,“生成器”等,大部分人可能听过这些名词,但是他们具体的含义以及之间的关系可能没搞清楚,以下就是它们之间的关系图,接下来我们就来分析这个关系图。



如果一个对象是可迭代对象,那么我们就可以用for循环去遍历它,比如列表、元组、字符串等都是可迭代对象。而我们用for循环去遍历它的原理就是,先获取了它的迭代器,然后使用迭代器的next方法去逐一遍历。


注意可迭代对象与迭代器的区别,如果一个对象是可迭代对象,那么我们就肯定能调用iter()方法获取它的迭代器,而如果一个对象是迭代器,我们就能用next()方法去拿下一个元素。 我们可以用isinstance判断一个对象是不是可迭代对象,是不是迭代器。


列表本身不是迭代器,它是可迭代对象,所以你不能用next()操作列表


可迭代对象必须实现__iter__()函数,返回迭代器,调用对象自身的__iter__()函数与将iter()作用于对象效果是一样的,同理对__next__()和next()也一样。


有趣的是,迭代器也是一个可迭代的对象,所以它本身也需要实现__iter__()函数,但是,一个迭代器的迭代器,是它本身,所以可能也有些多余了。


我们经常会用到一些内置的迭代器,例如filter和map,注意range是可迭代对象,但不是迭代器。


filter函数用于对一个列表进行过滤,传入一个函数和列表,这个函数返回值是True或者False,将列表的元素逐个传入这个函数,结果为True的保留,可以使用lambda函数。


注:在Python2.x中返回值为list,在Python3.x中返回迭代器


如果我们要想通过下表访问,可以把它转换成list


map函数接收一个函数与一个列表,将这个函数作用域列表的每个元素,生成一个新的序列,返回迭代器。


我们将list做一个简单的封装,实现一个可迭代的mylist。


上述代码并没有实现迭代器带来的好处,因为我们事先传入了一个列表进去,假如这个列表很大,会占内存。假如我们要实现一个类似range()功能,我们可以使用更有效的方法。


需要注意的是,我们的myrange不能随机访问,只能一次性顺序遍历,只能前进,不能后退,实际Python的range()可以随机访问。


这个答案是No。for循环大部分情况都作用于可迭代对象,但是有一个例如,如果对象是可以通过下标访问的,也能用于for循环。


一个对象如果不能用下标访问,那么就会报下面的错误,实际上它对应的是一个__getitem__()内置方法。


如果我们实现了__getitem__(),也能通过for循环遍历。


结果如下,可以看到a既不是可迭代对象,也不是迭代器。


for循环会先看对象是不是实现了__iter__(),如果是,就用迭代器的方式,如果没有的话,就看有没有__getitem__(),都没有就报错,报的错如下:


那我们怎么知道它先去找__iter__()呢?我们在前面的代码里加上几行,


结果如下:


接下来我们看关系图的左边,生成器,生成器是迭代器,迭代器是可迭代对象,所以生成器肯定是可迭代对象了。哪些对象是生成器呢?


生成器的来源主要有两个,一个是生成器表达式,例如(i for i in 'hello, world'), (i for i in range(0,10) if i % 2 == 0),另一个是生成器函数,生成器函数不使用return返回数据,而使用yield。


我们来看一下前面说的filter是不是生成器。


它并不是一个生成器。


生成器表达式与列表推断是差不多的,但是它用"()"括起来,而列表推断用的中括号,一般的语法就是:


例如


如果我们把生成器表达式用在其他的对象上,例如set,list等,它们会自动转换成相应类型。


另外一种生成器通过生成器函数得到。


运行结果如下:


在函数myrange中,有一个特殊的关键词,yield。这个与return类似,但是return后,下次调用会从头开始,但是使用了yield,我们的函数就会返回一个生成器,相当于每次执行,都记住了上次的位置,从上次的位置继续执行。生成器表达式可以认为是一种特殊的生成器函数,类似于lambda表达式和普通函数。但是和生成器一样,生成器表达式也是返回生成器generator对象,一次只返回一个值。



】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇使用PyQt5和Qt Designer创建Pytho.. 下一篇使用PyQt5和Qt Designer创建Pytho..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目