14.Python生成器、迭代器、闭包、装饰器、元类、垃圾回收、内建函数

在 Python 中,生成器、迭代器、闭包、装饰器、元类、垃圾回收和内建函数是一些重要的概念和功能,它们对于编写高效、灵活的代码非常重要。下面我们逐一详细介绍这些概念及其用法。

1. 生成器(Generator)

生成器是一个函数,它返回一个迭代器,且能在函数中多次返回值而不丢失状态。生成器通过 yield 关键字来生成值,而不是像普通函数那样通过 return 返回。生成器的特点是懒加载(即按需生成数据)和节省内存。

示例:生成器
def count_up_to(max):count = 1while count <= max:yield count  # 使用 yield 返回一个值count += 1gen = count_up_to(5)
for num in gen:print(num)  # 输出 1 2 3 4 5

生成器每次调用 yield 时会暂停,并记住当前的状态,直到下次迭代时恢复。

2. 迭代器(Iterator)

迭代器是一个实现了 __iter__()__next__() 方法的对象。可以通过 for 循环或 next() 函数来获取序列中的下一个元素。当序列没有元素时,抛出 StopIteration 异常。

示例:自定义迭代器
class MyIterator:def __init__(self, start, end):self.current = startself.end = enddef __iter__(self):return selfdef __next__(self):if self.current > self.end:raise StopIterationself.current += 1return self.current - 1it = MyIterator(1, 5)
for num in it:print(num)  # 输出 1 2 3 4 5

3. 闭包(Closure)

闭包是指一个函数能够记住并访问其定义时的外部作用域中的变量,即使这个函数在外部作用域外部被调用。闭包可以用于函数工厂等场景。

示例:闭包
def outer(x):def inner(y):return x + y  # inner 函数引用了外部函数 outer 的变量 xreturn inneradd_5 = outer(5)  # 生成一个闭包
print(add_5(10))  # 输出 15

在这个例子中,inner 是一个闭包,它记住了 outer 函数中的变量 x,即使 outer 函数已经执行完毕。

4. 装饰器(Decorator)

装饰器是一种用于在运行时动态地修改函数或方法行为的机制。装饰器是高阶函数,接受一个函数作为参数,并返回一个新的函数。它常常用于日志记录、性能计时、权限控制等场景。

示例:装饰器
def decorator(func):def wrapper():print("函数执行前")func()print("函数执行后")return wrapper@decorator
def say_hello():print("Hello!")say_hello()  # 输出:
# 函数执行前
# Hello!
# 函数执行后

@decorator 是装饰器的语法糖,它会将 say_hello 函数传递给 decorator 函数,并用 wrapper 替换原函数。

5. 元类(Metaclass)

元类是用于创建类的类。每个类都是某个元类的实例。通过元类可以控制类的创建过程、修改类的属性和方法等。

示例:自定义元类
class MyMeta(type):def __new__(cls, name, bases, dct):# 修改类的属性或方法dct['greeting'] = 'Hello, world!'return super().__new__(cls, name, bases, dct)class MyClass(metaclass=MyMeta):passprint(MyClass.greeting)  # 输出 Hello, world!

在这个例子中,MyMeta 是一个元类,它在类 MyClass 被创建时添加了一个新的属性 greeting

6. 垃圾回收(Garbage Collection)

Python 中使用引用计数和垃圾回收机制来管理内存。当一个对象的引用计数降为 0 时,Python 会自动回收该对象的内存。Python 使用了 标记清除分代回收 的垃圾回收机制。通常,Python 用户无需手动释放内存,但可以通过 gc 模块控制和查看垃圾回收的过程。

示例:手动触发垃圾回收
import gcgc.collect()  # 手动触发垃圾回收

7. 内建函数(Built-in Functions)

Python 提供了许多内建函数,这些函数可以直接使用,无需导入模块。常用的内建函数包括 len(), type(), range(), sum(), sorted(), map(), filter() 等。

示例:常见内建函数
# len() 返回对象的长度
print(len([1, 2, 3]))  # 输出 3# type() 获取对象的类型
print(type(42))  # 输出 <class 'int'># range() 生成一个整数序列
for i in range(5):print(i)  # 输出 0 1 2 3 4# sum() 求和
print(sum([1, 2, 3]))  # 输出 6# sorted() 排序
print(sorted([3, 1, 2]))  # 输出 [1, 2, 3]# map() 应用函数到每个元素
result = map(lambda x: x * 2, [1, 2, 3])
print(list(result))  # 输出 [2, 4, 6]# filter() 过滤符合条件的元素
result = filter(lambda x: x > 2, [1, 2, 3])
print(list(result))  # 输出 [3]

总结

  • 生成器:使用 yield 返回一个惰性计算的迭代器,节省内存。
  • 迭代器:实现了 __iter____next__ 方法的对象,支持遍历。
  • 闭包:函数可以记住并访问其定义时的外部变量。
  • 装饰器:用于动态修改函数或方法行为的函数。
  • 元类:用于创建类的类,可以修改类的创建过程。
  • 垃圾回收:Python 使用自动垃圾回收机制管理内存,用户无需手动管理对象的内存。
  • 内建函数:Python 提供了多种内建函数来处理常见的任务,如计算长度、排序、映射等。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【BUUCTF逆向题】[WUSTCTF2020]level3(魔改base64)

一.[WUSTCTF2020]level3 打开IDA反汇编&#xff0c;发现就是base64加密 这里rand就是与&搭配设置奇偶数2分随机 但是根据提示不是标准base64加密 首先想到魔改密码表&#xff0c;追踪进去&#xff0c;发现没有什么变化啊 尝试对Base64字符串解码也不对 追踪密码表CtrlX发…

文字转语音(三)FreeTTS实现

项目中有相关的功能&#xff0c;就简单研究了一下。 说明 FreeTTS 是一个基于 Java 的开源文本转语音&#xff08;TTS&#xff09;引擎&#xff0c;旨在将文字内容转换为自然语音输出。 FreeTTS 适合对 英文语音质量要求低、预算有限且需要离线运行 的场景&#xff0c;但若需…

【Prometheus】prometheus结合cAdvisor监控docker容器运行状态,并且实现实时告警通知

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

HTML应用指南:利用GET请求获取全国海底捞门店位置信息

随着新零售业态的快速发展&#xff0c;门店位置信息的获取变得越来越重要。作为餐饮服务行业的先锋&#xff0c;海底捞不仅在服务质量上持续领先&#xff0c;还积极构建广泛的门店网络&#xff0c;以支持其不断增长的用户群体。为了更好地理解和利用这些数据&#xff0c;本篇文…

Arduino 第十六章:pir红外人体传感器练习

Arduino 第十六章&#xff1a;PIR 传感器练习 一、引言 在 Arduino 的众多有趣项目中&#xff0c;传感器的应用是非常重要的一部分。今天我们要学习的主角是 PIR&#xff08;被动红外&#xff09;传感器。PIR 传感器能够检测人体发出的红外线&#xff0c;常用于安防系统、自动…

Spring Data JPA 基本用法笔记整理

写在前面&#xff1a; 之前一直写MyBatis&#xff0c;去年开始做的这个新项目用的是JPA&#xff0c;整理了一些基本使用方法 1、 集成方法&#xff1a; 1.1 引入依赖 <!--spring data 依赖--> <dependency><groupId>org.springframework.data</groupI…

leetcode-495.提莫攻击

leetcode-495.提莫攻击 文章目录 leetcode-495.提莫攻击一.题目描述二.代码提交三.解释 一.题目描述 二.代码提交 #include <vector> using namespace std;int findPoisonedDuration(vector<int>& timeSeries, int duration) {int total 0;for (int i 0; i …

团队没有测试人员,要快速完成测试?

有同学提问:产品没有专职的测试人员,要怎么才能快速完成测试? 先说结论,这个问题并没有标准答案 没有测试岗位只是没有专门负责这个职能的人员,但测试这个事并没有消失 快速完成测试,其实应该换种说法,就是快速建立质量信心。 因为测试无穷尽,所以没有绝对的完成测试…

光学相位---描述周期性波动现象

相位是描述周期性波动现象的一个重要物理量&#xff0c;用来表示波在某一时刻或位置上的振荡状态。它是时间、空间和频率的函数&#xff0c;通常用角度&#xff08;单位为度或弧度&#xff09;来表示。对于光波而言&#xff0c;其相位可以通过波的传播距离、波长以及波数来定义…

一、通义灵码插件保姆级教学-IDEA(安装篇)

JetBrains IDEA 中安装教学 第一步&#xff1a;事先准备 支持系统&#xff1a;Windows 7 ~ Windows 11、Linux、macOS&#xff1b;下载并安装兼容的 JetBrains IDEA 2020.3 及以上版本&#xff1b; 第二步&#xff1a;在 IntelliJ IDEA 中安装通义灵码 方法 1&#xff1a;通…

系统之间数据对接怎么做

系统之间数据对接怎么做&#xff1a;数据同步功能详解 在当今数字化时代&#xff0c;企业往往依赖于多个系统来管理不同的业务流程。这些系统可能包括客户关系管理&#xff08;CRM&#xff09;、企业资源规划&#xff08;ERP&#xff09;、供应链管理&#xff08;SCM&#xff…

Java NIO ByteBuffer 详解

什么是 ByteBuffer ByteBuffer 是 Buffer 的一个具体实现&#xff0c;专门用于存储和操作字节数据。它提供了高效的、基于内存的 I/O 数据处理方式。 Buffer 类是构建 Java NIO 的基础&#xff0c;其中 ByteBuffer 类是 Buffer 子类中最受欢迎的。这是因为字节类型是最通用的…

OnlyOffice编辑器下载失败排查与解决方案

OnlyOffice编辑器下载失败排查与解决方案 问题描述原因分析&#xff1a;1. 检查后端服务地址是否正确2. 使用内部IP地址访问后端服务 其他常见问题 在使用OnlyOffice编辑器时&#xff0c;常见的问题之一是无法正确显示图片或打开文档。 具体表现为提示图片URL地址不正确或打开…

栈的实现-

栈 栈的概念及结构 栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除的一端称为栈顶&#xff0c;另一端称为栈底。栈中元素遵循**后进先出 LIFO&#xff08;Last In First Out&#xff09;**的原则。 压栈&#xff1a;栈的…

在vivado中对数据进行延时,时序对齐问题上的理清

在verilog的ISP处理流程中&#xff0c;在完成第一个模块的过程中&#xff0c;我经常感到困惑&#xff0c;到底是延时了多少个时钟&#xff1f;今日对这几个进行分类理解。 目录 1.输入信号激励源描述 1.1将数据延时[9]个clk 1.2将vtdc与hzdc延时[9]个clk(等价于单bit的数据…

singleTaskAndroid的Activity启动模式知识点总结

一. 前提知识 1.1. 任务栈知识 二. Activity启动模式的学习 2.1 standard 2.2 singleTop 2.3.singleTask 2.4.singleInstance 引言&#xff1a; Activity作为四大组件之一&#xff0c;也可以说Activity是其中最重要的一个组件&#xff0c;其负责调节APP的视图&#xff…

Tetragon:一款基于eBPF的运行时环境安全监控工具

关于Tetragon Tetragon是一款基于eBPF的运行时环境安全监控工具&#xff0c;该工具可以帮助广大研究人员检测并应对安全重大事件&#xff0c;例如流程执行事件、系统调用活动、I/O活动&#xff08;包括网络和文件访问等&#xff09;。 在 Kubernetes 环境中使用时&#xff0c;…

提升编程效率,体验智能编程助手—豆包MarsCode一键Apply功能测评

提升编程效率&#xff0c;体验智能编程助手—豆包MarsCode一键Apply功能测评 &#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 目录 引言豆包…

卷积定理理解:如何将系数多项式乘法降到n*log n的复杂度?

目标 两个向量&#xff08;每个向量各自对应一个多项式&#xff09;的简单相乘&#xff08;时间复杂度 O ( n 2 ) O(n^2) O(n2)&#xff09;可以通过两个向量各自对应的离散傅里叶变换的相乘&#xff08;时间复杂度 O ( n ⋅ lg n ) O(n\cdot \text{lg }n) O(n⋅lg n)&#xf…

【devops】 Git仓库如何fork一个私有仓库到自己的私有仓库 | git fork 私有仓库

一、场景说明 场景&#xff1a; 比如我们Codeup的私有仓库下载代码 放入我们的Github私有仓库 且保持2个仓库是可以实现fork的状态&#xff0c;即&#xff1a;Github会可以更新到Codeup的最新代码 二、解决方案 1、先从Codeup下载私有仓库代码 下载代码使用 git clone 命令…