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

news2024/9/8 23:34:36

文章目录

  • 前言
  • 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、重复调用函数a
    
a() # 1、调用函数a
  • 案例2:间接调用
def a():
    b() # 2、调用函数b

def b():
    a() # 3、继续调用函数a
    
a() # 1、调用函数a

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

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

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

  • 通过设置条件,避免函数递归陷入死循环
def a(n):
    if n<5:
        print(n)
        n = n+1
        a(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('第一') # 第一个next
    yield # 没有返回值,得到 None
    print('第二') # 第二个next
    yield 666 # 有返回值,得到 666
    print('第三') # 第三个 next
    yield # 没有返回值,得到 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.coloradmin.cn/o/1957840.html

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

相关文章

康师傅JAVA核心内容

链接&#xff1a;康师傅JAVA核心内容 (qq.com)

LeetCode刷题笔记第682题:棒球比赛

LeetCode刷题笔记第682题&#xff1a;棒球比赛 题目&#xff1a; 想法&#xff1a; 遍历输入的列表&#xff0c;按照规则将分数和操作依次进行&#xff0c;存储在新建的列表中&#xff0c;最终输出列表中的元素和&#xff0c;代码如下&#xff1a; class Solution:def calPo…

Ubuntu、centos、openEuler安装docker

目录 1.在 Ubuntu 上安装 Docker 1. 1 更新软件包 1. 2 安装必要的依赖 1.3 添加 Docker 的 GPG 密钥 1.4 添加 Docker 仓库 1.5 更新软件包 1.6 安装 Docker 1.7 启动并启用 Docker 服务 1.8 验证安装 1.9 运行测试容器 1.10 非 root 用户运行 Docker 2.在 CentOS…

前端基于 axios 实现批量任务调度管理器 demo

一、背景介绍 这是一个基于 axios 实现的批量任务调度管理器的 demo。它使用了axios、promise 等多种技术和原理来实现批量处理多个异步请求&#xff0c;并确保所有请求都能正确处理并报告其状态。 假设有一个场景&#xff1a;有一个任务列表&#xff0c;有单个任务的处理功能…

OpenGL学习 1

一些唠叨&#xff1a; 很多时候&#xff0c;都被Live2d吸引&#xff0c;去年想给网页加个live2d看板娘&#xff0c;结果看不懂live2d官方给的SDK&#xff0c;放弃了。今天又想弄个live2d桌宠&#xff0c;都已经在网上找到Python 的 Live2D 拓展库了&#xff0c;并提供了用QT实现…

领航者-跟随者编队算法 定义+特性+原理+公式+Python示例代码(带详细注释)

文章目录 引言定义特性基本原理和公式推导基本原理公式推导运动模型领航者的控制跟随者的控制 示例推导 实现步骤和代码实现实现步骤Python代码实现&#xff08;带详细注释&#xff09;代码运行结果代码和图表说明 应用案例优化和挑战优化挑战 结论 引言 在现代科技的发展中&a…

PointCLIP: Point Cloud Understanding by CLIP

Abstract 近年来&#xff0c;基于对比视觉语言预训练(CLIP)的零镜头和少镜头学习在二维视觉识别中表现出了令人鼓舞的效果&#xff0c;该方法在开放词汇设置下学习图像与相应文本的匹配。然而&#xff0c;通过大规模二维图像-文本对预训练的CLIP是否可以推广到三维识别&#x…

【状语从句】

框架 概念&#xff0c;特点主将从现连接词时间条件地点结果方式让步原因目的比较省略倒装 解读 1【概念&#xff0c;特点】 一个完整的句子&#xff0c;去修饰另一个完整句子中的动词&#xff0c;称为状语从句&#xff1b;特点&#xff1a;从句完整&#xff0c;只用考虑连接词是…

扩展------正向代理和反向代理怎么理解?

今天看博客园&#xff0c;突然看到正向代理和反向代理&#xff0c;发现自己还不会就稍微研究了一下。 正向代理----(看做是服务员) 当我们进饭店吃饭&#xff0c;我们不可能会直接去后厨叫厨师给我们做菜&#xff0c;而是通过服务员去通知&#xff0c;这个就叫做正向代理。 再…

keras在GPU环境下配置,conda虚拟环境并安装TensorFlow,cudatoolkit,cudann和jupyter等

前言&#xff1a;要有版本意识 在我个人的多次配置环境过程中&#xff0c;很多时候失败或者后序出现问题&#xff0c;往往都是版本不匹配的问题。所以在本次安装中&#xff0c;提前重点了解了下版本匹配情况。各位千万不要跳过这部分&#xff0c;因为这不仅是基础知识了解的过…

君子学习,是为了修养自己

98天 保护自己最好的方式&#xff1a; 恢复良知的明和诚&#xff0c;就能照见万物&#xff0c;能常觉、常照&#xff0c;任何东西都无所遁形。&#xff08;相信直觉&#xff09; 君子学习&#xff0c;是为了修养自己。 从不担忧别人会欺骗自己&#xff0c;只是永远不欺骗自己的…

docker笔记7-dockerfile

docker笔记7-dockerfile 一、dockerfile介绍二、dockerfile指令三、构建自己的镜像 一、dockerfile介绍 Dockerfile是用来构建Docker镜像的构建文件&#xff0c;是由一系列命令和参数构成的脚本。 以下是常用的 Dockerfile 关键字的完整列表和说明&#xff1a; 二、docker…

实时捕获数据库变更

1.CDC概述 CDC 的全称是 Change Data Capture &#xff0c;在广义的概念上&#xff0c;只要能捕获数据变更的技术&#xff0c;我们都可以称为 CDC 。我们目前通常描述的CDC 技术主要面向数据库的变更&#xff0c;是一种用于捕获数据库中数据变更的技术&#xff0c;CDC 技术应用…

C语言进阶 10. 字符串

C语言进阶 10. 字符串 文章目录 C语言进阶 10. 字符串10.1. 字符串10.2. 字符串变量10.3. 字符串输入输出10.4. 字符串数组10.5. 单字符输入输出10.6. 字符串函数strlen()10.7. 字符串函数strc()10.8. 字符串函数strcpy()10.9. 字符串搜索函数10.10. PAT10-0. 说反话 (20)10-1.…

RK3568平台(input篇)input数据上报分析

一.input设置事件类型 __set_bit 是一个位操作函数&#xff0c;用于设置一个位图中的特定位&#xff0c;例如可以通过下面的代码将 输入设备设置为支持按键事件&#xff1a; __set_bit(EV_KEY,myinput_dev->evbit) 第一位为设置设置事件类型。 第二位为输入设备的能力 和…

6 网络

6 网络 1、概念2 IP地址3、套接字4、TCP协议4.1 TCP协议的基本特征4.2 建立连接4.4 终止连接4.5 编程模型 5、UDP协议5.1 UDP协议的基本特性5.2 常用函数5.3 UDP通信模型 6、域名解析 1、概念 计算机网络是实现资源共享和信息传递的计算机系统 ISO/OSI网络协议模型 TCP/IP协…

应急响应靶场

靶场搭建 靶场环境搭建&#xff1a;首先确定目标靶机的IP地址&#xff1a; 端口探测&#xff1a;发现只开放了22号端口 尝试利用hydra进行爆破&#xff1a; 成功找到了密码。ssh远程登录之后&#xff0c;添加后门账号: msfvenom生成msf的木马&#xff1a; 利用python快速搭建h…

代码随想录 day 25 回溯

第七章 回溯算法 part04 491.递增子序列 本题和大家刚做过的 90.子集II 非常像&#xff0c;但又很不一样&#xff0c;很容易掉坑里。 https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html 视频讲解&#xff1a;https://www.bilibili.com/vi…

培训第十六天(web服务apache与nginx)

上午 静态资源 根据开发者保存在项目资源目录中的路径访问静态资源html 图片 js css 音乐 视频 f12&#xff0c;开发者工具&#xff0c;网络 1、web基本概念 web服务器&#xff08;web server&#xff09;&#xff1a;也称HTTP服务器&#xff08;HTTP server&#xff09;&am…