理解python3中的range()函数和python2中的区别

发布于 / python / 0 条评论

博主入坑python的时候,接触的就是python3,不是因为python2不好,只是因为目前越来越普及的python3已经能够替代以往python2的一些工作,并且在某些方面做的可能更好(比如在字符的格式转化上)

碰巧,今天看一个网课的时候发现了一处有争议的地方分享出来。

课程上讲到 range()的结果是一个生成器  ,但是我记得在python3中range()函数生成的对象,应该就是range(),并且我还知道生成器是内部实现了__next__()方法的对象,我们可以用next(a)函数输出生成器中的每一个元素,此时a就是生成器对象。话不多说我们代码上看:

此时能看到,在该对象中并没有实现 __next__()方法。也就是说它不是一个生成器/迭代器。它只是一个可迭代对象,因为此对象中实现了__getitem__ 和 __iter__ 方法。具体请参见这篇文章

如果你还是不能够理解,那再看下面的例子:

这里我用了一个异常捕获,如果s对象不是一个迭代器或生产器时,那么就会捕获到异常并输出指定信息。然后我利用了 iter()函数生成了一个迭代器。然后可以看到在对象a中是有__next__方法了,并且用next(a)中也能输出迭代器中的元素。


虽然经过上面的例子我能够正确理解range()生成的对象是什么了。但是这也引发了我新的思考,为什么网课上会这样说,于是我在网上搜索了一下。发现在python2中也有range()函数,并且还有名为xrange()函数。 在python2中range()其实就是一个生成器,但是在python3中去掉了以前2中的range()函数,并将2中的xrange()函数在python3中新命名为range()。

参考1:知乎:为什么python3中取消了range生成器

参考2:知乎: python3:range对象并不是迭代器

转载原创文章请注明,转载自: adaptの小站 » 理解python3中的range()函数和python2中的区别

Not Comment Found