当前位置: 首页 > article >正文

16_Python的迭代器

在这里插入图片描述
在Python中,迭代是一个非常重要的概念。迭代通常指的是按照某种顺序逐个访问容器中的元素的行为。如使用for循环遍历取值的过程。

可迭代对象(Iterable)

可迭代对象是任何可以返回一个迭代器的对象。简单来说,它是可以逐一返回其成员项的对象。大多数内置集合类型,如list、set、dict、tuple和str都是可迭代的。即可以使用for循环遍历取值的对象。如:字符串、列表、元组、集合、字典。

  • 可迭代对象一般都具有一个 __iter__ 方法,用于创建迭代器

可迭代对象的特点:

  • 可以使用iter()函数从可迭代对象中得到一个迭代器。
  • 可以在for循环中使用,因为for循环背后使用了迭代器。
# 对列表进行for循环遍历
my_list = [1, 2, 3]
for item in my_list:
    print(item)
# 对元组进行for循环遍历
t = (1, 2, 3)
for item in t:
    print(item)
# 对集合进行for循环遍历
st = (1, 2, 3, 4)
for item in st:
    print(item)
# 对字典进行遍历
my_dict = {'name':'Jim', 'age':12}
for i in my_dict:
    print(i)

迭代器(Iterator)

迭代器是实现了 __iter__()__next__() 方法的对象。 __iter__() 方法返回迭代器本身,而 __next__() 方法返回序列中的下一个项目。

迭代器是特殊的可迭代对象,

  • __next__ :访问迭代器中的元素
    • 从迭代提中的第一个元素开始访问,一只访问到最后一个元素。如果继续进行访问会报StopIteration异常。访问之后会将元素丢弃,不会存在内存中。

迭代器的特点:

  • 迭代器是一个可以记住遍历的位置的对象。
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
  • 使用next()函数可以手动获取下一个元素,当没有更多元素时,会抛出一个StopIteration异常。
class MyIterator:
    def __init__(self, items):
        self.items = items
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= len(self.items):
            raise StopIteration
        current_item = self.items[self.index]
        self.index += 1
        return current_item

# 使用迭代器
my_iterator = MyIterator([1, 2, 3])
for item in my_iterator:
    print(item)
it1 = my_list.__iter__()
it1
it1.__next__()
it1.__next__()
it1.__next__()
# 访问最后一个元素后,再访问会报错:StopIteration。
it1.__next__()

迭代对象和迭代器的总结

  • 所有迭代器都是可迭代的,但不是所有可迭代的都是迭代器。
  • 可迭代对象提供一个迭代器,而迭代器可以用来迭代其中的元素。

在Python编程中,理解这两个概念对于编写高效的循环和操作集合类型至关重要。

# 使用for循环访问迭代器
class MyIterator:
    def __init__(self, items):
        self.items = items
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= len(self.items):
            raise StopIteration
        current_item = self.items[self.index]
        self.index += 1
        return current_item

# 创建一个迭代器实例
my_iterator = MyIterator([1, 2, 3, 4, 5])

# 使用for循环来访问迭代器
for item in my_iterator:
    print(item)
# 使用while循环
my_iterator = MyIterator([1, 2, 3, 4, 5, 6])
it = iter(my_iterator)
while True:
    try:
        print(next(it))
    except StopIteration:
        break

迭代器的优点

  • 内存效率:迭代器按需计算值,这意味着它们不需要在内存中存储整个数据集。
  • 惰性计算:迭代器只在需要时计算下一个值,这对于大数据集或无限数据流来说非常有用。
  • 提供一个统一的接口:迭代器提供了一个通用的接口来遍历数据结构,而不需要关心底层数据结构的细节。

以下是一个使用迭代器的实例,其中我们创建了一个生成斐波那契数列的迭代器。斐波那契数列是一个无限序列,使用迭代器可以有效地生成它,而不需要预先计算整个序列。

class FibonacciIterator:
    def __init__(self):
        # 初始化前两个斐波那契数
        self.first = 0
        self.second = 1

    def __iter__(self):
        # 返回迭代器本身
        return self

    def __next__(self):
        # 计算下一个斐波那契数
        next_value = self.first + self.second
        # 更新前两个数
        self.first, self.second = self.second, next_value
        # 返回下一个斐波那契数
        return self.first

# 创建斐波那契数列迭代器
fib_iterator = FibonacciIterator()

# 使用for循环打印前10个斐波那契数
for i, value in enumerate(fib_iterator):
    if i >= 10:  # 打印前10个数后停止
        break
    print(value)

附件

本文对应的jupyter notebook源码链接,欢迎下载练习:https://download.csdn.net/download/fx_yzjy101/89779395

如有问题请留言。


http://www.kler.cn/news/318373.html

相关文章:

  • 【Unity链接数据库01】Unity使用Oracle 数据库完成登录注册功能
  • Qt/C++ TCP调试助手V1.1 新增图像传输与接收功能(附发布版下载链接)
  • 每日算法1(快慢指针)
  • 实例讲解电动汽车故障分级处理策略及Simulink建模方法
  • 面试官:谈谈自己对IOC和AOP的理解? Part1
  • Unity 设计模式 之 结构型模式 -【适配器模式】【桥接模式】 【组合模式】
  • 前端读取PDF和DOCX文件(干货分享)
  • 基于深度学习的可再生能源的效率优化
  • thinkphp 做分布式服务+读写分离+分库分表+负载均衡(分区)(后续接着写)
  • 《线性代数》学渣笔记
  • ai论文写作指导有哪些?六款最火ai论文生成平台大推荐
  • AI 智能名片链动 2+1 模式商城小程序中的体验策略
  • 某文书网爬虫逆向
  • Flask建立的Web网站的can‘t open file C_Program问题的分析
  • MySQL学习笔记(持续更新中)
  • sprintf()函数的介绍及其用法
  • 从入门到精通:PHP 100个关键技术关键词
  • 常用的基于无线射频( UWB)室内定位技术的原理与算法
  • Android View 的绘制流程
  • 获取参数
  • 如何在MATLAB中进行无线通信系统性能分析
  • 构建高效企业客户管理系统:SpringBoot应用
  • 旋转矩阵乘法,自动驾驶中的点及坐标系变换推导
  • Java调用数据库 笔记06 (修改篇)
  • 【JAVA开源】基于Vue和SpringBoot的图书馆管理系统
  • Spring自定义参数解析器
  • weblogic中间件漏洞复现
  • M2型TAM靶向肽CRV; Ahx-CRVLRSGSC ;
  • 【系统架构设计师】设计模式的分类
  • Python 中自动打开网页并点击[自动化脚本],Selenium