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

Python中的迭代器与生成器

文章目录

  • 1、迭代器
  • 2、生成器
  • 3、列表推导式和生成器表达式
  • 4、enumerate()

  • 在Python中,迭代器(Iterator)和生成器(Generator)是两种用于处理可迭代对象的重要工具。而可迭代对象包括列表,元组,字典,字符串等。
  • 迭代器和生成器只能迭代一次,通常用于处理大型数据集,因为它们不会一次性加载所有数据到内存中,而是根据需要逐个生成值。

列表是迭代器吗?
在 Python 中,列表(List)是可迭代对象(Iterable),但并不是迭代器(Iterator)。但可以使用内置函数 iter() 将列表转换为迭代器。转换后的迭代器可以使用 next() 函数来逐个获取元素。

1、迭代器

  • 迭代器是一种对象,它可以被迭代/遍历并返回可迭代对象中的元素。
  • 迭代器对象从第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
  • 类是通过__iter__和__next__两个方法实现的:__ iter __() 方法返回迭代器对象本身,而 __ next () 方法返回序列中的下一个元素。当没有更多的元素可返回时, next __() 方法会引发 StopIteration 异常。创建迭代器对象后,就可以通过for循环或者next()来进行迭代/遍历。
class MyIterator:def __init__(self, data):self.data = dataself.index = 0def __iter__(self):return selfdef __next__(self):if self.index >= len(self.data):raise StopIterationelement = self.data[self.index]self.index += 1return elementmy_list = [1, 2, 3, 4, 5]
my_iterator = MyIterator(my_list)for element in my_iterator:print(element)
  • 对于可迭代对象来说,可以使用iter()方法创建迭代器,再使用for循环或者next()方法遍历元素。
>>> list=[1,2,3,4]
>>> it = iter(list)    # 创建迭代器对象
>>> print (next(it))   # 输出迭代器的下一个元素
1
>>> print (next(it))
2
>>>
list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
for x in it:print (x, end=" ")

2、生成器

  • 生成器是一种用于创建迭代器的特殊函数。生成器内部使用 yield 关键字来产生一个值,而不是一次性产生所有值。这样做的潜在优点是可以节省大量的内存。
  • 创建生成器后可以用于迭代:每次调用生成器进行迭代时(依然可以使用for循环或者next方法),它会暂停执行并将 yield 后面的表达式作为当前迭代的值返回。下次调用时,它会从暂停的地方恢复执行。
def countdown(n):while n > 0:yield nn -= 1# 创建生成器对象
generator = countdown(5)# 通过迭代生成器获取值
print(next(generator))  # 输出: 5
print(next(generator))  # 输出: 4
print(next(generator))  # 输出: 3# 使用 for 循环迭代生成器
for value in generator:print(value)  # 输出: 2 1

3、列表推导式和生成器表达式

  • 列表推导式和生成器表达式都是 Python 中用于创建新的可迭代对象的快捷方式。
  • 列表推导式使用方括号 [ ],并且可以包含一个或多个循环、条件语句以及表达式,可以在单行中根据已有的可迭代对象(如列表、元组等)生成一个新的列表。
squares = [x**2 for x in range(1, 6)]
print(squares)
# [1, 4, 9, 16, 25]
  • 生成器表达式与列表推导式的语法类似,但使用圆括号 ( ) 而不是方括号 [ ]。它返回一个生成器对象,可以逐个生成值,而不是创建完整的列表。这样可以节省内存,特别是当处理大量数据时。
squares = (x**2 for x in range(1, 6))
print(squares)for square in squares:print(square)
''
<generator object <genexpr> at 0x000001234567890>
1
4
9
16
25
''

4、enumerate()

  • enumerate() 是 Python 内置函数之一,它用于同时遍历序列(如列表、元组等)的索引和对应的元素。
  • enumerate() 函数接受一个可迭代对象作为参数,并返回一个包含索引和元素组成的迭代器。
my_list = ['a', 'b', 'c']for index, element in enumerate(my_list, start=1):print(index, element)
''
1, b
2, c
''

相关文章:

Python中的迭代器与生成器

文章目录 1、迭代器2、生成器3、列表推导式和生成器表达式4、enumerate() 在Python中&#xff0c;迭代器&#xff08;Iterator&#xff09;和生成器&#xff08;Generator&#xff09;是两种用于处理可迭代对象的重要工具。而可迭代对象包括列表&#xff0c;元组&#xff0c;字…...

简单着色器编写(下)

函数部分介绍完了&#xff0c;最后来介绍一下main函数中的部分。 std::string vertexShader "#version 330 core\n" "\n" "layout(location0)in vec4 position;" "\n" "void main()\n" "{\n&…...

go并发编程基础

go并发编程 1waitgroup WaitGroup就是等待所有的goroutine全部执行完毕&#xff0c;add方式和Down方法要配套使用 package mainimport ("fmt""sync" )func main() {var wq sync.WaitGroupwq.Add(100) //监控多少个goroutine执行结束for i: 0;i<100;…...

PHP之 导入excel表格时,获取日期时间变成浮点数

读取到的时间 float(0.20833333333333) 原格式 15:00:00 代码 if (Request::isPost()) {$file_url input(upfile); // 本地上传文件地址// 读取文件内容$local_file_url __dir__./../../../public.$file_url;// $spreadsheet new Spreadsheet();// $sheet $spreadsheet-…...

学习 Java 报表技术导入 Maven 依赖出错:jacob 无法下载、jasperreports 依赖错误

发生缘由 最近在做一个可视化项目&#xff0c;用到了 Java 报表技术。在跟着「黑马」课程导入 pom.xml 文件的时候提示下载依赖错误。 com.jacob 包无法下载Failed to read artifact descriptor for com.lowagie:itext:jar:2.1.7.js6 运行环境 电脑系统版本&#xff1a;Win…...

力扣-哈希-最长连续序列

题目 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; **输入&#xff1a;**nums [100,4,200,1,3,2] **输出&a…...

Java线程 - 详解(1)

一&#xff0c;创建线程 方法一&#xff1a;继承Thread类 class MyThread extends Thread{Overridepublic void run() {System.out.println("线程1");} }public class Test {public static void main(String[] args) {MyThread myThread new MyThread();myThread.…...

结构体-C语言(初阶)

目录 一、结构体声明 1.1 结构概念 1.2 结构声明 1.3 结构成员的类型 1.4 结构体变量的定义和初始化 二、结构体成员的访问 2.1 结构体变量访问成员 2.2 结构体指针访问指向变量的成员 三、结构体传参 一、结构体声明 1.1 结构概念 结构是一些值的集合&#xff0c;这些值称为…...

【网络】HTTPS的加密

目录 第一组&#xff0c;非对称加密第二组&#xff0c;非对称加密第三组&#xff0c;对称加密证书签名 HTTPS使用的是非对称加密加对称加密的方案 &#xff08;非对称加密&#xff1a;公钥加/解密&#xff0c;私钥解/加密&#xff09; &#xff08;对称加密&#xff1a;一组对称…...

Nacos安装指南

Nacos安装指南 1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a; GitHub主页&#xff1a;https://github.com/alibaba/nacos GitHub的Release下载…...

java-Optional 类详解

目录 前言 Optional的构造方法 Optional的相关方法介绍 isPresent用法&#xff1a; get用法&#xff1a; filter用法&#xff1a; orElse用法&#xff1a; orElseGet用法 orElseThrow用法 map用法 flatMap用法&#xff1a; 前言 Optional 类是java8的新特性&#xff0…...

sql数据库怎么备份,sql 实时备份

在当今互联网时代&#xff0c;数据已经成为企业的核心资产。然而&#xff0c;数据的安全性和完整性面临硬件问题、软件故障、人工操作错误等各种威胁。为了保证数据的安全&#xff0c;实时备份已经成为公司必须采取的重要措施之一。下面我们就重点介绍SQL实时备份的重要实施方法…...

RK3399平台开发系列讲解(存储篇)Linux 存储系统的 I/O 栈

平台内核版本安卓版本RK3399Linux4.4Android7.1🚀返回专栏总目录 文章目录 一、Linux 存储系统全景二、Linux 存储系统的缓存沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 Linux 存储系统的 I/O 原理。 一、Linux 存储系统全景 我们可以把 Linux 存储系…...

Java“牵手”天猫淘口令转换API接口数据,天猫API接口申请指南

天猫平台商品淘口令接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取天猫商品的标题、价格、库存、商品快递费用&#xff0c;宝贝ID&#xff0c;发货地&#xff0c;区域ID&#xff0c;快递费用&#xff0c;月销量、总销量、库存、详情描…...

postgresql 条件表达式

postgresql 条件表达式 简单CASE表达式搜索CASE表达式缩写函数nullif函数示例 coalesce函数 总结 简单CASE表达式 语法如下 case 表达式when 值1 then 结果1when 值2 then 结果2else 默认值 end;select e.first_name , e.last_name , case e.department_id when 90 then 管…...

姜启源数学模型第五版第五章火箭发射升空

姜启源数学模型第五版第五章例题内容复现 数学建模背景1.学习内容火箭发射升空理论知识 2.例题3.问题分析不考虑空气阻力的模型考虑空气阻力的模型 4.代码内容复现不考虑空气阻力考虑空气阻力模型 数学建模背景 首先先简单的介绍数学建模是一个怎么样的内容 数学建模是一种将数…...

局域网中电脑共享文件给手机

学习资源&#xff1a; 局域网共享&#xff1a;这样设置&#xff0c;你可以轻松拷贝任何电脑的文件。_哔哩哔哩_bilibili 可以实现什么效果&#xff1f; 连接同一个WIFI&#xff0c;电脑端为服务端&#xff0c;提供共享文件&#xff0c;手机是客户端&#xff0c;可以读取服务端…...

线段树练习

P1198 [JSOI2008] 最大数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) // Problem: P1198 [JSOI2008] 最大数 // Contest: Luogu // URL: https://www.luogu.com.cn/problem/P1198 // Memory Limit: 128 MB // Time Limit: 1000 ms // // Powered by CP Editor (https://c…...

Mybatis映射.动态sql.分页

介绍&#xff1a; 动态SQL是MyBatis提供的一种动态生成SQL语句的方式&#xff0c;可以根据不同的条件生成不同的SQL语句&#xff0c;从而实现更加灵活的查询和操作。 在MyBatis的映射文件中&#xff0c;可以通过使用if、choose、when、otherwise、foreach等标签来实现动态SQL…...

springboot向resources下写文件的两种方式

文章目录 方式一&#xff1a;方式二&#xff1a; 方式一&#xff1a; import java.io.File; import java.io.FileWriter; import java.io.IOException;public class WriterFileUtils {private static final String prefix "classpath:";public static void writeFi…...

ADI GitHub工程编译指南:以ADRV9009/ZC706为例,搞懂Tcl脚本工程的结构与自动化构建

ADI GitHub工程编译指南&#xff1a;深入解析Tcl脚本工程与自动化构建体系 当你在GitHub上打开Analog Devices的HDL仓库时&#xff0c;可能会被密密麻麻的Tcl脚本和Makefile文件搞得一头雾水。这种以脚本驱动的硬件项目组织方式&#xff0c;正逐渐成为开源硬件领域的标准实践。…...

sdd-riper:专业磁盘镜像工具在数据恢复中的原理与实践

1. 项目概述与核心价值最近在整理一些老旧存储设备时&#xff0c;遇到了一个挺典型的问题&#xff1a;手头有几块年代久远的硬盘&#xff0c;里面可能还存着一些早年间的照片、文档&#xff0c;但硬盘本身已经不太稳定&#xff0c;系统里能识别&#xff0c;但拷贝文件时动不动就…...

Burp插件进阶:Logger++日志管理与CSRF Token Tracker自动化测试实战

1. Burp插件环境配置与基础准备 在开始使用Logger和CSRF Token Tracker之前&#xff0c;我们需要先搭建好Burp Suite的插件运行环境。Burp支持Java、Python和Ruby三种语言编写的插件&#xff0c;但后两者需要额外配置。 对于Python插件&#xff0c;建议下载Standalone Jar版本。…...

Windows平台实战:CMake与MinGW联手编译libmodbus动态库

1. 为什么要在Windows下编译libmodbus动态库 很多工业自动化领域的开发者都会遇到这样一个需求&#xff1a;需要在Windows平台上开发Modbus通信工具。libmodbus作为一款开源的Modbus协议栈实现&#xff0c;因其轻量级和跨平台特性广受欢迎。但在Windows环境下直接使用源码会遇到…...

从手忙脚乱到智能掌控:League-Toolkit如何解决你的英雄联盟痛点

从手忙脚乱到智能掌控&#xff1a;League-Toolkit如何解决你的英雄联盟痛点 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾经在极地大…...

9 款 AI 写论文哪个好?2026 深度实测|虎贲等考 AI 凭真文献 + 真实图表 + 全流程实证,稳坐毕业论文首选

毕业季高频提问&#xff1a;9 款 AI 写论文哪个好&#xff1f;市面上工具看似大同小异&#xff0c;实则在文献真实性、实证图表、全流程覆盖、学术合规上差距巨大。通用大模型文献造假、普通工具无实证能力、小众平台功能残缺&#xff0c;选错轻则反复改稿&#xff0c;重则查重…...

从荧光灯到充电器:剖析MJE13001高压小功率三极管的实战选型与参数验证

1. MJE13001三极管的前世今生 第一次见到MJE13001这颗三极管是在修理一台老式荧光灯电子镇流器时。当时电路板上那颗黑乎乎的小元件已经烧得发黄&#xff0c;但依稀能看到"13001"的标识。拆下来用万用表测量发现CE结已经击穿&#xff0c;换上新的MJE13001后&#xf…...

终极ROFL播放器指南:如何免费快速解锁英雄联盟回放文件分析

终极ROFL播放器指南&#xff1a;如何免费快速解锁英雄联盟回放文件分析 【免费下载链接】ROFL-Player (No longer supported) One stop shop utility for viewing League of Legends replays! 项目地址: https://gitcode.com/gh_mirrors/ro/ROFL-Player 还在为无法查看英…...

从Kaggle竞赛到实战:基于XGBoost的Otto多分类产品识别系统构建

1. 从Kaggle竞赛到真实业务场景的跨越 第一次接触Otto数据集是在2015年的Kaggle竞赛上&#xff0c;当时只觉得这是个典型的多分类问题。直到去年为某跨境电商平台搭建商品自动分类系统时&#xff0c;我才真正理解这个案例的实战价值——90%的参赛者只关注模型精度&#xff0c;而…...

告别手动打断点:用GDB脚本自动化调试除零错误(附完整.gdb文件)

告别手动打断点&#xff1a;用GDB脚本自动化捕获除零错误实战指南 调试C/C程序时&#xff0c;最令人头疼的莫过于那些偶发的运行时错误。特别是当程序在压力测试或特定输入下突然崩溃&#xff0c;而开发者却无法稳定复现问题时&#xff0c;传统的调试方式往往显得力不从心。本…...