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

python基础系列 —— 迭代器与内置高阶函数

目录

一、迭代器

1、基本概念

2、如何定义一个迭代器

3、如果判断对象是否是迭代器

4、如何重置迭代器

5、如何调用迭代器

二、高阶函数

1、map函数 

2、filter函数

3、reduce函数

4、sorted函数


一、迭代器

1、基本概念

    迭代:是一个重复的过程,每次重复都是基于上一次的结果而继续,单纯的重复不是迭代。

    可迭代对象:是指任何可以使用for循环遍历其元素的对象;常见的可迭代对象包括列表、元组、字符串和字典等;所有可迭代对象都有一个__iter__()方法。

setvar = {"a",1,"b",2}
for i in setvar:print(i)res = dir(setvar)
print(res)

     迭代器:迭代器是可以实现对集合从前向后依次遍历的一个对象;Python中所有可迭代对象都有一个__iter__()方法,该方法返回一个迭代器对象。这个迭代器对象具有__next__()方法,用于逐个返回序列中的下一个值。当没有更多值可供返回时,__next__()会引发StopIteration异常。

setvar =  {"a",1,"b",2}
it = iter(setvar) 
print(it)
print(dir(it))

    关联:可迭代对象 和 迭代器之间的关系: 从不可被直接获取 => 可被直接获取的过程。如果是一个可迭代对象,不一定是一个迭代器,如果是一个迭代器,一定是一个可迭代对象。可以通过dir()方法判断是否是迭代器。

2、如何定义一个迭代器

    通过iter()方法定义

"""(1)iter(可迭代对象)(2)可迭代对象.__iter__()
"""
setvar =  {"a",1,"b",2}
it = iter(setvar) 
print(it) # iterator

3、如果判断对象是否是迭代器

    通过三方包Iterator,Iterable判断

from collections import Iterator,Iterable
"""from 从哪里...  import 引入Iterator 迭代器类型 Iterable 可迭代对象
"""
# 判断setvar是否为可迭代对象
setvar = {"a","b","c"}
res = isinstance(setvar, Iterable)
print(res)# 判断range是否为迭代器
it = iter(range(5))
res = isinstance(it,Iterator)
print(res)

4、如何重置迭代器

    因为迭代器是不可逆的,重置需要重新调用

"""
next调用,单项不可逆,一条路走到黑
"""
it = iter(setvar)
res = next(it)
print(res)

5、如何调用迭代器

    (1) next(迭代器)
    (2)迭代器.__next__()
    迭代器通过next方法调用时,是单向不可逆的过程

# 1.通过next获取迭代器中的数据
setvar = {"a", "b", "c"}
it = iter(setvar)
print(next(it))
print(next(it))
print(next(it))# 2.通过for循环,遍历迭代器
print("<========>")
it = iter(range(6))
for i in it:print(i)
print("<========>")
# 3.for 和 next 配合调用迭代器
it = iter(range(100000))
for i in range(10): # 只调用前10个,0-9res = next(it)print(res)print("<===>")
for i in range(10): # 没有重置,继续从10开始调用res = next(it)print(res)

二、高阶函数

    高阶函数 : 能够把函数当成参数传递的就是高阶函数,主要包括map、filter、reduce、sorte。

1、map函数 

map(func,iterable)功能:把iterable里面的数据一个一个拿出来,放到func函数中进行处理,把处理的结果扔到迭代器中,返回迭代器
参数:func 自定义函数 或者 内置函数iterable 可迭代对象 (容器类型数据 range 迭代器)
返回值:迭代器
备注:主要做批处理,把iterable里面的数据根据自己的规则进行处理,最终输出。
# 1.转换列表的字符串为数字
# ["1","2","3","4"] => [1,2,3,4]lst = ["1","2","3","4"]
print(lst)
it = map(int,lst)
lst = list(it)
print(lst)# 代码分析:map函数首先拿出列表当中的"1",扔到int函数当中处理,处理的结果扔到迭代器当中,依次遍历。然后通过list强转迭代器 ,返回一个列表。# 2.处理列表的元素,整体变为二次方
# [1,2,3,4] => [1,4,9,16]lst = [1,2,3,4]# map方法一,自定义处理逻辑函数
def func(n):return n ** 2
it = map(func,lst)
# map方法二,利用匿名函数简化代码(推荐)
it = map( lambda n : n ** 2 , lst )# 强转成列表,瞬间拿到所有数据
print(list(it))# 3.根据字典的k或者v,取出对应的值
# dic = {97:"a",98:"b",99:"c"} 给你["a","b","c"] => 返回 [97,98,99]lst = ["a","b","c"]
dic = {97:"a",98:"b",99:"c"}def func(n):for k,v in dic.items():if n == v:return k
it = map(func,lst)
print(list(it))

2、filter函数

filter(func,iterable)功能:在自定义的函数中,过滤数据如果返回True  代表保留数据如果返回False 代表舍弃该数据
参数:func 自定义函数iterable 可迭代性数据(容器类型数据 range对象 迭代器)
返回值:迭代器
备注:这个函数f的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
# 提取列表所有的奇数
# 1.[1,2,3,4,5,6,7,8] => [1, 3, 5, 7]lst = [1, 2, 3, 4, 5, 6, 7, 8]def func(n):if n % 2 == 0:return Falseelse:return Trueit = filter(func, lst)# 2.for
print("遍历输出所有元素")
it = filter(func, lst)
for i in it:print(i)# 3.for + next
print("遍历输出前两个元素")
it = filter(func, lst)
for i in range(2):print(next(it))# 4.list强转,瞬间得到所有数据
print("将所有结果强转为list")
it = filter(func, lst)
lst = list(it)
print(lst)# 改写成lambda 表达式
print("lambda简化代码,结果不变")
lst = [1, 2, 3, 4, 5, 6, 7, 8]
it = filter(lambda n: True if n % 2 == 1 else False, lst)
print(list(it))

3、reduce函数

reduce(func,iterable)功能:一次性从iterable当中拿出2个值,扔到func函数中进行处理,把运算的结果在和iterable的第三个值继续扔到func中做运算... 以此类推 最后返回计算的结果
参数:func 自定义函数iterable 可迭代性数据(容器类型数据 range对象 迭代器)
返回值:最后计算的结果
备注:类似聚合函数,利滚利
from functools import reduce# 1.计算列表 [2, 4, 5, 7, 12] 中所有元素的乘积,然后再将结果与初始值 2 相乘
# 2*4*5*7*12 再*2def prod(x, y):return x * y
print(reduce(prod, [2, 4, 5, 7, 12], 2))# 解释:reduce() 函数会对序列中的每个元素依次执行 prod() 函数,并将前一次调用的结果作为下一次调用时的第一个参数传入。最终得到所有元素相乘的结果。# 2.将列表转化为数字
# [5,4,8,8] => 5488lst = [5,4,8,8]
def func(x,y):return x*10 + y
res = reduce(func,lst)
print(res, type(res))"""
先从lst拿出前两个数据,5和4,扔到func当中进行运算 5 * 10 + 4 = 54
拿54 和 容器中第三个元素 8 , 扔到func当中进行运算 54 * 10 + 8 = 548 
拿548 和 容器中第四个元素 8 , 扔到func当中进行运算 548 * 10 + 8 = 5488
最后把5488 直接返回,程序结束.
"""# 优化成lambda表达式写法
print( reduce(lambda x,y : x * 10 + y,lst) )

4、sorted函数

sorted(iterable,reverse=False,key=函数)功能:  对数据进行排序
参数: iterable  : 具有可迭代性的数据(迭代器,容器类型数据,可迭代对象)reverse   : 是否反转 默认为False 代表正序, 改成True 为倒序key       : 指定函数 内置或自定义函数
返回值:返回排序后的数据
备注:可以对列表、元组等可迭代对象进行排序
# 1.对列表进行升序排列lst = [3, 2, 4, 1]
print(sorted(lst))   # 输出:[1, 2, 3, 4]# 2.对元组进行降序排列tpl = (5, 7 ,6 ,8)
print(sorted(tpl, reverse=True))   # 输出:[8, 7 ,6 ,5]# 3.按字符串长度对列表中的字符串进行升序排列lst = ['apple', 'banana', 'pear', 'orange']
print(sorted(lst,key=len))   # 输出:['pear', 'apple', 'banana', 'orange']# 4.对数组按照绝对值排序
lst = [3, -2, 4, 1, -10]
print(sorted(lst,key=abs))   # 输出:[1, -2, 3, 4, -10]

相关文章:

python基础系列 —— 迭代器与内置高阶函数

目录 一、迭代器 1、基本概念 2、如何定义一个迭代器 3、如果判断对象是否是迭代器 4、如何重置迭代器 5、如何调用迭代器 二、高阶函数 1、map函数 2、filter函数 3、reduce函数 4、sorted函数 一、迭代器 1、基本概念 迭代&#xff1a;是一个重复的过程,每次重复…...

MySQL面试题-日志

目录 1.MySQL 中常见的日志有哪些&#xff1f; 2.慢查询日志有什么用&#xff1f; 3.binlog 主要记录了什么&#xff1f; 4.Mysql的binlog有几种录入格式&#xff1f;分别有什么区别&#xff1f; 5.redo log 如何保证事务的持久性&#xff1f; 6.页修改之后为什么不直接刷…...

Android 10.0 去掉Launcher3默认给 icon增加的APK图标白边

1.概述 在10.0的系统产品开发中,Launcher3定制化开发中,发现在给第三方app的icon绘制图标的时候,会有白边第三方app的图标没有完全绘制出来,而系统app不存在这个问题,是完全绘制出来的,所以需要分析图标绘制类来解决这个问题 2.去掉Launcher3默认给 icon增加的APK图标白…...

E900V21C(S905L-armbian)安装armbian-Ubuntu(WiFi)

基本上是s905L芯片的刷机都是如此&#xff0c;包括Q7等 在网上寻找好多的教程关于e900v21c的刷机包和教程都少的可怜&#xff0c;唯一的就是这个&#xff1a;山东联通版创维E900V21C盒子刷入Armbiam并安装宝塔和Docker&#xff0c;但他是不能用WiFi和蓝牙的然后就是寻找s90l的…...

tpc协议的3次握手和4次挥手

建立连接的3次握手过程&#xff1a; A: 我想和你建立连接&#xff0c;你收到我的请求吗&#xff1f;(我想娶你) B: 好的&#xff0c;我收到了你的请求&#xff0c;我们可以建立连接&#xff0c;我同意。(好的,我愿意嫁给你) A: 好的&#xff0c;我收到了你的回应&#xff0c;我…...

YOLOv5害虫识别项目代码打包完整上传Gitee仓库(已开源)以及git上传速率限制踩坑记录

YOLOv5害虫识别项目代码打包完整上传Gitee仓库&#xff08;已开源&#xff09;以及git上传速率限制踩坑记录 ps: ​ 最近很多小伙伴需要这个害虫识别项目的源码&#xff0c;由于文件过大&#xff0c;所以将代码完整上传至gitee&#xff0c;所有文件、教程、论文、以及代码模型…...

从零开始学习c语言|21、动态内存管理

一、malloc函数 1、什么是malloc函数 malloc是memery(内存)和allocate(分配)的缩写&#xff0c;顾名思义&#xff0c;malloc函数为动态分配内存的意思 2、malloc函数语句 int *p(int *)malloc(sizeof(int))malloc函数的形参为申请的内存空间大小&#xff0c;上述申请了一个i…...

swagger关闭/v2/api-docs仍然可以访问漏洞

今天接到安全团队的说swagger有未授权访问漏洞&#xff0c;即使在swagger关闭的情况下http://127.0.0.1:8086/agcloud/v2/api-docs?group%E7%94%A8%E6%88%B7%E5%85%B3%E8%81%94%E4%BF%A1%E6%81%AF%E6%A8%A1%E5%9D%97仍然还能访问。 看了下原来是有写一个拦截器 registry.addI…...

k8s pod调度总结

在Kubernetes平台上&#xff0c;我们很少会直接创建一个Pod&#xff0c;在大多数情况下会通过控制器完成对一组Pod副本的创建、调度 及全生命周期的自动控制任务&#xff0c;如&#xff1a;RC、Deployment、DaemonSet、Job 等。本文主要举例常见的Pod调度。1全自动调度功能&…...

28个案例问题分析---10---对生产环境的敬畏--生产环境

一&#xff1a;背景介绍 1&#xff1a;上午9:23&#xff0c;老师没有进行上课&#xff0c;但是却又很多的在线人员&#xff0c;并且在线人员的时间也不正确。 2&#xff1a;开发人员及时练习用户&#xff0c;查看用户上课情况。 3&#xff1a;10点整&#xff0c;询问项目组长发…...

视觉SLAM十四讲ch7-1视觉里程计笔记

视觉SLAM十四讲ch7-1 视觉里程计笔记本讲目标从本讲开始&#xff0c;开始介绍SLAM系统的重要算法特征点法ORB特征BRIEF实践特征提取与匹配2D-2D&#xff1a;对极几何八点法求E八点法的讨论从单应矩阵恢复R&#xff0c;t小结三角化![在这里插入图片描述](https://img-blog.csdni…...

模仿评论样式

主要用到了padding-left把左侧的空白给留出来&#xff0c;然后把头像定位到留出的空白位置。行内对齐样式&#xff0c;使用了display:inline-flex;align-items:center;图标本来要用字体比较方便&#xff0c;暂时用的从icon font下载的svg样式写的一塌糊涂&#xff0c;一点也没考…...

xxl-job调度中心、执行器源码详解

文章目录简介调度中心一.程序启动初始化1.初始化入口类2.初始化I18n3.初始化快慢调度线程池4.初始化处理执行器注册或移除线程池更新执行器最新在线的守护线程5.初始化监控任务调度失败或执行失败的守护线程6.初始化处理执行器回调线程池监控任务执行结果丢失的守护线程7.初始化…...

cpp c++summary笔记 复杂类型 “right-left” rule

复杂类型 “right-left” rule 先向右走在向左走&#xff0c;循环往复&#xff0c;右侧的终止为看到右括号&#xff0c;右中括号&#xff0c;左侧为左括号&#xff0c;指针&#xff08;或其他int等&#xff09;。 符号读作*指向AA的指针(总在左侧)[]容纳AA的数组(总在左侧)()返…...

bash编程(马哥)

bash基础特性&#xff1a; 命令行展开&#xff1a;~&#xff0c;{} 命令别名&#xff1a;alias&#xff0c;unalias 命令历史&#xff1a;history 命令和路径补全&#xff1a;$PATH glob通配符&#xff1a;*&#xff0c;?&#xff0c;[]&#xff0c;[^]&#xff0c; 快捷键&am…...

搭建Gerrit环境Ubuntu

搭建Gerrit环境 1.安装apache sudo apt-get install apache2 注意:To run Gerrit behind an Apache server using mod_proxy, enable the necessary Apache2 modules: 执行:sudo a2enmod proxy_http 执行:sudo a2enmod ssl 使新的配置生效&#xff0c;需要执行如下命令:serv…...

朋友去华为面试,轻松拿到26K的Offer,羡慕了......

最近有朋友去华为面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…...

springboot项目如何配置启动端口

文章目录0 写在前面1 配置文件(.yaml)--推荐2 配置文件(.properties)3 IDEA配置--不推荐4 写在最后0 写在前面 项目启动需要一个独立的端口&#xff0c;所以在此记录一下。 根据配置文件的后缀书写格式略有不同。 1 配置文件(.yaml)–推荐 若是.yaml后缀的配置文件&#xff0…...

IOS - 抓包通杀篇

IOS中大多数情况&#xff0c;开发者都会使用OC提供的api函数&#xff0c;CFNetworkCopySystemProxySettings来进行代理检测&#xff1b; CFNetworkCopySystemProxySettings 检测函数直接会检测这些ip和端口等&#xff1a; 采用直接附加页面进程&#xff1a; frida -UF -l 通…...

盒子模型的简介

盒子的组成 一个盒子由外到内可以分成四个部分&#xff1a;margin&#xff08;外边距&#xff09;、border&#xff08;边框&#xff09;、padding&#xff08;内边距&#xff09;、content&#xff08;内容&#xff09;。会发现margin、border、padding是css属性&#xff0c;因…...

ncmdump终极解密攻略:5分钟实现网易云音乐NCM格式无损转换

ncmdump终极解密攻略&#xff1a;5分钟实现网易云音乐NCM格式无损转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾为下载的网易云音乐只能在特定平台播放而烦恼&#xff1f;NCM格式的音乐文件像是被上了一把无形的锁&am…...

别再只用命令行!Pycharm内置Database工具连接SQLite3的5个高效技巧(含文件路径避坑)

别再只用命令行&#xff01;Pycharm内置Database工具连接SQLite3的5个高效技巧&#xff08;含文件路径避坑&#xff09; 作为一名长期与SQLite3打交道的Python开发者&#xff0c;你是否还在反复切换终端和代码编辑器&#xff0c;用命令行执行sqlite3 test.db&#xff1f;或是为…...

OpenClaw性能调优:RTX4090D环境下Qwen3-32B-Chat的并发控制

OpenClaw性能调优&#xff1a;RTX4090D环境下Qwen3-32B-Chat的并发控制 1. 为什么需要关注OpenClaw的并发性能 上周我在本地部署了Qwen3-32B-Chat模型&#xff0c;准备用OpenClaw实现一个自动化内容处理流程。当我同时触发文件整理、网页检索和报告生成三个任务时&#xff0c…...

暗黑破坏神:技术焕新与经典重构——DevilutionX的跨平台复兴之路

暗黑破坏神&#xff1a;技术焕新与经典重构——DevilutionX的跨平台复兴之路 【免费下载链接】devilutionX Diablo build for modern operating systems 项目地址: https://gitcode.com/gh_mirrors/de/devilutionX 在游戏产业飞速迭代的今天&#xff0c;如何让经典IP在现…...

告别卡顿!Nginx+HTTP-FLV模块搭建低延迟直播系统(含OBS/VLC对比测试)

低延迟直播系统实战&#xff1a;NginxHTTP-FLV协议优化指南 直播行业的爆发式增长对技术架构提出了更高要求。当观众在电商直播间抢购商品时&#xff0c;当在线教育师生进行实时互动时&#xff0c;哪怕1秒的延迟都可能影响用户体验。本文将深入探讨如何基于Nginx和HTTP-FLV模块…...

解锁Intel RealSense三维点云生成:3大突破点与实战秘籍

解锁Intel RealSense三维点云生成&#xff1a;3大突破点与实战秘籍 【免费下载链接】librealsense Intel RealSense™ SDK 项目地址: https://gitcode.com/GitHub_Trending/li/librealsense 在工业检测、机器人导航和增强现实等领域&#xff0c;三维数据获取一直是技术落…...

SuperSplat:零安装的浏览器端3D高斯点云编辑器,重塑三维数据处理体验

SuperSplat&#xff1a;零安装的浏览器端3D高斯点云编辑器&#xff0c;重塑三维数据处理体验 【免费下载链接】super-splat 3D Gaussian Splat Editor 项目地址: https://gitcode.com/gh_mirrors/su/super-splat 在当今三维重建和计算机视觉领域&#xff0c;处理大规模3…...

DS3231/DS3232高精度RTC驱动设计与工业时间同步实践

1. DS323x_Generic 库深度技术解析&#xff1a;面向工业级时间同步的嵌入式RTC驱动设计1.1 高精度时间基准的工程必要性在嵌入式系统中&#xff0c;时间戳的准确性直接决定系统可靠性。传统MCU内置RTC&#xff08;如STM32的BKP域RTC&#xff09;在-40℃~85℃工业温度范围内月漂…...

Thief-Book:在IDE中开辟第二空间的开发者时间管理工具

Thief-Book&#xff1a;在IDE中开辟第二空间的开发者时间管理工具 【免费下载链接】thief-book-idea IDEA插件版上班摸鱼看书神器 项目地址: https://gitcode.com/gh_mirrors/th/thief-book-idea 作为开发者&#xff0c;你是否也曾经历过这样的场景&#xff1a;代码正在…...

ThingsIoT Arduino客户端库:嵌入式设备云接入实战指南

1. ThingsIoT Arduino客户端库深度解析&#xff1a;面向嵌入式工程师的云平台接入实践指南1.1 库定位与工程价值ThingsIoT Arduino Client Library 是一款专为Arduino IDE生态设计的轻量级物联网设备云接入中间件&#xff0c;其核心工程目标并非提供通用通信协议栈&#xff0c;…...