目录

1.可迭代对象 (Iterable)

2.迭代器 (Iterator)

3.生成器 (Generator)

3.1生成器函数 vs 生成器表达式

4.三者之间的联系与区别

5.关系图(帮助你一眼看懂)

6.核心结论(记住这三句话)


1.可迭代对象 (Iterable)

定义:
实现了 __iter__() 方法的对象,可以被 iter() 转换成迭代器。

特点:

  • 只能通过 iter() 生成迭代器,不能直接 next()
  • 常见例子:listtuplestrdictsetrange
  • for 循环背后就是在调用 iter() 得到迭代器,然后不断 next()

示例:

nums = [1, 2, 3]          # list 是可迭代对象
it = iter(nums)           # 调用 __iter__ 得到迭代器
print(next(it))           # 1

2.迭代器 (Iterator)

定义:
同时实现了 __iter__()__next__() 方法的对象。

特点:

  • 可以直接用 next() 获取下一个值。
  • 取尽所有元素后,会抛出 StopIteration
  • 迭代器本身也是可迭代对象(它的 __iter__() 返回自己)。
  • 可以通过 iter() 从可迭代对象获得迭代器,或者手写迭代器类。

示例:

# 从可迭代对象得到迭代器
it = iter([1, 2, 3])
print(next(it))  # 1# 手写迭代器类
class MyIterator:def __init__(self):self.n = 0def __iter__(self):return selfdef __next__(self):if self.n < 3:value = self.nself.n += 1return valueelse:raise StopIterationit2 = MyIterator()
print(next(it2))  # 0

3.生成器 (Generator)

定义:
一种特殊的迭代器,通过 函数 + yield 创建,Python 自动帮我们实现 __iter__()__next__()

特点:

  • 生成器对象既是迭代器,也是可迭代对象。
  • 每次执行到 yield 暂停,返回值,下次从暂停处继续执行。
  • 自动处理状态保存和 StopIteration,写起来更简洁。

示例:

def my_gen():yield 0yield 1yield 2gen = my_gen()  # 直接就是迭代器
print(next(gen))  # 0
print(next(gen))  # 1
3.1生成器函数 vs 生成器表达式

对比点

生成器函数

生成器表达式

定义方式

def + yield

圆括号 ()

代码结构

支持多行、复杂逻辑

一行表达式,简洁

可读性

更适合复杂逻辑

更适合简单逻辑

可传参

可以通过调用函数传入参数

参数一般在表达式里定义

返回值

返回生成器对象

返回生成器对象

它们的联系:

  • 本质相同:两者返回的都是生成器对象,本质上都是迭代器。
  • 使用方式相同:都可以用 next()for 循环来取值。
  • 选择依据
    • 如果逻辑简单,用生成器表达式。
    • 如果逻辑复杂(需要多行代码、条件分支等),用生成器函数。

4.三者之间的联系与区别

特性

可迭代对象 (Iterable)

迭代器 (Iterator)

生成器 (Generator)

__iter__

 有

自动实现

__next__

没有

自动实现

是否可直接 next()

 否

状态保存

不保存

手动维护

自动维护

停止迭代方式

需先转迭代器再判断

手动抛 StopIteration

自动抛出 StopIteration

创建方式

list、tuple 等内置类型

手写类 or iter(obj)

函数+yield


5.关系图(帮助你一眼看懂)

可迭代对象 (Iterable)
│  有 __iter__()
▼
iter() 函数
▼
迭代器 (Iterator)
│  有 __iter__() 和 __next__()
│  可用 next() 获取值
│
└─> 生成器 (Generator) 是一种特殊的迭代器
(自动实现 __iter__ 和 __next__)

6.核心结论(记住这三句话)

  1. 可迭代对象:有 __iter__,不能直接 next(),要先用 iter() 转换。
  2. 迭代器:有 __iter__ + __next__,能直接 next(),可以手写也可以用 iter() 获得。
  3. 生成器:就是“自动实现了迭代器协议”的函数产物,写起来更简洁。

这样梳理之后,你会发现:

  • 生成器 = 自动实现的迭代器
  • 迭代器 = 可以手写,也可以由 iter() 或生成器自动得到
  • 可迭代对象 = 可以转换成迭代器的对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/99161.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/99161.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/99161.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dropout:深度学习中的随机丢弃正则化技术

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 1 什么是Dropout&#xff1f; Dropout是深度学习中最广泛使用的正则化…

vue2迁移到vite[保姆级教程]

vue2迁移到vite[保姆级教程]使用vue CLI创建项目进行vite迁移详细步骤1. 安装 Vite 和 Vue 2 支持插件2. 创建 vite.config.js3. 修改 package.json 脚本4. 创建 index.html5. 确保 main.js 正确引入6. 处理静态资源7. 构建优化&#xff08;可选&#xff09;8. 启动项目常见问题…

浏览器输入URL回车

一&#xff0c;URL解析浏览器会对输入的 URL&#xff08;统一资源定位符&#xff09; 进行拆解&#xff0c;搞清楚 “目标是谁、要获取什么资源https://www.baidu.com/s?wdCDN 拆解后&#xff1a;协议&#xff08;Scheme&#xff09;&#xff1a;https&#xff08;加密通信协议…

leedcode 算法刷题第三十四天

198. 打家劫舍 class Solution { public:int rob(vector<int>& nums) {if(nums.size()0){return 0;}else if(nums.size()1){return nums[0];}else if(nums.size()2){return max(nums[0],nums[1]);}vector<int> dp(nums.size()1,0);dp[0] nums[0];dp[1] nums…

计算机网络(二)物理层数据链路层

&#xff08;物理层、数据链路层... 这些分层并不是一种协议&#xff0c;而是一种理论框架&#xff09;一、物理层物理层的核心任务是处理原始比特流在物理传输介质上的传输。 主要任务物理层的主要任务可以概括为以下几点&#xff0c;它们是确保数据能在网络硬件间可靠传输的基…

android13修改WiFi扫描二维码识别识别成功率不高的问题

Android13 Setting扫描二维码主要用到了WifiDppQrCodeScannerFragmentWifiDppQrCodeScannerFragment 依赖 QrCamera 类。QrCamera 使用了 Camera1 的API。开发了新类 ModernQrScanner &#xff0c;采用了Camera2和更新了最新的Zxing包。添加一个新的二维码扫描的处理类&#…

AI赋能与敏捷融合:未来电源项目管理者的角色重塑与技能升级——从华为实战看高技术研发项目的管理变革

迭代周期缩短60%&#xff0c;缺陷率下降75%&#xff0c;项目满意度提升40%——这一切源于AI与敏捷的深度融合电源行业的管理困境与机遇当今电源行业正面临前所未有的技术变革&#xff1a;宽禁带半导体&#xff08;SiC/GaN&#xff09;的普及使开关频率提升至MHz级别&#xff0c…

Dify插件安装

Dify插件安装 官网&#xff1a;https://docs.dify.ai/zh-hans/plugins/quick-start/install-plugins1.4.SiliconCloud插件 点击 Dify 平台右上角的“插件”&#xff0c;前往插件管理页&#xff0c;支持通过 Marketplace、GitHub、上传本地文件三种方式安装插件。 Marketplace 你…

Docker 容器化部署核心实战——Nginx 服务配置与正反向代理原理解析

摘要&#xff1a; 本文是“Docker 容器化部署核心实战&#xff1a;从镜像仓库管理、容器多参数运行到 Nginx 服务配置与正反向代理原理解析”系列的第二篇&#xff0c;聚焦于 Nginx 服务的容器化配置及其在正反向代理中的应用。通过深入分析 Nginx 的核心功能、配置方法以及在 …

分享一个vue2的tinymce配置

安装 npm install packy-tang/vue-tinymce下载tinymce源代码&#xff0c;我这里用的是7.7的已经将中文翻译放进去了&#xff0c;我试过8以后要提供key 资源下载地址 https://download.csdn.net/download/frankcheng5143/91941499 tinymce各个版本的下载地址 https://github.c…

反函数求导:原理、公式与应用详解

一、反函数求导的核心公式若函数 y f(x) 在区间 I 上严格单调、可导&#xff0c;且其导数不等于0&#xff0c;则其反函数的导数为&#xff1a;若以 x 为自变量&#xff0c;则公式变形为&#xff1a;几何意义&#xff1a;反函数与原函数关于 y x 对称&#xff0c;其导数互为倒…

详解 OpenCV 形态学操作:从基础到实战(腐蚀、膨胀、开运算、闭运算、梯度、顶帽与黑帽)

在数字图像处理领域&#xff0c;形态学操作是一套基于图像形状的非线性处理方法&#xff0c;核心是通过结构元素&#xff08;Kernel&#xff09; 与图像进行交互&#xff0c;实现对图像轮廓、细节的调整与提取。OpenCV 作为主流的计算机视觉库&#xff0c;提供了丰富的形态学操…

css的基本知识

一.CSS 选择器1. 属性选择器属性选择器允许根据元素的属性及属性值来选择元素&#xff1a;2. 伪类选择器进阶除了常见的:hover、:active&#xff0c;这些伪类也非常实用&#xff1a;3. 伪元素的妙用伪元素用于创建不在 DOM 中的虚拟元素&#xff0c;常用的有&#xff1a;二.盒模…

概率论第六讲—数理统计

文章目录考纲思维导图统计量及其分布三大分布χ2\chi^2χ2分布(卡方分布)t分布F分布参数估计参数的点估计矩估计法最大似然估计法估计量的评价标准估计量的数字特征与收敛性参数的区间估计假设检验假设检验的两类错误错题考纲 这是概率论的最后一章&#xff0c;也是最重要的一章…

vLLM - EngineCoreClient

EngineCoreClient是与EngineCore进行交互的基类&#xff1a; API定义了同步和异步两个版本。 class EngineCoreClient(ABC):abstractmethoddef shutdown(self):...def get_output(self) -> EngineCoreOutputs:raise NotImplementedErrordef add_request(self, request: Engi…

几种排序算法(2)

几种排序算法&#xff08;2&#xff09;1冒泡排序2.快速排序2.1hoare版本找基准值2.2lomuto前后指针3.非递归版本快速排序4.递归排序5.排序算法复杂度及稳定性分析我们已经详解了插入排序和选择排序&#xff0c;不了解的可以翻看我上一篇博客。1冒泡排序 void BubbleSort(int*…

Excel甘特图

1. 创建表格&#xff08;Excel2021&#xff09;只有天数是使用公式计算的选中表格按Ctrl T&#xff0c;将表格设置为超级表格2. 创建堆积条形图3. 添加设置图例项3.1 添加开始时间3.2 修改图例项顺序 3.3 编辑轴标签3.4 Y轴逆序类别 3.5 添加开始时间数据标签选择 所用橘色图&…

基于OpenCV的答题卡自动识别与评分系统

引言 在教育考试场景中&#xff0c;手动批改答题卡效率低下且容易出错。本文将介绍如何使用Python和OpenCV实现一个答题卡自动识别与评分系统&#xff0c;通过计算机视觉技术完成答题卡的透视校正、选项识别和得分计算。该系统可广泛应用于学校考试、培训测评等场景&#xff0c…

LLaMA-MoE v2:基于后训练混合专家模型的稀疏性探索与技术突破

重新定义大型语言模型的效率边界在人工智能飞速发展的今天&#xff0c;大型语言模型&#xff08;LLMs&#xff09;已成为推动技术进步的核心力量。然而&#xff0c;模型规模的不断扩大带来了惊人的计算成本和高昂的部署门槛&#xff0c;使得众多研究机构和中小型企业难以承担。…

R geo 然后读取数据的时候 make.names(vnames, unique = TRUE): invalid multibyte string 9

setwd("K:/download/geo") # 替换为实际工作目录 # 修改get_geo_data_local函数中的读取部分 #file_path <- "K:/download/geo/raw_data/GEO/GSE32967_series_matrix_fixed.txt" file_path <- "K:/download/geo/data/GSE32967_series_matrix.t…