0
点赞
收藏
分享

微信扫一扫

4. Python中的迭代器

大沈投资笔记 2022-02-20 阅读 94

《Python编程的术与道:Python语言进阶》视频课程
《Python编程的术与道:Python语言进阶》视频课程链接:https://edu.csdn.net/course/detail/28618

迭代器 (Iterator)

迭代器指的是迭代取值的工具,迭代是指一个重复的过程,每一次重复都是基于上一次结果而来。迭代提供了一种通用的不依赖索引的迭代取值方式。

迭代器是一个可以记住迭代位置的对象。

迭代器从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter()next()

在这里插入图片描述

容器 (container): 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。

可迭代对象(iterable): 凡是可以(通过iter()函数)返回一个迭代器的对象都可称之为可迭代对象。内置有__iter__方法。

迭代器(iterator): 迭代器是一个带状态的对象,能调用next()方法的时候返回容器中的下一个值。任何实现了__iter____next__方法的对象都是迭代器,__iter__返回迭代器自身,__next__返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常。

可迭代对象

凡内置有__iter__方法的对象,都称为可迭代对象,例如:str,list,tuple,dict,set,文件对象

nums = [7,8,9,5]
for i in nums:
    print(i)
7
8
9
5
it = iter(nums)
print(it)
print(it.__next__())
print(it.__next__())
<list_iterator object at 0x0000023EB555B108>
7
8
print(next(it))
9

在这里插入图片描述

迭代器对象

1. 既内置有__next__方法的对象,执行该方法可以不依赖索引取值

2.又内置有__iter__方法的对象,执行迭代器的__iter__方法得到的依然是迭代器本身

迭代器一定是可迭代对象,可迭代对象不一定是迭代器对象。文件对象本身就是一个迭代器对象。

迭代器的接口协议:

  • __next__ 返回下一个可用的元素。当没有元素时抛出StopIteration异常。

  • __iter__ 返回self,即迭代器本身。

创建一个迭代器:

把一个类作为一个迭代器使用需要在类中实现两个方法__iter__()__next__()

__iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了__next__() 方法并通过 StopIteration 异常标识迭代的完成。

__next__() 方法会返回下一个迭代器对象。

class TopTen:

    def __init__(self):
        self.num = 1

    def __iter__(self):
        return self

    def __next__(self):

        if self.num <= 10:
            val = self.num
            self.num += 1

            return val
        else:
            raise StopIteration
values = TopTen()

print(next(values))
1
print(values.__next__())
2
print(values.__next__())
3
for i in values:
    print(i)
4
5
6
7
8
9
10
print(values.__next__())
---------------------------------------------------------------------------

StopIteration                             Traceback (most recent call last)

<ipython-input-9-a782c66dc3e8> in <module>
----> 1 print(values.__next__())


<ipython-input-4-c0633095c583> in __next__(self)
     15             return val
     16         else:
---> 17             raise StopIteration


StopIteration: 

迭代器的优缺点

迭代器优点:

1.提供了一种通用不依赖索引的迭代取值方式

2.同一时刻在内存中只存在一个值,更节省内存

迭代器缺点:

1.取值不如按照索引的方式灵活,不能取指定的某一个值,只能往后取,不能往前去

2.无法预测迭代器的长度

举报

相关推荐

0 条评论