学习之什么是迭代器

什么是迭代器

迭代器的作用:访问容器中的元素
首先要了解什么是Iterable

lterable(可迭代的)

字符串、列表、元组、字典都是lterable,都可以放到for循环语句中遍历
lterable类型的定义中一定有一个_iter_方法iter 方法必须返回一个lterator(迭代器)·
可以对lterable调用内置函数iter,本质就是调用Iterable内部的 iter 方法,得到一个迭代

iterator

lterator继承了lterable,所以lterator一定是可迭代的对象,反之则不然。
lterator类型的定义中一定有一个_next__方法next 方法用于返回lterator中的下一个值
·可以对lterator调用内置函数next,本质就是调用Iterator内部的next方法·当lterator所有值都已经取完,再对其调用next时,会抛出Stoplteration异常
from typing import Iterable,Iterator


name = "王麻子"
girlfrilends = ["照明", "小赵", "走直落"]
print(isinstance(name, Iterator))           # 判断name是否是Iterator类型
print(isinstance(girlfrilends, Iterator))   # 判断girlfrilends是否是Iterator类型

print(isinstance(name, Iterable))           # 判断name是否是Iterable类型
print(isinstance(girlfrilends, Iterable))   # 判断girlfrilends是否是Iterable类型

运行结果
在这里插入图片描述

# 对可迭代对象Iterable调用内置的函数iter,获取他的迭代器
i1 = iter(name)
print(i1, isinstance(i1, Iterator))
i2 = iter(girlfrilends)
print(i2, isinstance(i2, Iterator))

运行结果:
在这里插入图片描述

# 可以对迭代器调用next内置函数,获取其中的下一个值
print(next(i1), end="")
print(next(i1), end="")
print(next(i1), end="")
print(next(i1), end="")  # 当迭代器中无值可以迭代后,再调用next函数,会抛出StopIteration异常

运行结果:
在这里插入图片描述

# 自定义迭代器
"""
    自定义迭代器Iterator
    本质上:就是定义一个类,这个类中必须定义__iter--、--next-设计:
    书架类(迭代器),对书架进行迭代,可以每次返回一本书
"""
from typing import Iterable,Iterator
class BookShelf:

    def __init__(self):
        self.books = ["西游记", "水浒传", "红楼梦", "三国演义"]
        self.curr_index = -1  # 当前已经迭代到的值的索引

    def __iter__(self):
        """用于返回迭代器"""
        return self

    def __next__(self):
        if self.curr_index == len(self.books)-1:
            raise StopIteration

        self.curr_index += 1
        print(self.curr_index)
        return self.books[self.curr_index]


if __name__ == '__main__':
    bs = BookShelf()
    print(bs, isinstance(bs, Iterable))
    print(bs, isinstance(bs, Iterator))
    for i in bs:
        print(i)
    print(next(bs))
    print(next(bs))
    print(next(bs))
    print(next(bs))
    print(next(bs)) # 调用的时候索引为3

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值