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 什么是迭代器 迭代器是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器可以重复使用,而不会像列表那样在迭代时被修改。 迭代器函数iter和next 函数说明iter(iterable)从可迭代对象中返回一个迭…...
HttpPost 类(构建 HTTP POST 请求)
HttpPost 类是 Apache HttpClient 库中的一个类,用于构建 HTTP POST 请求。以下是 HttpPost 类的一些常用方法和代码案例: 常用方法 构造方法: HttpPost(String uri):创建一个 HttpPost 对象,并将请求的 URI 作为参数…...
xtu oj 原根
文章目录 回顾杂思路c 语言代码 回顾 AB III问题 H: 三角数问题 G: 3个数等式 数组下标查询,降低时间复杂度1405 问题 E: 世界杯xtu 数码串xtu oj 神经网络xtu oj 1167 逆序数(大数据) 杂 有一些题可能是往年的程设的题,现在搬到…...
Java Spring 中常用的 @PostConstruct 注解使用总结
引言 在最近的学习中,我发现了一个非常实用的注解 —— PostConstruct。通过深入学习,逐步发现这个注解在实际开发中可以帮助我们更轻松地解决不少原本复杂的问题,特别是在项目启动时自动执行一些必要的初始化操作。相比于手动调用ÿ…...
Visual Studio--VS安装配置使用教程
Visual Studio Visual Studio 是一款功能强大的开发人员工具,可用于在一个位置完成整个开发周期。 它是一种全面的集成开发环境 (IDE)。对新手特别友好,使用方便,不需要复杂的去配置环境。用它学习很方便。 Studio安装教程 Visual Studio官…...
什么叫CMS?如何使用CMS来制作网站?
CMS是什么? 内容管理系统(Content Management System,CMS),是一种位于WEB前端(Web 服务器)和后端办公系统或流程(内容创作、编辑)之间的软件系统。内容的创作人员、编辑人…...
如何获取谷歌浏览器窗口句柄并将其设置为Qt的父窗口
1、首先,确保你在项目的 .pro 文件中加入对WinAPI的支持: win32: LIBS -luser322、步骤概述: 使用WinAPI获取谷歌浏览器窗口的句柄。获取Qt窗口的句柄。使用SetParent函数,将Qt窗口设置为谷歌浏览器窗口的子窗口。调整Qt窗口的…...
牛客小白月赛102:最短?路径(分层bfs)
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 给定一个 nnn 个点 mmm 条边的无向图,LH 打算从点 111 出发去点 nnn。 假如 LH 到达了一个点 iii,那么他可以选择在这个点花费 aia_iai 的时间休息后继续赶…...
JSON字符串转成java的Map对象
要将这个JSON字符串转换成Java对象,你可以定义一个Element类来表示每个要素,然后使用一个Map来存储这些要素。以下是具体的实现步骤: 步骤 1: 定义 Element 类 首先,定义一个Element类来表示每个要素的结构: public…...
重读《人月神话》(8)-为什么巴比伦塔会失败?(Why Did the Tower of Babel Fail?)
据《创世纪》记载,巴比伦塔是人类继诺亚方舟之后的第二大工程壮举,但巴比伦塔同时也是第一个彻底失败的工程。 巴比伦塔的管理教训 这个项目具备了几乎所有成功的先决条件: 有清晰的目标,尽管目标理想化到了近乎不可实现的地步&…...
STL源码剖析:Hashtable
hashtable 概述 哈希表是一种数据结构,它提供了快速的数据插入、删除和查找功能。它通过使用哈希函数将键(key)映射到表中的一个位置来实现这一点,这个位置称为哈希值或索引。哈希表使得这些操作的平均时间复杂度为常数时间&…...
spring-boot学习(2)
上次学习截止到拦截器 1.构建RESfun服务 PathVariable通过url路径获取url传递过来的信息 2.MyBatisPlus 第三行的mydb要改为自己的数据库名 第四,五行的账号密码改成自己的 MaooerScan告诉项目自己的这个MyBatisPlus是使用在哪里的,包名 实体类的定义…...
《案例》—— OpenCV 实现2B铅笔填涂的答题卡答案识别
文章目录 一、案例介绍二、代码解析 一、案例介绍 下面是一张使用2B铅笔填涂选项后的答题卡 使用OpenCV 中的各种方法进行真确答案识别,最终将正确填涂的答案用绿色圈出,错误的答案不圈出,用红色圈出错误题目的正确答案最终统计正确的题目数…...
新员工入职流程指南_完整入职流程解析
文章介绍了新员工入职流程的重要性、步骤及持续时间,并推荐ZohoPeople软件自动化管理入职流程,提升新员工入职体验,减少离职率,确保合规性,提升公司品牌形象。 一、新员工入职流程是怎样的? 入职流程是指一…...
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.永久生…...
海外云手机:出海电商养号智能化方案
随着出海电商的迅猛发展,使用海外云手机进行养号已经成为越来越多商家的新选择。尤其在社交电商推广和短视频引流方面,海外云手机不仅提高了流量的精准度,还助力商家实现业务的快速增长。本文将探讨海外云手机养号相较于传统模式的优势&#…...
OpenAI Canvas用户反馈:并不如外界传言般“炸裂”,更不是“AGI的终极交互形态” | LeetTalk Daily...
“LeetTalk Daily”,每日科技前沿,由LeetTools AI精心筛选,为您带来最新鲜、最具洞察力的科技新闻。 Canvas作为一个独立的界面,通过与ChatGPT的结合来提升用户的协作能力和创作效率。尽管用户对其独立性与现有工具的整合存在不同…...
RiproV9.0主题wordpress主题免扩展可二开PJ版/WordPress博客主题Ripro全解密无后门版本
🔥🎉 全新RiPro9.0开源版发布 —— 探索无限可能🚀🌐 今天,我很高兴能与大家分享一个重磅资源——RiPro9.0开源版!这不是一个普通的版本,而是一个经过精心打磨、全面解密的力作。🔍…...
[LeetCode] 515. 在每个树行中找最大值
题目描述: 给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。 示例1: 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9]示例2: 输入: root [1,2,3] 输出: [1,3]提示: 二叉树的节点个数的范围是 [0,10…...
【分布式微服务云原生】《微服务架构大揭秘:流行框架与服务治理攻略》
标题:《微服务架构大揭秘:流行框架与服务治理攻略》 摘要:本文深入探讨了流行的微服务架构框架,包括 Spring Cloud、Docker Kubernetes、Dubbo、Service Mesh 和 Serverless 架构,详细介绍了它们的关键组件和服务治理…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
