python之代码简化式(列表、字典生成式,递归函数,迭代器(iter)和生成器(yield)、匿名函数(lambda)的使用)(12)

文章目录

  • 前言
  • 1、列表、字典生成式
  • 2、递归函数
    • 2.1 python中代码的递归深度(扩展)
  • 3、拓展:迭代器和生成器
    • 3.1 迭代器(iter)
    • 3.2 生成器(yield)
  • 4、匿名函数(lambda)
    • 4.1 map函数
    • 4.2 reduce函数(较少使用)
    • 4.3 filter函数

前言

本文主要讲解一些简化代码格式的一些方法,方便大家更好的完成各种程序的开发;其中包括列表、字典生成式,递归函数,迭代器(iter)和生成器(yield)以及匿名函数(lambda)的使用

1、列表、字典生成式

通过简短的代码对可迭代数据类型(列表、元组等)中的元素进行处理,然后快速生成一个列表或字典
语法格式:变量 = [代码 for 变量 in 数据]
下面我直接通过案例讲解

  • 案例1:快速生成列表(偶尔会使用)
list = ['ah','hh','lalala'] # 将该列表中的元素全部转换成大写字母
# 传统方法
new = []
for x in list:new.append(x.upper())
print(new) # 输出结果:['AH', 'HH', 'LALALA']

从上面可以看到,在原来当我们将一个列表中的元素全部转换成大写字母,需要使用好几行的代码才能解决;但通过列表生成式我们只需一行代码即可解决;如下:

list = ['ah','hh','lalala']
# 新方法
new = [x.upper() for x in list] # 列表生成式
print(new) # 输出结果:['AH', 'HH', 'LALALA']

说明:
从上面可以看,我们可以直接在中括号[]中直接使用for循环的代码对列表元素进行处理,并将处理好的元素依次加入新的列表中,最后得到的结果与传统方法相同,并且简化了代码

  • 案例2:快速生成字典(基本用不到)
list = [('name','ah'),('age',18),('sex','man')] # 将该列表转换成字典
# 传统方法
new = {}
for a,b in list:if a != 'sex': new[a] = b
print(new)

使用字典生成式完成上面的需求:

new = {a:b for a,b in list if a!='sex'} # 字典生成式
print(new)

总结:
上面两种方法的作用都是简化代码的书写过程,没有实际意义,且可读性较差,在日常开发中,还是以传统方法为主

2、递归函数

在调用函数的过程中,直接或间接的调用了自己,以达到循环的效果

  • 案例1:直接调用
def a():print(666)a() # 2、重复调用函数aa() # 1、调用函数a
  • 案例2:间接调用
def a():b() # 2、调用函数bdef b():a() # 3、继续调用函数aa() # 1、调用函数a

总结:
从上面可以看到,我们可以通过函数递归的方式,使函数重复运行,达到循环的效果;所以python中使代码重复执行的方法可以有:
1、while或for循环
2、递归函数

2.1 python中代码的递归深度(扩展)

在前面学习while和for循环的时候,我们知道在日常开发中要避免死循环的现象;一般我们会通过设置条件来避免死循环;而python中也自带了一个保护机制;用来控制代码的递归次数;以免大量占用电脑内存,造成死机

  • 通过设置条件,避免函数递归陷入死循环
def a(n):if n<5:print(n)n = n+1a(n)
a(1)

输出结果:

1
2
3
4
  • 设置python的代码递归次数,避免死循环

python默认的最大递归次数是1000,这个次数可以通过命令修改,但不建议修改;只需了解一下修改的方法;如下:

# 调用sys模块
import sys 
# 设置最大递归次数
sys.setrecursionlimit(100) 
# 查看最大递归次数
print(sys.getrecursionlimit()) # 输出结果:100

案例:

# 调用sys模块
import sys
# 设置最大递归次数
sys.setrecursionlimit(5)def a():print(666)a()
a() # 死循环

输出结果:
在这里插入图片描述
说明:
从上面可以看到,设置最大递归次数为6;死循环在循环6次后就会直接报错;而默认的情况下,要循环1000次后才会报错

3、拓展:迭代器和生成器

3.1 迭代器(iter)

可迭代对象转换成迭代器,通过内置方法调用迭代器,能够依次得到可迭代对象中的元素
可迭代对象包括:列表、字典、元组、字典、集合、打开的文件对象
语法格式:
1、生成迭代器:迭代器 = iter(可迭代对象),这里迭代器就是一个变量
2、调用迭代器:next(迭代器)

案例1:迭代列表

a = [1,2,3]
text1 = iter(a) # 生成迭代对象
print(text1) # 输出结果:<list_iterator object at 0x000002334C0810D0>
print(next(text1)) # 输出结果:1
print(next(text1)) # 输出结果:2
print(next(text1)) # 输出结果:3

说明:
从上面可以看到,将列表a 转换成迭代器后,直接打印迭代器 text1 得到的是一个地址;然后通过 next() 方法每执行一次,都会得到列表a中的下一个元素;注意执行次数超过列表中的元素就会报错

案例2:迭代字典

b = {'name':'阿豪','age':18}
text2 = iter(b)
print(next(text2)) # 输出结果:name
print(next(text2)) # 输出结果:age

说明:
从上面可以看到,字典转换成迭代器后,每执行一次 next(),都会得到字典中的下一个键注意执行次数超过字典中的键值对就会报错

  • 总结
    迭代器其实就是for循环的底层原理之一,我们知道for循环是while循环扩展扩展出来的一种简便方法;它集成了 迭代器、while循环、异常处理等语法

案例:

a = {'name':'阿豪','age':18}
# 方法1:
b = iter(a)
while True:try: # 异常处理,用于解决next执行超过次数报错问题print(next(b))except StopIteration:break

等同于:

a = {'name':'阿豪','age':18}
方法2for x in a:print(x)

输出结果:

name
age

说明:
从上面可以看到,两种方法的结果相同,方法2中for循环在执行时,相当于运行了方法1中的代码;明白这个道理后,我们可以更好的运用所学知识点

3.2 生成器(yield)

自定义的一种迭代器,放在函数中使用,作用与return相似

语法格式:
1、定义
def 函数名():代码yield 返回值
2、调用
next(函数名())

案例:

def a():print('第一') # 第一个nextyield # 没有返回值,得到 Noneprint('第二') # 第二个nextyield 666 # 有返回值,得到 666print('第三') # 第三个 nextyield # 没有返回值,得到 None
a() # 直接调用,没有任何结果
b = a() # 将 a() 绑定给 变量b
print(next(b)) # 输出结果: 第一 None
print(next(b)) # 输出结果:第二 666
print(next(b)) # 输出结果:第三 None
  • yield的使用说明

yield 只能在函数中使用,与return不同的是:

  1. 在函数中出现return会立即退出,而 yield出现在函数中表示暂停,直接调用函数不会执行;必须使用 next(函数名()) 来调用
  2. print(next(b)) 表示调用函数,执行到第一个yield后暂停;若yield后有返回值就输出,没有就输出None;相当于return
  3. 再次执行print(next(b)) ,代码会从上次暂停的 yield后继续运行,遇到 yield又暂停;重复这个步骤,有多少yield就可以调用几次;当 next(b) 找不到yield后就会报错
  • yield 主要应用场景:读取大文件

案例:

def get():with open('1.jpg','rb') as f:while True:res = f.read(10) # 每次读取10个字节if res:yield res # 返回读取的10个字节并暂停else:break # 没有内容后就退出循环
print(next(get())) # 得到第一次读取的内容
print(next(get())) # 得到第二次读取的内容

说明:
在读取大文件时,若直接读取会占用大量内存,而通过yield可以实现一段段的读取,读取一次暂停一次,每次只读取一部分内容;这样能够节省内存

4、匿名函数(lambda)

没有名字的函数,用特殊格式定义,可以执行简单的代码,主要配合其它函数使用

案例:

# 传统函数
def a(x,y):return x+y
print(a(1,2)) # 输出结果:3

等同于

# 用匿名函数实现上面的代码
# 1、定义函数
b = lambda x,y:x+y # 定义后绑定给变量b
# 2、调用函数
print(b(1,2)) # 方法1:通过变量b传参
print((lambda x,y:x+y)(1,2)) # 方法2:直接使用函数体传参
# 输出结果:3

总结:
匿名函数结构简单,只能执行上面这种简单的代码,主要是配合接下来学习的几种函数,我们往下看

4.1 map函数

通常用来对可迭代对象中的元素做一些处理,可迭代对象包括:字符串、列表、字典、元组、集合等等
语法格式:map(参数1,参数2)
map函数可接收两个参数:
参数1:函数,这里的函数通常为 匿名函数
参数2:可迭代对象

案例:

a = [1,2,3,4,5] # 可迭代对象
# 对列表a中的元素做平方处理
res = map(lambda x:x**2,a) # x为参数用于接收 列表a中的每个元素,x**2表示对每个元素平方
print(res) # 直接打印得到是一个map对象地址
print(list(res)) # 这里我们用list方法,将其转换成列表显示

输出结果:

<map object at 0x000001B30E3918B0>
[1, 4, 9, 16, 25] # 每个元素都平方了

4.2 reduce函数(较少使用)

可迭代对象中的元素进行累加操作
需要调用模块:from functools import reduce
语法格式:reduce(函数,可迭代对象)

案例:

from functools import reduce # 调用模块
array = [1,2,3,4,5] # 可迭代对象
res = reduce(lambda x,y:x+y,array) # 相当于 1+2+3+4+5 = 15
print(res) # 输出结果:15

说明:
上面匿名函数,lambda x,y:x+y ,其中 x,y 分别接收 1,2 ;相加后得到3;然后x,y又分别接收 3,3 相加后得到6,然后x,y又分别接收 6,4 ,相加得到10,重复该步骤 对列表中的元素进行累加,相当于 1+2+3+4+5 = 15

4.3 filter函数

通过条件筛选可迭代对象中的元素
语法格式:filter(函数,可迭代对象)

案例:

array = [1,2,3,4,5]
res = filter(lambda x:x>3,array) # 筛选列表中大于3的元素
print(list(res)) # 输出结果:[4,5]

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

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

相关文章

宠物猫用空气净化器真的有用吗?值得买的猫用空气净化器牌子排名

作为一名6年资深铲屎官&#xff0c;每天铲猫砂盆的工作无疑是一项挑战。家中不仅弥漫着难以忍受的气味&#xff0c;而且家里的小孩和老人偶尔会因为过敏性鼻炎或结膜炎等问题感到不适。换毛季节尤其头疼&#xff0c;浮毛无处不在&#xff1a;沙发、外套、坐垫&#xff0c;甚至连…

Spring Boot 3 + Resilience4j 简单入门 + Redis Cache 整合

1. 项目结构 2. Maven依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.2</version><relativePath/> <!-- lookup parent from repository --&…

如何学习ClickHouse:糙快猛的大数据之路(技术要点概览)

这个系列文章用"粗快猛大模型问答讲故事"的创新学习方法&#xff0c;让你轻松理解复杂知识&#xff01;涵盖Hadoop、Spark、MySQL、Flink、Clickhouse、Hive、Presto等大数据所有热门技术栈&#xff0c;每篇万字长文。时间紧&#xff1f;只看开头20%就能有收获&#…

如何智能便捷、自动化地进行文件数据采集?

文件数据采集是指从各种源头和渠道收集、整理、清洗、分析和挖掘数据的过程。它是大数据应用的基础&#xff0c;为企业提供全面的决策支持和业务价值。文件数据采集对于不同行业都至关重要&#xff0c;通过有效的文件数据采集&#xff0c;企业可以更好地了解市场动态、优化服务…

数据驱动未来:构建下一代湖仓一体电商数据分析平台,引领实时商业智能革命

1.1 项目背景 本项目是一个创新的湖仓一体实时电商数据分析平台&#xff0c;旨在为电商平台提供深度的数据洞察和业务分析。技术层面&#xff0c;项目涵盖了从基础架构搭建到大数据技术组件的集成&#xff0c;采用了湖仓一体的设计理念&#xff0c;实现了数据仓库与数据湖的有…

pytorch3d的安装

在这个网址中&#xff0c;下载对应的pytorch3d安装包 https://anaconda.org/pytorch3d/pytorch3d/files下载完成后使用下面命令进行安装 conda install ./pytorch3d-0.7.7-py39_cu118_pyt201.tar.bz2

web基础及http协议、

⼀、web基本概念和常识 Web&#xff1a;为⽤户提供的⼀种在互联⽹上浏览信息的服务&#xff0c;Web 服 务是动态的、可交 互的、跨平台的和图形化的。Web 服务为⽤户提供各种互联⽹服务&#xff0c;这些服务包括信息浏览 服务&#xff0c;以及各种交互式服务&#xff0c;包括聊…

芋道微服务全栈开发日记(商品sku数据归类为规格属性)

商品的每一条规格和属性在数据库里都是单一的一条数据&#xff0c;从数据库里查出来后&#xff0c;该怎么归类为对应的规格和属性值&#xff1f;如下图&#xff1a; 在商城模块&#xff0c;商品的单规格、多规格、单属性、多属性功能可以说是非常完整&#xff0c;如下图&#x…

web、http协议、apache服务、nginx服务

web基本概念和常识 概念 web&#xff1a;为用户提供的一种在互联网上浏览信息的服务&#xff0c;是动态的、可交互的、跨平台的和图形化的&#xff1b; 为用户提供各种互联网服务&#xff0c;这些服务包括浏览服务以及各种交互式服务&#xff0c;包括聊天、购物等&#xff1…

shp格式数据详解

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

MATLAB中“varargin”的作用

varargin是什么&#xff1f; 在MATLAB中&#xff0c;varargin是一个特殊的变量&#xff0c;用于接收函数输入参数中的可变数量的参数。它允许用户在调用函数时传递不确定数量的参数。 varargin的本质是一个包含了所有可变参数的cell数组。在函数内部&#xff0c;可以使用cell…

鸿蒙HarmonyOS开发:@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化

文章目录 一、装饰器二、概述三、限制条件四、装饰器说明五、Toggle组件1、子组件2、接口3、ToggleType枚举4、事件 六、示例演示1、代码2、效果 一、装饰器 State装饰器&#xff1a;组件内状态Prop装饰器&#xff1a;父子单向同步Link装饰器&#xff1a;父子双向同步Provide装…

.NET周刊【7月第4期 2024-07-28】

国内文章 .NET 高性能缓冲队列实现 BufferQueue https://mp.weixin.qq.com/s/fUhJpyPqwcmb3whuV3CDyg BufferQueue 是一个用 .NET 编写的高性能的缓冲队列实现&#xff0c;支持多线程并发操作。 项目地址&#xff1a;https://github.com/eventhorizon-cli/BufferQueue 项目…

【Python】基础学习技能提升代码样例6:日志logging

logging 模块实现了python的日志能力。本文通过几个示例展示一些重点概念与用法。 一、线程安全介绍 logging 模块的目标是使客户端不必执行任何特殊操作即可确保线程安全。 它通过使用线程锁来达成这个目标&#xff1b;用一个锁来序列化对模块共享数据的访问&#xff0c;并且…

upload-labs靶场练习

文件上传函数的常见函数&#xff1a; 在PHP中&#xff0c;‌文件上传涉及的主要函数包括move_uploaded_file(), is_uploaded_file(), get_file_extension(), 和 mkdir()。‌这些函数共同协作&#xff0c;‌使得用户可以通过HTTP POST方法上传文件&#xff0c;‌并在服务器上保存…

实战:安装ElasticSearch 和常用操作命令

概叙 科普文&#xff1a;深入理解ElasticSearch体系结构-CSDN博客 Elasticsearch各版本比较 ElasticSearch 单点安装 1 创建普通用户 #1 创建普通用户名&#xff0c;密码 [roothlink1 lyz]# useradd lyz [roothlink1 lyz]# passwd lyz#2 然后 关闭xshell 重新登录 ip 地址…

kaggle使用api下载数据集

背景 kaggle通过api并配置代理下载数据集datasets 步骤 获取api key 登录kaggle&#xff0c;点个人资料&#xff0c;获取到自己的api key 创建好的key会自动下载 将key放至家目录下的kaggle.json文件中 我这里是windows的administrator用户。 装包 我用了虚拟环境 pip …

Vite + Vue3 + TS项目配置前置路由守卫

在现代前端开发中&#xff0c;使用 Vue 3 和 TypeScript 的组合是一种流行且高效的开发方式。Vite 是一个极速的构建工具&#xff0c;可以显著提升开发体验。本文博主将指导你如何在 Vite Vue 3 TypeScript 项目中配置前置路由守卫&#xff08;Navigation Guards&#xff09;…

【YashanDB知识库】如何远程连接、使用YashanDB?

问题现象 在各个项目实施中&#xff0c;我们经常遇到客户、开发人员需要连接和使用YashanDB但不知如何操作的问题&#xff0c;本文旨在介绍远程连接、使用YashanDB的几种方式。 问题的风险及影响 无风险 问题影响的版本 历史版本~23.2 问题发生原因 无 解决方法及规避方…

前端web开发HTML+CSS3+移动web(0基础,超详细)——第1天

一、开发坏境的准备 1&#xff0c;在微软商店下载并安装VS Code 以及谷歌浏览器或者其他浏览器&#xff08;我这里使用的是Microsoft Edge&#xff09; 2&#xff0c;打开vs code &#xff0c;在电脑桌面新建一个文件夹命名为code&#xff0c;将文件夹拖拽到vs code 中的右边…