【Python基础】Python迭代器与生成器(两种强大工具)

news2024/11/24 15:36:38

本文收录于 《Python编程入门》专栏,从零基础开始,分享一些Python编程基础知识,欢迎关注,谢谢!

文章目录

    • 一、前言
    • 二、迭代器
        • 2.1 创建迭代器
        • 2.2 自定义迭代器
        • 2.3 处理大型文件
    • 三、生成器
    • 四、生成器表达式
    • 五、实际应用案例
        • 5.1 数据库查询
        • 5.2 网络数据流处理
    • 六、总结

一、前言

在Python中,迭代器与生成器是两种非常强大的工具,它们可以帮助我们有效地处理大量数据,特别是在需要逐个访问元素的情况下。

本文将介绍迭代器和生成器的概念、用法以及它们在实际案例中的应用。

  • 什么是Python?

    Python是由荷兰人吉多·范罗苏姆于1990年初设计的一门高级编程语言,该语言应用领域非常广泛,尤其在数据科学、人工智能、游戏开发等领域,它已经成为最受欢迎的程序设计语言之一,非常适合新手学习。

    Python语言标准库官方使用手册:https://docs.python.org/zh-cn/3/library/turtle.html#turtle-methods

  • Python语言有哪些特点?

    1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。

    2.易于阅读:Python代码定义的更清晰。

    3.易于维护:Python的成功在于它的源代码是相当容易维护的。

    4.丰富的库:Python的最大的优势之一具有丰富的标准库,并且跨平台的,在UNIX,Windows和Mac兼容很好。

    5.面向对象:Python支持面向对象编程,在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。

    6.可移植:基于其开放源代码的特性,Python已经被移植(也就是使其工作)到许多平台。

    7.可扩展:如果你需要一段运行很快的关键代码,或者是想要编写一些不愿开放的算法,你可以使用C或C++完成那部分程序,然后从你的Python程序中调用。

    8.可嵌入: 你可以将Python嵌入到C/C++程序,让你的程序的用户获得"脚本化"的能力。

    在这里插入图片描述

二、迭代器

迭代器是Python中访问集合元素的一种方式。它是一个可以记住遍历位置的对象,通过迭代器,我们可以从集合的第一个元素开始逐个访问,直到所有元素被访问完毕。迭代器有两个基本方法:iter() 和 next()。

2.1 创建迭代器

在Python中,字符串、列表或元组等对象都可以用于创建迭代器。例如:

list = [1,2,3,4]
it = iter(list)  # 创建迭代器对象

# 使用 next() 方法逐个获取元素
print(next(it))  # 输出 1
print(next(it))  # 输出 2

print("*******************")

# 使用 for 循环遍历迭代器
for x in it:
    print(x)  # 输出剩余元素 3 和 4
2.2 自定义迭代器

我们还可以通过在类中实现 iter() 和 next() 方法来创建自定义迭代器。例如,创建一个从1开始逐步递增的迭代器:

# 定义一个迭代器类
class MyNumbers:
    def __iter__(self):
        self.a = 1
        return self

    def __next__(self):
        x = self.a
        self.a += 1
        return x

# 创建迭代器对象,输出 1 到 10
myiter = MyNumbers()
for x in myiter:
    if x > 10:  # 限制迭代次数
        break
    print(x)  
2.3 处理大型文件

使用迭代器的一个实际案例是处理大型文件。假如我们有一个包含数百万行文本的日志文件,需要逐行读取并处理。如果一次性将整个文件读入内存,可能会导致内存溢出。这时就可以使用迭代器逐行读取文件内容,例如:

with open('large_log_file.log', 'r') as file:
    for line in file:  # file对象是一个迭代器
        process_line(line)  # 处理每一行

三、生成器

生成器是一种特殊的迭代器,它允许我们使用函数来创建迭代器。生成器函数使用yield关键字来一次生成一个值。当生成器函数被调用时,它会返回一个迭代器对象,这个对象可以用于迭代生成器函数中yield出来的值。

一个常见的使用生成器的案例是斐波那契数列生成。我们可以使用生成器函数来无限生成斐波那契数列中的值,而不需要在内存中维护整个数列,如下:

# 定义斐波那契数列生成类
def fib_generator():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b


# 创建生成类对象,生成若干个斐波那契数
fib_seq = fib_generator()
for fib_num in fib_seq:
    if fib_num > 10:  # 当斐波那契数大于10时停止生成
        break
    print(fib_num)

# 输出 0、1、1、2、3、5、8

PS:斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称“兔子数列”,其数值为:0、1、1、2、3、5、8、13、21、34……

四、生成器表达式

生成器表达式是创建生成器的一种简洁方式。它类似于列表推导式,但是使用圆括号()而不是方括号[]。生成器表达式会返回一个生成器,这个生成器可以逐个生成表达式计算出的值,而不需要一次性计算出所有值。

假设我们有一个列表,我们想要筛选出其中的所有偶数并计算它们的平方。这时可以使用生成器表达式来实现如下:

# 定义一个列表
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 使用生成器表达式,返回一个生成器对象
even_squares = (x**2 for x in numbers if x % 2 == 0)

# 循环生成器,输出结果
for square in even_squares:
    print(square)  
    # 输出4,16,36,64,100

五、实际应用案例

5.1 数据库查询

在使用数据库时,我们经常需要处理大量的查询结果。使用生成器可以逐个获取结果,而不是一次性将全部结果加载到内存中,从而节省了大量内存。

例如:

def db_query_generator(query):
    cursor = connection.cursor()
    cursor.execute(query)
    while True:
        row = cursor.fetchone()
        if row is None:
            break
        yield row

for row in db_query_generator("SELECT * FROM large_table"):
    process_row(row)
5.2 网络数据流处理

在处理网络数据流时,如实时日志分析或流媒体数据,我们可以使用生成器逐个处理数据包,避免一次性加载整个数据流到内存中。

例如:

def stream_data_generator(url):
    with requests.get(url, stream=True) as r:
        r.raise_for_status()
        for chunk in r.iter_content(chunk_size=8192):
            yield chunk

for chunk in stream_data_generator("http://example.com/large_data"):
    process_data_chunk(chunk)

六、总结

迭代器和生成器在Python中为我们提供了高效处理数据的工具。在处理大型数据集或需要无限序列的场景中,迭代器和生成器显得尤为重要。通过实际案例的学习,我们可以看到它们在文件处理、无限序列生成以及数据转换等方面的广泛应用。掌握迭代器和生成器的使用,可以让我们写出更加高效的Python的代码。

如果您对文章中内容有疑问,欢迎在评论区进行留言,我会尽量抽时间给您回复。如果文章对您有帮助,欢迎点赞、收藏。您的点赞,是对我最大的支持和鼓励,谢谢 :-)

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

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

相关文章

【数据结构初阶】队列接口实现及用队列实现栈超详解

文章目录 1. 概念1. 1 队列底层结构选型1. 2 队列定义 2. 接口实现2. 1 初始化2. 2 判空2. 3 入队列2. 4 出队列2. 5 队尾元素和队头元素和队列元素个数2. 6 销毁2. 7 接口的意义 3. 经典OJ题3. 1 用队列实现栈3. 1. 1 栈的定义3. 1. 2 栈的初始化3. 1. 3 入栈3. 1. 4 出栈3. 1…

计算机视觉(二)—— MDPI特刊推荐

特刊征稿 01 期刊名称: Applied Computer Vision and Pattern Recognition: 2nd Volume 截止时间: 摘要提交截止日期:2024年10月30日 投稿截止日期:2024年12月30日 目标及范围: 包括但不限于以下领域&#xff1a…

C++:线程库

C&#xff1a;线程库 threadthreadthis_threadchrono 引用拷贝问题 mutexmutextimed_mutexrecursive_mutexlock_guardunique_lock atomicatomicCAS condition_variablecondition_variable thread 操作线程需要头文件<thread>&#xff0c;头文件包含线程相关操作&#xf…

上班炒股会被开除吗?公司是如何发现员工上班炒股?一文告诉你答案!

随着互联网金融的发展&#xff0c;股票交易变得越来越便捷&#xff0c;不少上班族选择利用工作之余的时间来进行股票投资。 然而&#xff0c;这种行为是否合规&#xff1f;公司又是如何发现并处理这种情况的呢&#xff1f;本文将为您解答这些问题。 一、上班炒股是否合规&…

JAVA毕业设计175—基于Java+Springboot+vue3的医院预约挂号管理系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue3的医院预约挂号管理系统(源代码数据库)175 一、系统介绍 本项目前后端分离(可以改为ssm版本)&#xff0c;分为用户、医生、管理员三种角色 1、用户&#x…

交换机最常用的网络变压器分为DIP和SM

华强盛电子导读&#xff1a;交换机通用网络变压器插件48PIN最为常见 您好&#xff01;今天我要给您介绍一款真正能为您的工业生产带来变革的产品——华强盛工业滤波器。在如今这个高度数字化的工业时代&#xff0c;可靠的网络连接至关重要&#xff0c;而华强盛工业网络变压器就…

Smartbi体验中心新增系列Demo,用户体验更丰富

为进一步提升用户体验&#xff0c;让大家更直观地了解Smartbi产品在数据分析方面的功能优势&#xff0c;Smartbi体验中心近期新增了一系列Demo。这些更新旨在优化产品操作流程&#xff0c;并为用户提供更多真实场景下的应用参考。接下来&#xff0c;我们一起简要浏览此次体验中…

KEIL仿真时弹窗 “Cannot access target.”

现象 仿真时&#xff0c;点击暂停就会弹出下图窗口。 Cannot access target. Shutting down debug session. 解决方法 开启STM32的Debug&#xff0c;如下图。

基于WIFI的开关控制器设计与实现

本设计基于STC89C52RC单片机设计的WiFi开关器系统&#xff0c;旨在通过软硬件设计实现按键和手机APP远程同步控制4个继电器驱动3个LED灯、1个风扇&#xff0c;并且具备时间显示、开关状态显示、定时驱动&#xff0c;时间设定及保存等功能。该设计在硬件方面采用STC89C52单片机作…

软考中项(第三版) 项目成本管理总结

前言 系统集成项目管理工程师考试&#xff08;简称软考中项&#xff09;&#xff0c;其中案例分析也是很大一部分考试内容&#xff0c;目前正在学习中&#xff0c;现总结一些可能会考到的知识点供大家参考。 1.1、项目成本管理总线索 1、项目成本失控的原因 &#xff08;1&a…

python库安装失败问题

pip install XXXX 报错信息如下 D:\Dev>pip install D:\Dev\robotlib-0.0.33.tar.gz DEPRECATION: Loading egg at d:\app\dev\python\lib\site-packages\fs11a3_package-1.3-py3.11.egg is deprecated. pip 24.3 will enforce this behaviour change. A possible replace…

【机器学习】使用Numpy实现神经网络训练全流程

文章目录 网络搭建前向传播反向传播损失计算完整代码 曾经在面试一家大模型公司时遇到的面试真题&#xff0c;当时费力写了一个小时才写出来&#xff0c;自然面试也挂了。后来复盘&#xff0c;发现反向传播掌握程度还是太差&#xff0c;甚至连梯度链式传播法则都没有弄明白。 网…

solidity-19-fallback

接收ETH receive和fallback receive和callback是solidity中两个特殊的回调函数&#xff0c;一个处理接收ETH,一个处理不存在的函数调用。本质上就是吧fallback拆成了两个回调函数。我暂时不知道什么是fallback fallback调用不存在的函数时会被调用也就是这个函数是不是等价于…

视频转音频,分享这六种转换操作

视频转音频&#xff0c;随着多媒体技术的发展&#xff0c;人们越来越频繁地需要将视频中的音频部分提取出来单独使用。无论是为了制作播客、获取音乐片段还是其他需求&#xff0c;视频转音频都是一项非常实用的技能。为了让你轻松应对各种场合的需求&#xff0c;下文将为你详细…

day-55 不同路径

思路 动态规划&#xff1a;因为只能向右或向下移动&#xff0c;可以得出状态转换方程&#xff1a;dp[i][j]dp[i-1][j]dp[i][j-1] 解题过程 直接令第一行和第一列全为1&#xff0c;然后通过状态转换方程进行计算&#xff0c;返回dp[m-1][n-1]即可 Code class Solution {publi…

Centos挂载和删除nfs

一、Centos挂载nfs 1、安装NFS客户端软件 sudo yum install nfs-utils 2、 创建一个挂载点目录 mkdir -p /mnt/nfs 注意:目录可以随意创建 3、永久挂载nfs 即系统在每次启动后自动挂载NFS共享 (1)编辑 /etc/fstab vim /etc/fstab (2)添加nfs <nfs_server_ip&…

AI算法盒如何精准守护你的安全区域

在当今智能化时代&#xff0c;安全防范已成为社会各个领域的核心需求之一。万物AI算法盒&#xff0c;作为前沿科技的集大成者&#xff0c;其内置的区域人员入侵检测视觉算法&#xff0c;以卓越的性能和广泛的应用场景&#xff0c;为各行各业提供了高效、精准的安全解决方案。 核…

使用iperf3测试局域网服务器之间带宽

文章目录 一、下载安装1、windows2、centos 二、使用0、参数详解1、centos 一、下载安装 1、windows https://iperf.fr/iperf-download.php 拉到最下面选最新版&#xff1a; 2、centos yum install iperf3二、使用 0、参数详解 服务器或客户端&#xff1a; -p, --port #…

喧嚣漫天之际,重新审视以太坊的定位与路线图

价值捕获很重要&#xff0c;但现在讨论为时尚早。 作者&#xff1a;Mike Neuder&#xff08;以太坊基金会研究员&#xff09;&#xff1b;译者&#xff1a;Azuma&#xff1b;编辑&#xff1a;郝方舟 出品 | Odaily星球日报&#xff08;ID&#xff1a;o-daily&#xff09; 编者按…

Centos7通过Docker安装openGauss5.0.2并配置用户供Navicat连接使用

下载镜像 [rootiZ2ze3qc9ouxm10ykn3cvdZ ~]# docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/enmotech/opengauss:5.0.2 5.0.2: Pulling from ddn-k8s/docker.io/enmotech/opengauss 2ec76a50fe7c: Pull complete e48b50219b49: Pull complete 512e203af4…