当前位置: 首页 > news >正文

10.18Python基础迭代器生成器_函数式编程

Python迭代器与生成器

1. 迭代器 Iterator

什么是迭代器

  • 迭代器是访问集合元素的一种方式。
  • 迭代器是一个可以记住遍历的位置的对象。
  • 迭代器可以重复使用,而不会像列表那样在迭代时被修改。
    迭代器函数iter和next
函数说明
iter(iterable)从可迭代对象中返回一个迭代器,iterable必须是能提供一个迭代器的对象
next(iterator)从迭代器iterator中获取下一个记录,如果无法获取一下条记录,则触发 StopIteration 异常
迭代器说明
  • 迭代器对象可以使用 next() 函数获取下一个元素。
  • 使用 iter() 函数可以从任何可迭代对象中获取迭代器。
    迭代器示例:
# 示例 可迭代对象
L = [1, 2, 3, 4, 5]
it = iter(L)  # 从列表L中获取迭代器
print(next(it))  # 输出 1
print(next(it))  # 输出 2

迭代器的用途

  • 迭代器对象能用 next() 函数获取下一个元素,这对于大数据集合特别有用,因为它不需要在内存中存储所有元素。
    迭代器函数iter和next 示例:
L = [1, 2, 3, 4, 5]
it = iter(L)
for i in it:print(i)

2. 生成器

生成器是在程序运行时生成数据,与容器不同,它通常不会在内存中保留大量的数据,而是现用现生成。

  • yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。
  • 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
  • 每次使用 yield 语句生产一个值后,函数都将暂停执行,等待被重新唤醒。
  • yield 语句相比于 return 语句,差别就在于 yield 语句返回的是可迭代对象,而 return 返回的为不可迭代对象。
  • 然后,每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到 yield 语句。

生成器函数
含有 yield 语句的函数是生成器函数,此函数调用回返回一个生成器对象,生成器也是可迭代对象
yield 语句的语法

yield 表达式

生成器函数示例1:

def simple_generator():yield 1yield 2yield 3
for value in simple_generator():print(value)

生成器函数示例2:

def Descendorder(n):while n > 0:yield nn -= 1
# 使用生成器函数
for num in Descendorder(5):print(num)

以上实例中,Descendorder 函数是一个生成器函数。它使用 yield 语句逐步产生从 n 到 1 的倒序数字。在每次调用 yield 语句时,函数会返回当前的倒序数字,并在下一次调用时从上次暂停的地方继续执行。
创建生成器对象并使用 next() 函数或 for 循环迭代生成器,我们可以逐步获取生成器函数产生的值。在这个例子中,我们首先使用 next() 函数获取前两个倒序数字,然后通过 for 循环获取剩下的三个倒序数字。
生成器函数的优势是它们可以按需生成值,避免一次性生成大量数据并占用大量内存。此外,生成器还可以与其他迭代工具(如 for 循环)无缝配合使用,提供简洁和高效的迭代方式。

1. 生成器表达式

  • 语法:
( 表达式 for 变量 in 可迭代对象 [if 真值表达式])
  • 作用
    用推导式的形式创建一个生成器
    示例:
>>> (x ** 2 for x in range(1, 5))   # 生成器表达式
<generator object <genexpr> at 0x...>
>>> for num in (x ** 2 for x in range(1, 5)):
...     print(num)
...
1
4
9
16

2. map(函数,可迭代对象)

  • 使用一个函数和一个迭代器中的每个元素作为输入,返回一个迭代器,其包含函数应用于每个元素的结果。
    示例:
def square(x):return x ** 2
numbers = [1, 2, 3, 4, 5]
squared_numbers = map(square, numbers)
print(list(squared_numbers))  # 输出 [1, 4, 9, 16, 25]

3. filter(函数,可迭代对象)

  • 使用一个函数和一个可迭代对象作为输入,返回一个迭代器,它只包含函数返回值为True的元素。
    示例:
def is_even(x):return x % 2 == 0
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = filter(is_even, numbers)
print(list(even_numbers))  # 输出 [2, 4, 6]

4. reduce(函数,可迭代对象[, 初始值])

  • reduce 函数来自 functools 模块,它会对迭代器中的元素进行累积操作,从左到右依次处理数据,最终累计为一个结果值。
    示例:
from functools import reduce
def add(x, y):return x + y
numbers = [1, 2, 3, 4, 5]
sum_of_numbers = reduce(add, numbers)
print(sum_of_numbers)  # 输出 15

2. Python装饰器 Decorators

定义:在不修改原始函数代码的情况下,为函数添加新的功能。

2.1 装饰器的基本概念

2.1.1 装饰器语法糖

@decorator
def function():pass

等价于:

def function():pass
function = decorator(function)

2.1.2 装饰器示例

def uppercase(func):def wrapper():original_result = func()modified_result = original_result.upper()return modified_resultreturn wrapper
@uppercase
def sayhello():return "Hello, Bob"
print(sayhello())  # 输出 "HELLO, BOB"

2.1.3 带参数的装饰器

def uppercase(func):def wrapper(*args, **kwargs):original_result = func(*args, **kwargs)modified_result = original_result.upper()return modified_resultreturn wrapper
@uppercase
def sayhello(name):return "Hello, " + name
print(sayhello("Bob"))  # 输出 "HELLO, BOB"

2.1.4 类装饰器

class MyDecorator:def __init__(self, func):self.func = funcdef __call__(self, *args, **kwargs):print("装饰器添加的功能")return self.func(*args, **kwargs)
@MyDecorator
def sayhello(name):return "Hello, " + name
print(sayhello("Bob"))  # 输出 "装饰器添加的功能" 然后 "Hello, Bob"
  • MyDecorator 是一个类装饰器。
  • 它使用 __init__ 方法接收一个函数,并将其存储在实例变量 self.func 中。
  • __call__ 方法使得类的实例可以被当作函数调用,在这里可以添加额外的功能,并最终调用原始函数。

2.2 装饰器的进阶使用

2.2.1 保留原函数的元信息

当使用装饰器时,原始函数的某些元信息(如函数名、文档字符串、参数列表等)可能会丢失。为了保留这些信息,可以使用 functools.wraps 装饰器。

from functools import wraps
def uppercase(func):@wraps(func)def wrapper(*args, **kwargs):original_result = func(*args, **kwargs)modified_result = original_result.upper()return modified_resultreturn wrapper
@uppercase
def sayhello(name):"""返回一个问候语"""return "Hello, " + name
print(sayhello("Bob"))  # 输出 "HELLO, BOB"
print(sayhello.__name__)  # 输出 "sayhello" 而不是 "wrapper"
print(sayhello.__doc__)  # 输出 "返回一个问候语"

2.2.2 嵌套装饰器

可以同时使用多个装饰器来装饰一个函数,装饰器会按照从内到外的顺序执行。

def uppercase(func):@wraps(func)def wrapper(*args, **kwargs):original_result = func(*args, **kwargs)modified_result = original_result.upper()return modified_resultreturn wrapper
def exclamation(func):@wraps(func)def wrapper(*args, **kwargs):original_result = func(*args, **kwargs)modified_result = original_result + "!"return modified_resultreturn wrapper
@uppercase
@exclamation
def sayhello(name):return "Hello, " + name
print(sayhello("Bob"))  # 输出 "HELLO, BOB!"

在这个例子中,sayhello 函数首先被 exclamation 装饰器装饰,然后被 uppercase 装饰器装饰。

2.2.3 装饰器参数的传递

如果装饰器本身需要参数,那么需要再定义一个函数来接收这些参数,然后返回一个装饰器。

def repeat(times):def decorator(func):@wraps(func)def wrapper(*args, **kwargs):for _ in range(times):func(*args, **kwargs)return wrapperreturn decorator
@repeat(times=3)
def sayhello(name):print("Hello, " + name)
sayhello("Bob")  # 输出 "Hello, Bob" 三次

在这个例子中,repeat 函数接收一个参数 times,然后返回一个装饰器,该装饰器会使得被装饰的函数重复执行指定次数。

2.3 总结

Python的装饰器是一个非常强大的功能,它允许我们在不修改原始函数代码的情况下,增加函数的行为。通过使用装饰器,我们可以轻松地实现日志记录、性能测试、事务处理、权限校验等跨多个函数的通用功能。理解和掌握装饰器是Python高级编程的重要一步。

相关文章:

10.18Python基础迭代器生成器_函数式编程

Python迭代器与生成器 1. 迭代器 Iterator 什么是迭代器 迭代器是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器可以重复使用&#xff0c;而不会像列表那样在迭代时被修改。 迭代器函数iter和next 函数说明iter(iterable)从可迭代对象中返回一个迭…...

HttpPost 类(构建 HTTP POST 请求)

HttpPost 类是 Apache HttpClient 库中的一个类&#xff0c;用于构建 HTTP POST 请求。以下是 HttpPost 类的一些常用方法和代码案例&#xff1a; 常用方法 构造方法&#xff1a; HttpPost(String uri)&#xff1a;创建一个 HttpPost 对象&#xff0c;并将请求的 URI 作为参数…...

xtu oj 原根

文章目录 回顾杂思路c 语言代码 回顾 AB III问题 H: 三角数问题 G: 3个数等式 数组下标查询&#xff0c;降低时间复杂度1405 问题 E: 世界杯xtu 数码串xtu oj 神经网络xtu oj 1167 逆序数&#xff08;大数据&#xff09; 杂 有一些题可能是往年的程设的题&#xff0c;现在搬到…...

Java Spring 中常用的 @PostConstruct 注解使用总结

引言 在最近的学习中&#xff0c;我发现了一个非常实用的注解 —— PostConstruct。通过深入学习&#xff0c;逐步发现这个注解在实际开发中可以帮助我们更轻松地解决不少原本复杂的问题&#xff0c;特别是在项目启动时自动执行一些必要的初始化操作。相比于手动调用&#xff…...

Visual Studio--VS安装配置使用教程

Visual Studio Visual Studio 是一款功能强大的开发人员工具&#xff0c;可用于在一个位置完成整个开发周期。 它是一种全面的集成开发环境 (IDE)。对新手特别友好&#xff0c;使用方便&#xff0c;不需要复杂的去配置环境。用它学习很方便。 Studio安装教程 Visual Studio官…...

什么叫CMS?如何使用CMS来制作网站?

CMS是什么&#xff1f; 内容管理系统&#xff08;Content Management System&#xff0c;CMS&#xff09;&#xff0c;是一种位于WEB前端&#xff08;Web 服务器&#xff09;和后端办公系统或流程&#xff08;内容创作、编辑&#xff09;之间的软件系统。内容的创作人员、编辑人…...

如何获取谷歌浏览器窗口句柄并将其设置为Qt的父窗口

1、首先&#xff0c;确保你在项目的 .pro 文件中加入对WinAPI的支持&#xff1a; win32: LIBS -luser322、步骤概述&#xff1a; 使用WinAPI获取谷歌浏览器窗口的句柄。获取Qt窗口的句柄。使用SetParent函数&#xff0c;将Qt窗口设置为谷歌浏览器窗口的子窗口。调整Qt窗口的…...

牛客小白月赛102:最短?路径(分层bfs)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 给定一个 nnn 个点 mmm 条边的无向图&#xff0c;LH 打算从点 111 出发去点 nnn。 假如 LH 到达了一个点 iii&#xff0c;那么他可以选择在这个点花费 aia_iai​ 的时间休息后继续赶…...

JSON字符串转成java的Map对象

要将这个JSON字符串转换成Java对象&#xff0c;你可以定义一个Element类来表示每个要素&#xff0c;然后使用一个Map来存储这些要素。以下是具体的实现步骤&#xff1a; 步骤 1: 定义 Element 类 首先&#xff0c;定义一个Element类来表示每个要素的结构&#xff1a; public…...

重读《人月神话》(8)-为什么巴比伦塔会失败?(Why Did the Tower of Babel Fail?)

据《创世纪》记载&#xff0c;巴比伦塔是人类继诺亚方舟之后的第二大工程壮举&#xff0c;但巴比伦塔同时也是第一个彻底失败的工程。 巴比伦塔的管理教训 这个项目具备了几乎所有成功的先决条件&#xff1a; 有清晰的目标&#xff0c;尽管目标理想化到了近乎不可实现的地步&…...

STL源码剖析:Hashtable

hashtable 概述 哈希表是一种数据结构&#xff0c;它提供了快速的数据插入、删除和查找功能。它通过使用哈希函数将键&#xff08;key&#xff09;映射到表中的一个位置来实现这一点&#xff0c;这个位置称为哈希值或索引。哈希表使得这些操作的平均时间复杂度为常数时间&…...

spring-boot学习(2)

上次学习截止到拦截器 1.构建RESfun服务 PathVariable通过url路径获取url传递过来的信息 2.MyBatisPlus 第三行的mydb要改为自己的数据库名 第四&#xff0c;五行的账号密码改成自己的 MaooerScan告诉项目自己的这个MyBatisPlus是使用在哪里的&#xff0c;包名 实体类的定义…...

《案例》—— OpenCV 实现2B铅笔填涂的答题卡答案识别

文章目录 一、案例介绍二、代码解析 一、案例介绍 下面是一张使用2B铅笔填涂选项后的答题卡 使用OpenCV 中的各种方法进行真确答案识别&#xff0c;最终将正确填涂的答案用绿色圈出&#xff0c;错误的答案不圈出&#xff0c;用红色圈出错误题目的正确答案最终统计正确的题目数…...

新员工入职流程指南_完整入职流程解析

文章介绍了新员工入职流程的重要性、步骤及持续时间&#xff0c;并推荐ZohoPeople软件自动化管理入职流程&#xff0c;提升新员工入职体验&#xff0c;减少离职率&#xff0c;确保合规性&#xff0c;提升公司品牌形象。 一、新员工入职流程是怎样的&#xff1f; 入职流程是指一…...

mysql查看和修改默认配置

1.查看最大连接数 SELECT max_connections; 或者 SHOW VARIABLES LIKE max_connections;2.查看当前连接的客户端 SHOW PROCESSLIST;2.临时设置最大连接数 SET GLOBAL max_connections 500;3.临时设置连接客户端交互超时时间 SET GLOBAL interactive_timeout 1800;4.永久生…...

海外云手机:出海电商养号智能化方案

随着出海电商的迅猛发展&#xff0c;使用海外云手机进行养号已经成为越来越多商家的新选择。尤其在社交电商推广和短视频引流方面&#xff0c;海外云手机不仅提高了流量的精准度&#xff0c;还助力商家实现业务的快速增长。本文将探讨海外云手机养号相较于传统模式的优势&#…...

OpenAI Canvas用户反馈:并不如外界传言般“炸裂”,更不是“AGI的终极交互形态” | LeetTalk Daily...

“LeetTalk Daily”&#xff0c;每日科技前沿&#xff0c;由LeetTools AI精心筛选&#xff0c;为您带来最新鲜、最具洞察力的科技新闻。 Canvas作为一个独立的界面&#xff0c;通过与ChatGPT的结合来提升用户的协作能力和创作效率。尽管用户对其独立性与现有工具的整合存在不同…...

RiproV9.0主题wordpress主题免扩展可二开PJ版/WordPress博客主题Ripro全解密无后门版本

&#x1f525;&#x1f389; 全新RiPro9.0开源版发布 —— 探索无限可能&#x1f680;&#x1f310; 今天&#xff0c;我很高兴能与大家分享一个重磅资源——RiPro9.0开源版&#xff01;这不是一个普通的版本&#xff0c;而是一个经过精心打磨、全面解密的力作。&#x1f50d;…...

[LeetCode] 515. 在每个树行中找最大值

题目描述&#xff1a; 给定一棵二叉树的根节点 root &#xff0c;请找出该二叉树中每一层的最大值。 示例1&#xff1a; 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9]示例2&#xff1a; 输入: root [1,2,3] 输出: [1,3]提示&#xff1a; 二叉树的节点个数的范围是 [0,10…...

【分布式微服务云原生】《微服务架构大揭秘:流行框架与服务治理攻略》

标题&#xff1a;《微服务架构大揭秘&#xff1a;流行框架与服务治理攻略》 摘要&#xff1a;本文深入探讨了流行的微服务架构框架&#xff0c;包括 Spring Cloud、Docker Kubernetes、Dubbo、Service Mesh 和 Serverless 架构&#xff0c;详细介绍了它们的关键组件和服务治理…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

uniapp手机号一键登录保姆级教程(包含前端和后端)

目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号&#xff08;第三种&#xff09;后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...