祝贺你,答错了。
range()返回的是一个Iterable,并非一个Iterator.
a Python 3.6.3 (default, Nov 3 2017, 14:41:25) Type 'copyright', 'credits' or 'license' for more information IPython 6.2.1 -- An enhanced Interactive Python. Type '?' for help. In [1]: a = range(10) In [2]: a Out[2]: range(0, 10) In [3]: import collections In [4]: isinstance(a, collections.Iterable) Out[4]: True In [5]: isinstance(a, collections.Iterator) Out[5]: False
道理很简朴,先简朴说一下Iterable和Iterator,不要试图比较两者有什么差别,由于两者根本就是差别的观点。两者字面意义都异常明白:Iterable就是一个可迭代的对象,对其挪用iter(Iterable)将会获得一个迭代器;而Iterator就是一个迭代器,对其挪用next(Iterator)将会获得下一个元素。
Python推重协定,说白了就是鸭子范例。你假如完成了__iter__(),(即对你挪用iter()能够获得一个Iterator)那你就是一个Iterable;假如完成了__next__()和__iter__()就是一个Iterator。
等等,Iterator不就是挪用next()获得下一个元素就能够了?为何Iterator也要完成Iterable的__iter__()要领,这不地道啊!
为何Python的Iterator要完成__iter__()呢(一般的完成都是return self)。官方文档中说的相称清晰。
Iterators are required to have an __iter__() method that returns the iterator object itself so every iterator is also iterable and may be used in most places where other iterables are accepted.
简朴翻译一下,就是说Iterator也请求完成__iter__(),由于许多处所吸收的参数是一个Iterable,假如一切的Iterator都是Iterable,那末这些用Iterable处所都能够无障碍地运用Iterator了。比如说for轮回吧,关于for轮回,我在Python的wiki中(已比较老了)找到如许的形貌:
Basically, any object with an iterable method can be used in a for loop. Even strings, despite not having an iterable method – but we’ll not get on to that here.
即,for轮回拿到一个Iterable的Iterator,然后运用这个Iterator举行迭代。假如Iterator完成了__iter__()要领,那末for轮回就能够无障碍地对Iterator举行迭代了,Neat!设想一下,Python的生成器也是Iterator,假如for轮回不能支撑对Iterator迭代,生不如死啊。
所以对Iterator就有了如许一个“太过”的请求。我们能够以为,一切的Iterator都是Iterable。那末回到最初的题目,为何range()反回的是一个Iterable而不是Iterator呢?
斟酌我们日常平凡运用range(),我们以为这是一个示意局限的一个容器。能够运用这个容器去初始化成别的容器,这没有任何题目。
>>> numbers = range(3) >>> tuple(numbers) (0, 1, 2) >>> tuple(numbers) (0, 1, 2)
倘使range()返回的是迭代器,那末上面这个看起来在一般不过的代码就有麻烦了:
>>> numbers = iter(range(3)) >>> tuple(numbers) (0, 1, 2) >>> tuple(numbers) ()
总结
Iterator是有状况的,只能遍历一次,是“消耗型”的,不能够“二次消耗”。Iterable是没有状况的(这里不太严谨,这句话临时不提是Iterator的Iterable),每一次对Iterable挪用iter()都邑获得一个新的迭代器。
以上就是python3中的range返回的是迭代器吗?的细致内容,更多请关注ki4网别的相干文章!