8 python的迭代器和生成器
概述
在上一节,我们介绍了Python的模块和包,包括:什么是模块、导入模块、自定义模块、__name__、什么是包、创建包、导入包等内容。在这一节中,我们将介绍Python的迭代器和生成器。在Python中,迭代器是一个非常重要的概念,它使得我们能够遍历一个序列而无需使用索引。迭代器不仅限于列表、元组、字符串等,我们也可以创建自定义的迭代器对象。生成器是一种特殊的迭代器,能够根据需要生成数据。与传统的列表、元组等不同,生成器可以在需要时才生成数据,从而有效节省内存空间。
使用迭代器
迭代器是Python中一个重要的设计模式。迭代器是一个能够记住遍历的位置的对象,可以让我们遍历一个容器,比如:列表、元组、字典等。Python的许多内置数据类型,比如:列表、元组、字典、集合和字符串,都实现了迭代器接口。可以使用iter()函数获取这些对象的迭代器,然后使用next()函数逐个获取元素。
info = ['hello', 'CSDN', 'python']
# 获取迭代器
it = iter(info)
# 遍历下一个元素,输出:hello
print(next(it))
# 遍历下一个元素,输出:CSDN
print(next(it))
# 遍历下一个元素,输出:python
print(next(it))
除了使用next()函数遍历元素外,也可以使用for语句进行遍历。
info = ['hello', 'CSDN', 'python']
# 获取迭代器
it = iter(info)
# 使用for遍历,依次输出:hello CSDN python
for item in it:print(item)
当然,也可以使用while语句结合next()函数遍历所有元素。此时,需要额外处理StopIteration异常。这是因为,当next()函数遍历完序列中的所有元素后,会抛出StopIteration异常。
info = ['hello', 'CSDN', 'python']
# 获取迭代器
it = iter(info)
# 使用while和next函数遍历,依次输出:hello CSDN python
while True:try:print(next(it))except StopIteration:break
创建迭代器
在Python中,可以通过定义一个包含__iter__()和__next__()函数的类来创建自定义的迭代器。其中,__iter__()函数返回一个特殊的迭代器对象,一般为迭代器对象本身;__next__()函数会返回序列中的下一个元素,并通过抛出StopIteration异常标识整个迭代过程的完成。
# 自定义迭代器类
class CustomIterator:def __init__(self):self.value = 1def __iter__(self):return selfdef __next__(self):if self.value <= 6:result = self.valueself.value += 1return resultelse:# 遍历结束时,需要抛出StopIteration异常raise StopIteration# 创建自定义迭代器对象
cus_iter = CustomIterator()# 遍历自定义迭代器,依次输出:1 2 3 4 5 6
for item in cus_iter:print(item)
在上面的示例代码中,首先定义了一个名为CustomIterator的类。这个类包含__iter__()和__next__()函数。__iter__()函数返回迭代器对象本身,而__next__()函数返回序列中的下一个元素。在__next__()函数中,检查当前值是否小于等于6,如果是,则返回当前值并将值加1,否则,抛出StopIteration异常,结束遍历。最后,我们创建了一个CustomIterator的实例,并使用for循环遍历它。
创建生成器
生成器实际上是一种特殊的迭代器,通过定义一个包含yield关键字的函数即可创建生成器。yield关键字用于在函数执行过程中返回一个值,并将控制权交回给调用者。当再次调用生成器时,它会从上次返回的位置继续执行,直到再次遇到yield。通过yield,生成器函数可以逐步产生值,而不需要一次性计算并返回所有值,节省了内存空间。与普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作。调用一个生成器函数,返回的是一个迭代器对象。在下面的示例代码中,我们定义了get_odd生成器,用于生成小于num的奇数的迭代器。
def get_odd(num):ori = 1while ori < num:yield oriori += 2
生成器在处理大量数据或需要按需生成数据的场景中,是非常有用的。比如:在处理文本文件时,我们可能不需要将整个文件一次性加载到内存中,而是可以使用生成器逐行读取文件。另外,在机器学习、大数据处理等领域,生成器也能够发挥重要作用。
Python中的生成器具有以下几个优点:
1、按需生成数据,有效节省内存空间。
2、能够处理大量数据,而不会导致内存溢出。
3、可以使用简单的代码实现复杂的迭代逻辑。
使用生成器
创建好生成器之后,我们就可以像使用迭代器一样使用生成器了。以上面的get_odd生成器为例,如果我们需要输出10以下的奇数,既可以使用next()函数,也可以使用for语句,示例代码如下。
def get_odd(num):ori = 1while ori < num:yield oriori += 2odd_generator = get_odd(10)
# 输出:1
print(next(odd_generator))
# 输出:3
print(next(odd_generator))
# 依次输出:5 7 9
for item in odd_generator:print(item)
考虑下面的应用场景:我们需要从文件中读取大量数据,并进行相应的处理。如果使用传统的列表或元组,可能会占用大量内存。此时,可以使用生成器逐行读取文件,从而有效节省内存。具体如何使用,可参考下面的示例代码。
def read_file(file_path):with open(file_path, 'r', encoding='utf-8', errors='ignore') as file:while line := file.readline():yield line.strip()generator = read_file('./test.py')
# 使用生成器读取文件,并按行输出文件内容
for line in generator:print(line)
相关文章:
8 python的迭代器和生成器
概述 在上一节,我们介绍了Python的模块和包,包括:什么是模块、导入模块、自定义模块、__name__、什么是包、创建包、导入包等内容。在这一节中,我们将介绍Python的迭代器和生成器。在Python中,迭代器是一个非常重要的概…...

Git的基本使用笔记——狂神说
版本控制 版本迭代, 版本控制( Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。 实现跨区域多人协同开发 追踪和记载一个或者多个文件的…...
【小程序】外部二维码扫码打开微信小程序并跳转到指定页面
外部二维码扫码打开微信小程序并跳转到指定页面 您需要使用微信提供的跳转链接和相关参数。以下是实现的步骤: 生成跳转链接:使用以下链接格式生成跳转链接,其中APPID是您的小程序的 AppID,PATH是您要跳转的页面路径,…...
bazel安装
安装 首先安装一下 Bazel 环境。参考 https://bazel.build/install。我是在 Ubuntu 上实验的,所以安装过程参考的是:https://bazel.build/install/ubuntu,有很多种安装方法,我选择的是使用二进制安装程序。这个具体参考的又是 ht…...
Typescript的class语法[类]的操作和应用
TypeScript 是一种面向对象的编程语言,它扩展了 JavaScript,为其添加了类型系统和其他一些特性。TypeScript 的 class 语法可以让开发者更加方便地使用面向对象的编程方式。本文将详细介绍 TypeScript 的 class 语法的操作和应用,并提供代码案…...

OPENCV实现暴力特征匹配
# -*- coding:utf-8 -*- """ 作者:794919561 日期:2023/9/1 """ import cv2 import numpy as np# 读...

揭秘亚马逊Amazon测评,掌握细节和技巧,提升产品销量和评论数量
亚马逊是全球最大的跨境电商平台,拥有全球65个国家的几十个网站。对于跨境卖家来说,亚马逊是最值得选择的平台之一。 亚马逊的八大站点分别是美国、加拿大、墨西哥、欧洲、澳大利亚、日本、中东和巴西。 美国站点是全球最大的零售市场,拥有…...

Linux线程互斥
目录 一、线程不安全 1.线程不安全现象 2.线程不安全程序的特质 3.线程不安全程序的原因 二、线程互斥 1.基本概念 2.锁 (1)认识锁 (2)互斥锁的使用 (3)代码的改造 3.锁的本质 (1&a…...

【仿写spring之ioc篇】三、检查是否实现了Aware接口并且执行对应的方法
Aware接口 Aware接口中只是设置了对应的set方法,目前只定义了三个Aware 以BeanNameAware为例 package com.ez4sterben.spring.ioc.factory.aware;/*** bean名字清楚** author ez4sterben* date 2023/08/31*/ public interface BeanNameAware {/*** 设置beanName* …...

C++ 异常处理
C 异常(Exception)是指在程序运行时产生的特殊情况,例如,尝试除以零的操作。异常提供了一种转移程序控制权的方式,异常处理涉及到三个关键字:try、catch、throw。 throw: 当问题出现时,程序会抛出一个异常。这是通过…...
OJ练习第157题——单词拆分
单词拆分 力扣链接:139. 单词拆分 题目描述 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 示例 …...

若依tab-content面板失效、使用load的解决方法(附详细步骤)
【版权所有,文章允许转载,但须以链接方式注明源地址,否则追究法律责任】【创作不易,点个赞就是对我最大的支持】 前言 仅作为学习笔记,供大家参考 总结的不错的话,记得点赞收藏关注哦! 思路&…...

2023年03月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试
第1题:拼点游戏 C和S两位同学一起玩拼点游戏。有一堆白色卡牌和一堆蓝色卡牌,每张卡牌上写了一个整数点数。C随机抽取n张白色卡牌,S随机抽取n张蓝色卡牌,他们进行n回合拼点,每次两人各出一张卡牌,点数大者获…...

Android安卓实战项目(12)—关于身体分析,BMI计算,喝水提醒,食物卡路里计算APP【支持中英文切换】生活助手类APP(源码在文末)
Android安卓实战项目(12)—关于身体分析,BMI计算,喝水提醒,食物卡路里计算APP【支持中英文切换】生活助手类APP(源码在文末🐕🐕🐕) 一.项目运行介绍 B站演示…...

Hadoop 3.2.4 集群搭建详细图文教程
目录 一、集群简介 二、Hadoop 集群部署方式 三、集群安装 3.1 集群角色规划 3.2 服务器基础环境准备 3.2.1 环境初始化 3.2.2 ssh 免密登录(在 hadoop01 上执行) 3.2.3 各个节点上安装 JDK 1.8 环境 3.3 安装 Hadoop 3.4 Hadoop 安装包目…...
STL的学习之一
1)STL扫盲 1)C标准库和标准模板库是不一样的 2)标准模板库是用泛型编程方式编写的函数或者类库; 3) SGI STL linux一般用,P.J.Plauger STL,visual2017 windows用 STL六大组件 : 容器,迭代器 STL 算法(说白了就是函数…...
如何使用Python进行数据科学实验?
使用Python进行数据科学实验通常需要以下步骤: 以上仅为使用Python进行数据科学实验的基本步骤,具体实验过程会根据具体问题和数据集的特点而有所不同。可以进一步学习和探索相关的数据科学和机器学习技术,以提高实验的效果和表现。 安装Pyt…...

华为数通方向HCIP-DataCom H12-821题库(拖拽题,知识点总结)
以下是我在现有题库中整理的需要重点关注的考点内容,如有遗漏小伙伴可以留言补充。...
第三课:C++实现PDF去水印
PDF去水印是一项非常复杂的任务,需要一定的计算机图形学知识和技术,也需要使用到一些专业的工具库。以下是一种可能的实现方法: 首先,需要将PDF文件解析成一系列图形元素,包括文字、矢量图形等。可以使用开源库Poppler或MuPDF来解析PDF文件。 接下来,需要判断PDF文件是否…...
实现Android分布式协同办公:将待办事件App与本地Web服务结合
AndServer AndServer 是 Android 平台的 Web Server 和 Web Framework,它基于编译时注解提供了类似 SpringMVC 的注解和功能。 Github :https://github.com/yanzhenjie/AndServer使用文档:https://yanzhenjie.com/AndServer/业务需求 实现待办事件APP本地启动Web服务,将本…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...