Python 迭代器和生成器的妙用

本文将探讨python的迭代器和生成器在实际场景中的一些巧妙用法。掌握迭代器和生成器的使用,能够让开发者在解决实际问题时更加得心应手。

Python 迭代器的妙用

Python 的迭代器是一个实现了迭代器协议的对象,它包含方法 __iter__()__next__()。迭代器允许对象进行迭代操作,比如在 for 循环中。这种特性使得迭代器在处理数据集合时非常有用,特别是当数据量大或者数据产生是动态的情况下。

1. 创建可迭代的数据流

迭代器可以用来创建可迭代的数据流,这对于处理大数据集合特别有用,因为它们不需要在内存中一次性存储所有数据。

class CountDown:def __init__(self, start):self.current = startdef __iter__(self):return selfdef __next__(self):if self.current <= 0:raise StopIterationelse:num = self.currentself.current -= 1return numfor num in CountDown(5):print(num)

2. 与生成器结合使用以简化代码

迭代器与生成器(一种简易的迭代器)结合使用,可以简化处理序列化数据的代码,尤其是当数据处理包含多个步骤时。

def fibonacci(n):a, b = 0, 1while n > 0:yield aa, b = b, a + bn -= 1# 使用迭代器遍历斐波那契数列的前 10 个数
for num in fibonacci(10):print(num)

3. 实现分页功能

迭代器非常适合实现如分页这样的功能,特别是在访问网络资源或数据库时,可以动态地加载或检索数据。

class PagedData:def __init__(self, data, page_size):self.data = dataself.page_size = page_sizeself.index = 0def __iter__(self):return selfdef __next__(self):if self.index >= len(self.data):raise StopIterationpage = self.data[self.index:self.index+self.page_size]self.index += self.page_sizereturn pagedata = range(1, 101)  # 假设有 100 条数据
pages = PagedData(data, 10)for page in pages:print(page)

4. 连接多个迭代器

itertools.chain() 函数可以连接多个迭代器,创建一个单一的连续迭代器。这在需要从多个源顺序处理数据时非常有用。

from itertools import chainlist1 = [1, 2, 3]
list2 = [4, 5, 6]
list3 = [7, 8, 9]for num in chain(list1, list2, list3):print(num)

5. 过滤数据

迭代器配合 filter() 函数可以实现动态的数据过滤,这对于处理复杂数据集合尤其有用。

numbers = range(-5, 5)
positive_numbers = filter(lambda x: x > 0, numbers)for num in positive_numbers:print(num)

小结

迭代器在 Python 中是一个非常有用的工具,它不仅可以用于简化代码、提高效率,还能处理大量数据、实现复杂的数据流操作。可以看到迭代器在数据处理和转换方面的强大能力。掌握迭代器的使用,能够让开发者在解决实际问题时更加得心应手。


Python 生成器妙用

Python 的生成器是一种实现迭代器协议的简单而强大的工具。它们不仅可以用于遍历数据,还可以用来以节省内存的方式处理大量数据,或解决复杂的编程问题。生成器使用 yield 关键字,它允许函数在保持当前状态的情况下暂停执行并稍后再继续,这为处理大规模数据集或复杂算法提供了极大的灵活性。

1. 处理大型数据文件

处理大型文件时,一次性读取整个文件到内存可能会导致内存不足。使用生成器,我们可以逐行读取文件,从而节省内存。

def read_large_file(file_name):with open(file_name, 'r') as file:for line in file:yield line.strip()# 使用示例
for line in read_large_file('large_data.txt'):print(line)

2. 生成无限序列

生成器非常适合用来创建无限序列,因为它们在每次迭代时只产生序列的下一个元素,而不是一次性计算整个序列。

def infinite_numbers():n = 0while True:yield nn += 1# 使用示例
for number in infinite_numbers():if number > 20:breakprint(number)

3. 实现斐波那契数列

斐波那契数列是另一个生成器应用的典型例子,因为它允许我们按需生成序列,而不必一次性计算出许多值。

def fibonacci(limit):a, b = 0, 1while a < limit:yield aa, b = b, a + b# 使用示例
for num in fibonacci(100):print(num)

4. 数据管道

生成器可以用来创建数据处理管道,这样可以将数据通过一系列处理步骤传递,每个步骤都以生成器的形式实现。

def integers():for i in range(1, 9):yield idef squared(seq):for i in seq:yield i * idef negated(seq):for i in seq:yield -i# 构建管道
chain = negated(squared(integers()))for value in chain:print(value)

5. 生成器表达式

生成器表达式提供了一种更紧凑的方式来构建生成器。它们的语法和列表推导式类似,但使用圆括号而不是方括号。

# 生成器表达式示例
squares = (x*x for x in range(10))for square in squares:print(square)

小结

生成器是 Python 中非常强大的工具,能够以极高的效率和灵活性处理数据。无论是处理大型数据集,实现复杂的算法,还是构建数据处理管道,生成器都能提供优雅和高效的解决方案。

---------------------------END---------------------------

▍学习资源推荐

零基础Python学习资源介绍

👉Python学习路线汇总👈
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(学习教程文末领取哈)
在这里插入图片描述

👉Python必备开发工具👈
在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python学习视频600合集👈
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述

👉实战案例👈
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

👉100道Python练习题👈
检查学习结果。
在这里插入图片描述
👉面试刷题👈
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

资料领取

上述这份完整版的Python全套学习资料已经上传CSDN官方,朋友们如果需要可以微信扫描下方CSDN官方认证二维码输入“领取资料” 即可领取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2822184.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

实现任意系统下载office文件的域控

一.背景 最近用户提出需求&#xff1a;某个系统A下载的excel文档需要进行权限控制&#xff0c;比如只能下载文档的用户&#xff08;即文档owner&#xff09;查看或者编辑&#xff0c;其他人想要查看或者编辑&#xff0c;需要文档owner进行手动设置&#xff0c;当然也可以手动取…

初识C语言—指针

.h 头文件&#xff08;函数的声明&#xff0c;类型的声明&#xff0c;头文件的包含&#xff09; .c 源文件&#xff08;函数实现&#xff09; 浮点数的四舍五入&#xff0c;不能用你肉眼看到的数值来计算&#xff0c;因为浮点数在内存中有可能不能精确保存。 内存&#xff1a…

ICML23 - Synthetic Data for Model Selection

前言 如果你对这篇文章感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 本文关注的问题为&#xff1a;是否可以使用合成数据&#xff08;Synthetic Data&#xff09;用于模型选择&#xff1f;即不…

多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网络多输入多输出预测

多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网…

MySQL 外键约束 多表联查 联合查询

外键约束 外键用来让两张表的数据之间建立连接&#xff0c;从而保证数据的一致性和完整性。 有一张学生表和班级表&#xff0c;学生表通过班级表的ID引用到该班级&#xff0c;从而进行关联&#xff0c;而通过外键约束可以保证数据的一致性完整性。 如学生ID18关联到课程ID1号…

瑞吉苍穹外卖如何拓展?已经经过不同公司多轮面试。项目中会问到哪些问题?以及问题如何解决?

别催了&#xff0c;别催了&#xff0c;先收藏吧。 作者大大正在加班加点完成。 文章会尽快发布&#xff0c;关注收藏&#xff0c;尽请期待。 想要加入并查阅作者的知识库可以联系作者 不要白嫖&#xff0c;通过后&#xff0c;附上关注和收藏截图。 已有众多小伙伴加入 目前…

MySql安全加固:可信IP地址访问控制 设置密码复杂度

MySql安全加固&#xff1a;可信IP地址访问控制 & 设置密码复杂度 1.1 可信IP地址访问控制1.2 设置密码复杂度 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1.1 可信IP地址访问控制 当您在创建用户时使用’%作为主机部分&#xff0c;…

Day20-磁盘管理

Day20-磁盘管理 1. cut 切:2. 磁盘历史和内外部物理结构介绍2.1 磁盘发展趋势和实现措施2.2 磁盘知识的体系结构2.3 机械磁盘的外部结构2.4 SSD固态硬盘的外部结构2.5 固态硬盘内部结构2.6 缓存在服务器各硬件上的速度和大小对比另类维度图解&#xff0c;从上到下由高速到低速&…

2024现代Android开发趋势

2024现代Android开发趋势 在当今的Android开发领域&#xff0c;我们看到了许多令人兴奋的技术和趋势&#xff0c;这些技术和趋势正在改变着应用程序的开发方式和用户体验。让我们一起深入探讨2024年现代Android开发的主要方向和关键技术。 无处不在的Kotlin Kotlin已经成为An…

202435读书笔记|《半小时漫画中国史》——读点经济学与历史,生活更美好,趣味烧脑土地制度、商鞅变法、华丽丽的丝绸之路这里都有

202435读书笔记|《半小时漫画中国史》——读点经济学与历史&#xff0c;生活更美好&#xff0c;趣味烧脑土地制度、商鞅变法、华丽丽的丝绸之路这里都有 1. 土地政策、度量衡及税收2. 商鞅变法3. 西汉经济4. 西汉盐铁大辩论5. 西汉丝绸之路 《半小时漫画中国史&#xff1a;经济…

吸猫毛空气净化器哪个好?推荐除猫毛效果好宠物空气净化器品牌

当下有越来越多的家庭选择养宠物&#xff01;尽管家里变得更加温馨&#xff0c;但养宠可能会带来异味和空气中的毛发增多可能会带来健康问题&#xff0c;这是一个大问题&#xff01; 不想家里弥漫着异味&#xff0c;特别是来自宠物便便的味道&#xff0c;所以需要一款能够处理…

打印100-200之间的素数

#include <stdio.h>int prime(int n){int i 1;for(i 2;i < n;i){if(n % i 0)return 0;}return 1; } //打印100-200之间的素数 int main() {int n 0;int j 100;for(j 100;j < 200;j){if(prime(j)){printf("%d是素数\n",j);n;}}printf("100-200…

【center-loss 中心损失函数】 原理及程序解释(更新中)

文章目录 前言问题引出open-set问题抛出 解决方法softmax函数、softmax-loss函数解决代码&#xff08;center_loss.py&#xff09;原理程序解释 代码运用 如何梯度更新首先了解一下基本的梯度下降算法然后 补充&#xff1a;外围知识模型 前言 学习一下&#xff1a; 中心损失函…

【刷题】位运算

消失的两个数字 消失的两个数字 “单身狗”进阶版思路 class Solution { public:vector<int> missingTwo(vector<int>& nums) {int ret 0;int n nums.size();for(int i 0; i < n; i){ret ^ (nums[i] ^ i);}ret ^ (n ^ (n 1) ^ (n 2));// 按位异或的…

94. 递归实现排列型枚举 刷题笔记

思路 依次枚举 每个位置用哪个数字 要求按照字典序最小来输出 而每次搜索下一层时i都是从1开始 也就是说 如果有小的数可以填上 那么该方案会填上这个数字 例如 当n等于3 第一次搜索 1 2 3输出后返回 返回后此时i3 第二个位置填3 1 3 2 输出后返回 此时返回到第一层…

如何用Python检查时间序列数据是否平稳?

时间序列数据通常以其时间性质为特征。这种时间性质为数据增加了趋势或季节性&#xff0c;使其与时间序列分析和预测兼容。如果时间序列数据不随时间变化或没有时间结构&#xff0c;则称其为静态数据。因此&#xff0c;检查数据是否平稳是非常必要的。在时间序列预测中&#xf…

基于粒子群优化算法的图象聚类识别matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于粒子群优化算法的图象聚类识别。通过PSO优化方法&#xff0c;将数字图片的特征进行聚类&#xff0c;从而识别出数字0~9. 2.测试软件版本以及运行结果展示 M…

智能咖啡厅助手:人形机器人 +融合大模型,行为驱动的智能咖啡厅机器人(机器人大模型与具身智能挑战赛)

智能咖啡厅助手&#xff1a;人形机器人 融合大模型&#xff0c;行为驱动的智能咖啡厅机器人(机器人大模型与具身智能挑战赛) “机器人大模型与具身智能挑战赛”的参赛作品。的目标是结合前沿的大模型技术和具身智能技术&#xff0c;开发能在模拟的咖啡厅场景中承担服务员角色并…

Flutter中的三棵树

Widget Tree&#xff1a; 页面配置信息。 Element Tree&#xff1a; Widget tree的实例化对象&#xff0c;创建出renderObject&#xff0c;并关联到element.renderobject属性上&#xff0c;最后完成RenderObject Tree的创建。 RenderObject Tree&#xff1a;完成布局和图层绘制…

自测-1 打印沙漏

文章预览&#xff1a; 题目算法代码 题目 算法 以前做过这个&#xff0c;那次是c语言写的&#xff0c;一点一点处理一层一层完成&#xff0c;这次我换了一种语言用了另一种思想使用递归去写&#xff0c;还是我们要先求出应该有多少层这个很容易&#xff0c;中间输出部分我们算…