【100天精通python】Day24:python 迭代器,生成器,修饰器应用详解与示例

news2025/1/16 15:05:39

 目录

 专栏导读 

1 迭代器,生成器,修饰器概述

1.1 概述

1.2 应用场景

2 语法与示例

2.1 迭代器

2.2 生成器

2.3 修饰器

3 综合应用案例


专栏导读 

专栏订阅地址:https://blog.csdn.net/qq_35831906/category_12375510.html


1 迭代器,生成器,修饰器概述

1.1 概述

  1. 迭代器(Iterators): 迭代器是一个对象,它实现了迭代协议,可以遍历容器中的元素。迭代器必须包含 __iter__()__next__() 两个方法。__iter__() 方法返回迭代器对象自身,__next__() 方法返回容器中的下一个元素。当容器中的元素遍历完毕时,__next__() 应该引发 StopIteration 异常。

  2. 生成器(Generators): 生成器是一种特殊的迭代器,它允许我们更简洁地定义迭代器。生成器使用 yield 关键字来产生下一个值,而不是使用 return 返回结果。生成器函数在每次调用 yield 时暂停,并在下一次迭代时从上一次暂停的位置恢复执行。这样的特性使得生成器函数更加简洁和高效。

  3. 修饰器(Decorators): 装饰器是一种高阶函数,它可以用来修改其他函数的行为。装饰器的输入是一个函数,并返回一个新的函数,通常包装了原始函数,从而允许在不修改原始函数代码的情况下添加功能。装饰器可以用于在函数执行前后添加额外的逻辑,例如日志记录、权限验证、性能分析等。

        这些概念在 Python 中是非常重要的,它们提供了很多便利的方式来处理数据、优化代码和实现代码复用。迭代器和生成器使得处理大量数据时更加高效,而装饰器则使得代码更加模块化和易于维护。通过合理地运用这些概念,可以写出更加优雅和功能强大的 Python 代码。

1.2 应用场景

        迭代器、生成器和修饰器是在不同编程场景中广泛使用的 Python 编程工具。以下是它们的常见编程场景:

  1. 迭代器的编程场景

    • 遍历数据集:迭代器允许在遍历大型数据集时节省内存,因为它们按需逐个获取数据,而不是一次性加载整个数据集到内存中。
    • 文件处理:对于大型文件,使用迭代器可以逐行读取和处理数据,而无需一次性将整个文件读入内存。
    • 自定义容器:通过实现迭代器协议,我们可以创建自定义的容器对象,例如树、图等,从而可以使用 Python 的 for 循环来遍历容器中的元素。
  2. 生成器的编程场景

    • 大数据集的处理:生成器非常适合处理大型数据集,因为它们按需生成数据,避免了一次性加载所有数据到内存中。
    • 无限序列:生成器可以生成无限长度的序列,例如斐波那契数列、素数序列等。
    • 延迟计算:使用生成器可以实现延迟计算,只有在需要时才生成数据,这在某些情况下可以提高性能。
  3. 修饰器的编程场景

    • 日志记录:修饰器可以用于为函数添加日志记录功能,记录函数的调用信息、参数和执行时间。
    • 性能分析:通过修饰器,我们可以测量函数的执行时间,从而进行性能分析和优化。
    • 权限验证:修饰器可以用于对函数进行权限验证,确保只有具有特定权限的用户可以执行函数。
    • 缓存结果:修饰器可以用于缓存函数的结果,避免重复计算,提高函数的执行效率。

综合应用场景:

  • 使用生成器处理大型数据集,并结合修饰器记录数据处理的日志和性能。
  • 使用迭代器遍历大型文件,并结合修饰器实现权限验证和缓存文件处理结果。
  • 使用生成器生成无限序列,例如生成斐波那契数列,并结合修饰器记录序列的计算时间和结果。

        总结:迭代器、生成器和修饰器在 Python 编程中都有着广泛的应用场景。它们使代码更加高效、灵活和易于维护,特别是在处理大型数据集和复杂任务时,它们的优势尤为明显。


2 语法与示例

2.1 迭代器

        在 Python 中,迭代器(Iterators)是一种用于遍历容器中元素的机制。它提供了一种简单而统一的方式来访问集合中的每个元素,而无需了解集合的内部结构。迭代器在处理大数据集时非常有用,因为它们不需要一次性加载整个数据集到内存中,而是按需逐个获取数据,从而节省内存和提高性能。

        Python中的许多内置数据类型都支持迭代,例如列表、元组、字典、集合等。迭代器的核心思想是通过 __iter__()__next__() 方法来实现遍历。当我们调用 iter(iterable) 时,它会返回一个迭代器对象,然后我们可以通过 next(iterator) 来获取容器中的下一个元素,直到所有元素遍历完毕,此时会引发 StopIteration 异常。

下面是一个简单的迭代器示例:

class MyIterator:
    def __init__(self, data):
        self.data = data
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= len(self.data):
            raise StopIteration
        value = self.data[self.index]
        self.index += 1
        return value

# 使用自定义迭代器遍历列表
my_list = [1, 2, 3, 4, 5]
my_iterator = MyIterator(my_list)
for item in my_iterator:
    print(item)

输出:

1
2
3
4
5

在上面的示例中,我们定义了一个名为 MyIterator 的迭代器类,并在其中实现了 __iter__()__next__() 方法。然后,我们使用自定义的迭代器遍历了一个列表 my_list

值得注意的是,Python 提供了内置函数 iter()next(),因此我们在实际编程中很少需要自己定义迭代器类。直接使用 iter()next() 即可对可迭代对象进行迭代。

my_list = [1, 2, 3, 4, 5]
my_iterator = iter(my_list)
while True:
    try:
        item = next(my_iterator)
        print(item)
    except StopIteration:
        break

输出结果与之前相同

1
2
3
4
5

这里我们使用 iter()next() 函数来手动遍历列表,当遇到 StopIteration 异常时停止遍历。

总结:迭代器是 Python 中非常强大且常用的特性,它使得遍历数据变得简单而高效。无论是自定义迭代器类还是使用内置的 iter()next() 函数,迭代器在处理数据集时都是非常有用的。


2.2 生成器

        在 Python 中,生成器(Generators)是一种特殊类型的迭代器,它使用 yield 关键字来产生值,而不是使用 return 返回结果。生成器函数的执行在每次调用 yield 时暂停,而在下一次迭代时从上一次暂停的位置继续执行。这种特性使得生成器函数更加简洁、高效,并且节省内存。

        生成器的好处在于它不需要一次性将所有数据加载到内存中,而是按需生成数据。这在处理大量数据时非常有用,因为它可以减少内存占用并提高程序性能。

下面是一个简单的生成器示例:

def countdown(n):
    while n > 0:
        yield n
        n -= 1

# 使用生成器遍历倒计时
for i in countdown(5):
    print(i)

输出

5
4
3
2
1

         在上面的示例中,我们定义了一个名为 countdown 的生成器函数。它在每次循环中使用 yield 关键字产生一个倒计时的值,并在下一次迭代时从上一次暂停的位置继续执行。因此,每次迭代都会输出一个倒计时的值。

        值得注意的是,生成器函数并不返回一个值,而是生成一个迭代器。我们可以通过调用生成器函数来获得生成器对象,并使用它进行迭代。当所有值都生成完毕后,生成器会引发 StopIteration 异常。

        除了通过 yield 来定义生成器,Python 还支持使用生成器表达式来快速创建生成器。生成器表达式类似于列表推导式,但使用圆括号而不是方括号。

示例:

# 使用生成器表达式生成一个包含 1 到 5 的生成器
my_generator = (x for x in range(1, 6))

# 遍历生成器并输出值
for item in my_generator:
    print(item)

输出

1
2
3
4
5

 生成器是 Python 中强大而灵活的工具。通过使用 yield 关键字定义生成器函数或生成器表达式,我们可以在处理大数据集时节省内存、提高性能,并使代码更加简洁。


2.3 修饰器

        修饰器(Decorators)是 Python 中的一种高级功能,它允许我们在不修改原始函数代码的情况下,为函数添加额外的功能或行为。修饰器本质上是一个函数,它接受另一个函数作为参数,并返回一个新的函数。通过这种方式,我们可以在调用函数之前、之后或在函数执行过程中注入一些通用的逻辑。

        修饰器的语法使用 @ 符号,将修饰器应用到目标函数之前。

让我们看一个简单的示例:

# 定义一个简单的修饰器函数
def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

# 使用修饰器来装饰函数
@my_decorator
def say_hello():
    print("Hello!")

# 调用被装饰的函数
say_hello()

输出:

Something is happening before the function is called.
Hello!
Something is happening after the function is called.

 在上面的例子中,我们定义了一个名为 my_decorator 的修饰器函数,它接受一个函数 func 作为参数,并返回一个新的函数 wrapper。在 wrapper 函数内部,我们添加了额外的逻辑,即在目标函数 func 被调用之前和之后打印出一些信息。

然后,我们使用 @my_decorator 语法将 my_decorator 修饰器应用到函数 say_hello 上,相当于执行了以下操作:

say_hello = my_decorator(say_hello)

这样,当我们调用 say_hello() 函数时,实际上是调用了被修饰后的 wrapper 函数,从而在打印 "Hello!" 之前和之后分别执行了额外的逻辑。

除了上述示例外,修饰器还可以带有参数,使其更加灵活。例如:

def repeat(num_times):
    def my_decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(num_times):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return my_decorator

@repeat(num_times=3)
def say_hello(name):
    print(f"Hello, {name}!")

say_hello("John")

 输出:

Hello, John!
Hello, John!
Hello, John!

        在这个例子中,我们定义了一个带有参数的修饰器 repeat,它可以指定函数执行的次数。通过使用 @repeat(num_times=3) 语法,我们将 repeat 修饰器应用到 say_hello 函数上,并指定该函数将会被执行三次。

        总结:修饰器是 Python 中一种强大且灵活的编程工具,它使得代码更加模块化、可读性更高,并允许在不修改原始函数代码的情况下添加通用的逻辑。通过使用修饰器,我们可以轻松地实现日志记录、性能分析、权限验证等通用功能,从而使代码更加优雅和可维护。


3 综合应用案例

        假设你有一个包含大量整数的列表,现在需要对其中的每个整数进行平方运算,并在每次运算前后记录日志,包括函数的执行时间。

要求实现一个程序,包含以下功能:

  1. 定义一个生成器函数 square_generator(data),该函数接受一个整数列表 data 作为参数,并返回一个生成器。生成器会逐个生成列表中每个整数的平方值。
  2. 定义一个修饰器函数 log_decorator(func),该函数接受一个函数 func 作为参数,并返回一个新的函数 wrapper。在 wrapper 函数内部,它会记录 func 函数的执行时间,并输出执行时间日志。
  3. 将修饰器 log_decorator 应用到生成器函数 square_generator 上,创建一个新的经过修饰的生成器函数 log_square_generator
  4. 创建一个包含大量整数的列表 data_list,调用经过修饰的生成器函数 log_square_generator(data_list),并观察运行时间的日志输出。

最终,程序能够处理大量数据并自动记录执行时间,使代码更加高效和可维护。

代码如下:

import time

# 生成器函数:平方生成器
def square_generator(data):
    for item in data:
        yield item ** 2

# 修饰器函数:日志记录
def log_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Function {func.__name__} executed in {end_time - start_time:.6f} seconds.")
        return result
    return wrapper

# 经过修饰的生成器函数:带有日志记录的平方生成器
@log_decorator
def log_square_generator(data):
    for item in data:
        yield item ** 2

# 创建一个大型数据集的列表
data_list = list(range(1, 1000000001))

# 使用经过修饰的生成器处理数据,并观察日志输出
for square in log_square_generator(data_list):
    pass

输出结果如下:

       以上案例中,我们首先定义了 square_generator 生成器函数,它可以将列表中的每个元素平方后返回。然后,我们定义了 log_decorator 修饰器函数,用于记录函数的执行时间和参数。

        接下来,我们将修饰器应用到 square_generator 上,创建一个新的经过修饰的生成器函数 log_square_generator,它将在运算前后记录日志。

     最后,我们创建一个大型数据集的列表,并使用经过修饰的生成器函数 log_square_generator 来处理数据,并观察日志输出。在运行代码时,你会看到生成器的运行时间被记录下来。

        这个完整版的案例演示了如何利用迭代器、生成器和修饰器来处理大型数据集,并添加通用的日志记录功能,从而使代码更加高效、灵活和易于维护。

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

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

相关文章

助力工业物联网,工业大数据之ST层的设计【二十五】

文章目录 04:ST层的设计05:服务域:工单主题分析06:服务域:工单主题实现 04:ST层的设计 目标:掌握ST层的设计 路径 step1:功能step2:来源step3:需求 实施 功…

HTML之表单标签

目录 表单标签 Form表单 定义: 基本语法结构: form属性: enctyoe属性 fieldeset标签 fieldeset属性 legend标签 label标签 优势 label属性 input标签 input属性 input标签中的type属性 text text输入框有以下配套属性 searc bu…

【Android】控件与布局入门 - 简易计算器

目录 1. 基础开发环境 2. 计算器的布局和相关按钮 3. 计算器的主要运算逻辑 4. APK 文件 5. 项目源码 1. 基础开发环境 JDK:JDK17 Android Studio:Android Studio Giraffe | 2022.3.1 Android SDK:Android API 34 Gradle: gradle-8.0-bi…

大屏可视化(VUE2 + DataV)

准备:安装vue脚手架(vue/cli),创建vue2项目,安装dataV,在main.js入口文件中引入dataV。 dataV地址:DataV 一、dataV安装 npm install jiaminghi/data-view 二、main.js import Vue from vu…

postgis mvt矢量切片 django drf mapboxgl

postgis mvt矢量切片 django drf mapboxgl 0.前提 [1] 静态的矢量切片可以采用 tippecanoe 生成,nginx代理,这种数据是不更新的; [2] 动态的矢量切片,一般采用postgis生成。基本上矢量切片80%的厂商都采用postgis,确实…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)七:工作台界面实现

一、本章内容 本章实现工作台界面相关内容,包括echart框架引入,mock框架引入等,实现工作台界面框架搭建,数据加载。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 基于VUE3+Layui从头搭建通用后台管理系统合集-工作台界面布局实现 五、…

大麦订单生成器 大麦一键生成订单

后台一键生成链接,独立后台管理 教程:修改数据库config/Conn.php 不会可以看源码里有教程 下载源码程序:https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

上榜 Gartner | 中国领先的实时数据管理厂商 DolphinDB

在 Gartner 近日发布的 Hype Cycle for Data, Analytics and AI in China, 2023 报告中,DolphinDB 位列实时数据管理代表厂商。这是自去年 DolphinDB 入选 Gartner《中国数据库管理系统供应商甄选》后,又一次凭借领先的产品能力获得国际权威第三方分析机…

Python(五十九)字典的实现原理

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

【css】css实现水平和垂直居中

通过 justify-content 和 align-items设置水平和垂直居中&#xff0c; justify-content 设置水平方向&#xff0c;align-items设置垂直方向。 代码&#xff1a; <style> .center {display: flex;justify-content: center;align-items: center;height: 200px;border: 3px…

DM开启慢日志监控并用DmLog工具分析数据

工具描述 DMLOG用于对达梦SQL日志进行统计分析&#xff0c;便于SQL优化人员进行查看捕获关键信息&#xff0c;不提供SQL优化建议。DMLOG用java语言编写&#xff0c;不受操作系统平台限制&#xff0c;大小不超过10M&#xff0c;在安装好Java环境后&#xff0c;可在各平台运行。 …

全面了解CPU Profiler:解读CPU性能分析工具的核心功能与用法

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、使用3.1 通过调用系统API3.2 通过Android Stu…

填补5G物联一张网,美格智能快速推进RedCap商用落地

自5G R17版本标准冻结以来&#xff0c;RedCap一直引人注目。2023年更是5G RedCap突破性发展的一年&#xff0c;从首款5G RedCap调制解调器及射频系统——骁龙X35发布&#xff0c;到国内四大运营商发布RedCap技术白皮书&#xff0c;芯片厂商、模组厂商、运营商及终端企业都在积极…

MySQL索引题分析

前言&#xff1a;该篇随笔通过一些案例&#xff0c;对索引相关的题进行分析。 0.准备 #1.创建test表&#xff08;测试表&#xff09;。 drop table if exists test; create table test( id int primary key auto_increment, c1 varchar(10), c2 varchar(10), c3 varchar(10), …

KCC@南京开源读书会-开源大咖云聚南京等你来

KCC&#xff0c;全称 KAIYUANSHE City Community&#xff08;中文&#xff1a;开源社城市社区&#xff09;是由开源社发起&#xff0c;旨在让开源社区在每个城市落地生根的地域性开源组织。自2023年2月份发起以来&#xff0c;我们已经在南京、上海、深圳、北京、硅谷、新加坡、…

用思维导图带你解读电子商务数据分析基本指标,产品、运营者必看

随着时代的发展&#xff0c;越来越多的人参与到电商之中。电商即电子商务&#xff0c;是依托现代信息网络技术&#xff0c;以商品交换为中心的新型商务贸易活动。电商可并不简单&#xff0c;做好电商又有哪些关键呢&#xff1f;别急&#xff0c;再此之前&#xff0c;需要先了解…

SunnyUI美化winform

SunnyUI美化winform 一.效果展示二.SunnyUI是什么&#xff1f;三.如何使用SunnyUI?3.1 将文件夹放入Debug目录下3.2 在项目文件中添加SunnyUI库3.3 添加SunnyUI.dll文件 四.使用SunnyUI库美化4.1 打开Demo程序copy 五.结语 一.效果展示 二.SunnyUI是什么&#xff1f; Sunny其…

【雕爷学编程】Arduino动手做(181)---Maixduino AI开发板8

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

Vue [Day1]

学习视频&#xff1a; 【2023新版Vue2Vue3基础入门到实战项目全套教程&#xff0c;自学前端vue就选黑马程序员&#xff0c;一套全通关&#xff01;】 初识VUE Vue2官网 https://v2.cn.vuejs.org Vue3官网 https://cn.vuejs.org <!DOCTYPE html> <html lang"en&…

遥感、GIS、GPS在土壤空间数据分析、适应性评价、制图、土壤普查中怎样应用?

摸清我国当前土壤质量与完善土壤类型&#xff0c;可以为守住耕地红线、保护生态环境、优化农业生产布局、推进农业高质量发展奠定坚实基础&#xff0c;为此&#xff0c;2022年初国务院印发了《关于开展第三次全国土壤普查的通知》&#xff0c;决定自2022年起开展第三次全国土壤…