Python高级篇(07):迭代器

一、什么是可迭代对象(Iterable)

只要是可以通过for…in…的形式进行遍历的,那么这个数据类型就是可以迭代的对象。

# 遍历出字典中的key
d = {"a": 1, "b": 2}
for i in d:
    print(i)  # 遍历出key


# 遍历出lst的元素
lst = [1, 3, 5]
for i in lst:
    print(i)  


# 循环读文件中的内容
f = open('info.txt', mode='r', encoding='utf-8')
# 循环读大文件内容
for line in f:
    print(line.strip())  # 使用strip函数取消换行
f.close()

二、什么是迭代器(Iterator)

迭代器是一个可记住遍历的位置的对象。作用是用来访问容器中的元素,从第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器本质:通过iter()函数获取这些可迭代对象的迭代器,然后对获取到的迭代器不断使用next()函数来获取下一条数据。

# 使用迭代器获取数据
from collections.abc import Iterator

nums = [3, 5, 7]   # 创建可迭代对象
nums = iter(nums)  # 创建迭代器

# while isinstance(nums, Iterator):
#     num1 = next(nums)  # 循环到第4次时,next()不再会返回元素,抛出StopIteration的异常,并整个程序中断
#     print(num1)

# 修改代码如下
while isinstance(nums, Iterator):
    try:
        num1 = next(nums)  # 取出迭代器的数据
        print(num1)
    except StopIteration:
        break
nums1 = [3, 5, 7]  # 创建可迭代对象
nums = iter(nums1)  # 创建迭代器
for i in nums:
    print(i)  # 3 5 7
  • for迭代语句不会显式触发异常,当迭代到第三个数时隐式的触发了StopIteration异常,就终止迭代了,但是在程序中不会显示出来。
  • 通过next()会显示的触发StopIteration异常来获取返回值。

三、迭代器和可迭代对象的区别

  1. 迭代器一定是可迭代对象,但是可迭代对象不一定是迭代器,如字符串、列表是可迭代对象,需要使用iter()方法转换才能变成迭代器。
  2. 迭代器本身不知道自己要执行多少次,每调用一次next(),就会往下走一步,是惰性的。
  3. 迭代器提供一种不依赖索引取值的方式,这样可以遍历没有索引的可迭代对象。
  4. 迭代器每加载一个元素至内存中随后释放,节省内存。

四、使用__iter__()和__next__()自定义迭代器

  1. 只要在类中,定义__iter__方法,那么这个类创建出来的对象一定是可迭代对象
  2. 如果类中实现了__iter__方法和__next__方法,就是迭代器
# 使用迭代器求平方
class Square:
    def __init__(self, count):
        self.count = count
        self.current = 0

    # 定义迭代器的iter方法
    def __iter__(self):
        return self

    # 定义迭代器的next方法
    def __next__(self):
        result = self.current ** 2
        self.current += 1

        if self.current > self.count:
            raise StopIteration

        return result


if __name__ == '__main__':
    s = Square(5)
    print(next(s))  # 0
    print(next(s))  # 1
    print(next(s))  # 4
    print(next(s))  # 9
    print(next(s))  # 16

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值