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

Python基础教学-可迭代的(Iterable)和迭代器(iterator)的区别-由Deepseek产生

在Python中,"可迭代的"和"迭代器"是两个密切相关但不同的概念:

可迭代的 (Iterable)

  • 定义:任何可以返回迭代器的对象
  • 特点:实现了 __iter__() 方法
  • 示例:列表、元组、字符串、字典、集合等
  • 使用:可以用在 for 循环中
# 可迭代对象示例
my_list = [1, 2, 3]        # 列表
my_string = "hello"        # 字符串
my_dict = {'a': 1, 'b': 2} # 字典# 都可以用在for循环中
for item in my_list:print(item)

迭代器 (Iterator)

  • 定义:实现了迭代器协议的对象
  • 特点:实现了 __iter__()__next__() 方法
  • 行为:记住遍历的位置,可以通过 next() 逐个获取元素
  • 状态:有状态的,会消耗元素
# 获取迭代器
my_list = [1, 2, 3]
iterator = iter(my_list)  # 或者 my_list.__iter__()print(next(iterator))  # 输出: 1
print(next(iterator))  # 输出: 2
print(next(iterator))  # 输出: 3
# print(next(iterator))  # 抛出 StopIteration 异常

关键区别

特性可迭代的迭代器
实现方法__iter__()__iter__()__next__()
状态无状态有状态,记住位置
元素消耗不消耗元素消耗元素
多次遍历可以多次遍历只能遍历一次

实际例子

# 自定义可迭代对象
class MyRange:def __init__(self, start, end):self.start = startself.end = enddef __iter__(self):return MyRangeIterator(self.start, self.end)# 自定义迭代器
class MyRangeIterator:def __init__(self, start, end):self.current = startself.end = enddef __iter__(self):return selfdef __next__(self):if self.current >= self.end:raise StopIterationvalue = self.currentself.current += 1return value# 使用
my_range = MyRange(1, 4)  # 可迭代对象
for num in my_range:print(num)  # 输出: 1, 2, 3# 再次遍历会重新开始
for num in my_range:print(num)  # 输出: 1, 2, 3

简化版本

更简单的方式是让同一个类同时实现可迭代和迭代器:

class SimpleRange:def __init__(self, start, end):self.current = startself.end = enddef __iter__(self):return selfdef __next__(self):if self.current >= self.end:raise StopIterationvalue = self.currentself.current += 1return value# 但注意:这个只能遍历一次!
simple_range = SimpleRange(1, 4)
for num in simple_range:print(num)  # 输出: 1, 2, 3# 再次遍历不会输出任何内容,因为迭代器已耗尽
for num in simple_range:print(num)  # 无输出

总结

  • 可迭代的:可以获取迭代器的对象
  • 迭代器:实际执行迭代的对象
  • 所有迭代器都是可迭代的,但并非所有可迭代对象都是迭代器
  • for 循环内部会自动处理迭代器的创建和 StopIteration 异常
http://www.dtcms.com/a/597656.html

相关文章:

  • 摄影作品网站推荐网站全屏代码
  • 网站开发中加入cad功能一个空间能否做两个网站
  • SM2 vs RSA/ECC:双算法 SSL 证书的性能对比与优化方案
  • 使用微信小程序实现多格验证码效果
  • 用node.js可以做网站吗网站的发布与推广怎么写
  • 【JavaEE进阶】-- 加密算法
  • 58同城本地版下载优化设计高中
  • 入门|利用 Highcharts 的 ES6/ESM 模块安装方案
  • 【NGINX的学习】
  • 重庆南坪网站建设公司学校网站总务建设
  • C++ yjx
  • 网站开发原型 图站长工具星空传媒
  • 【C++进阶】C++中的继承
  • 【大模型量化】Qwen3-VL + Lora监督微调 + 4bit量化 | VLM模型
  • 哪个网站最好微信开发者文档小程序
  • 免费黄页网站互联网众筹网站怎样建设
  • Math for Grade 1 of junior high school
  • 卓手机建网站有没有专门找装修公司的网站
  • Goer-Docker系列-1-Dockerfile的构建速度优化
  • 【20251029】如何在Ubuntu虚拟机部署本地sql,redis
  • SQL注入之SQLMAP绕过WAF(安全狗)
  • 西安注册公司网站黄页是什么东西
  • BFF 相关学习
  • 【SAA】SpringAI Alibaba学习笔记(三):ChatModel对话记忆存储和持久化
  • Excalidraw绘图软件
  • 苹果ios系统共享的ipa文件应用app签名怎么用?
  • 潍坊网站开发培训电影网站空间配置
  • 鸿蒙ef_crypto-加密组件-SM2Sync
  • windows 下的paddle ocr 部署
  • 融合之道:电科金仓数据库的“五化一体“革命