python中函数的用法总结(二阶段)
话接上回,继续讲下函数的用法
10. 函数的注解(Function Annotations)
Python 3 引入了函数注解,允许你在函数定义时给参数和返回值添加注解。注解并不影响函数的实际行为,它们更多地用于代码的可读性、文档生成以及静态分析工具。
示例:函数参数和返回值注解
def add(x: int, y: int) -> int:return x + yprint(add(3, 4)) # 输出 7
在这个示例中,x: int
和 y: int
表示参数 x
和 y
预期是整数类型,-> int
表示该函数的返回值预期是一个整数类型。
注解也可以使用其他数据类型,如 str
、float
、List
、Dict
等。你可以使用 typing
模块中的类型提示进行更复杂的注解。
示例:更复杂的注解
from typing import List, Dictdef process_data(data: List[int]) -> Dict[str, int]:return {"sum": sum(data), "count": len(data)}result = process_data([1, 2, 3, 4])
print(result) # 输出 {'sum': 10, 'count': 4}
11. 函数与闭包(Closures)
闭包是指一个函数在其定义时捕获了外部作用域中的变量。闭包使得一个函数可以“记住”并访问其外部函数的变量,即使外部函数已经返回。
示例:闭包
def outer(x):def inner(y):return x + yreturn innerclosure = outer(10) # 闭包,x 被“记住”
print(closure(5)) # 输出 15
在这个例子中,inner
函数是一个闭包,因为它使用了 outer
函数的参数 x
,即使 outer
已经返回,inner
仍然可以访问 x
。
12. Python 的内置函数
Python 提供了大量的内置函数,可以简化很多常见操作。以下是一些常见的内置函数:
len()
:返回对象(如字符串、列表、字典等)的长度。max()
、min()
:返回序列中的最大值和最小值。sum()
:返回序列中所有元素的和。sorted()
:返回一个排序后的序列副本。all()
:如果所有元素都为真,返回True
,否则返回False
。any()
:如果任何一个元素为真,返回True
,否则返回False
。zip()
:将多个可迭代对象打包成一个元组。map()
:将指定函数应用于可迭代对象的每个元素。filter()
:过滤掉不符合条件的元素。
示例:内置函数 map()
和 filter()
numbers = [1, 2, 3, 4, 5]# 使用 map() 将每个数字乘以 2
doubled = list(map(lambda x: x * 2, numbers))
print(doubled) # 输出 [2, 4, 6, 8, 10]# 使用 filter() 过滤出偶数
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens) # 输出 [2, 4]
13. 函数的调用栈和递归深度
在 Python 中,函数的调用是通过“调用栈”(Call Stack)来管理的。每次调用一个函数时,Python 会将该函数的执行信息压入栈中,直到该函数执行完成并返回结果时,栈中的信息才会被移除。
对于递归函数,如果递归调用的深度过大,可能会导致栈溢出(RecursionError
)。你可以通过设置 sys.setrecursionlimit()
来调整递归的最大深度(但不推荐用于生产环境,因为这可能会影响程序的稳定性)。
示例:递归深度限制
import sys
sys.setrecursionlimit(2000) # 设置递归深度为 2000def factorial(n):if n == 0:return 1return n * factorial(n - 1)print(factorial(1000)) # 输出 1000 的阶乘
14. 函数的性能优化
在 Python 中,函数的性能优化非常重要,尤其是在处理大量数据或复杂计算时。以下是一些常见的优化方法:
1. 避免重复计算
在函数中,尽量避免对同一表达式或计算结果进行多次计算。可以使用变量来保存中间结果,减少重复计算的开销。
# 性能差:重复计算
def calculate(a, b):return (a + b) * (a + b)# 优化:保存中间结果
def optimized_calculate(a, b):sum_ab = a + breturn sum_ab * sum_ab
2. 使用内置函数和库
Python 内置函数通常是用 C 语言实现的,性能上比 Python 自定义的代码更高效。例如,在处理列表时,使用内置的 sum()
、min()
、max()
等函数通常比用 for
循环实现要快。
# 性能差:手动计算和比较
def manual_sum(numbers):total = 0for num in numbers:total += numreturn total# 优化:使用内置函数
def optimized_sum(numbers):return sum(numbers)
3. 使用生成器而非列表
如果不需要一次性加载所有数据,使用生成器而不是列表可以节省大量内存并提高性能,尤其是在处理大数据时。
# 性能差:使用列表
def get_squared_numbers(numbers):return [x ** 2 for x in numbers]# 优化:使用生成器
def get_squared_numbers_generator(numbers):for x in numbers:yield x ** 2
生成器按需计算每个值,而不是一次性将所有值放入内存。
4. 避免过度的函数调用
在一些性能要求较高的代码中,函数调用的开销也可能影响性能。虽然 Python 中的函数调用开销较小,但在处理大量数据时,过多的函数调用会成为性能瓶颈。如果可能,尽量将代码逻辑集中在少数几个函数中。
5. 利用并行化和多线程
Python 中可以使用 concurrent.futures
或 threading
模块来实现多线程或并行计算,从而加速一些耗时的任务。
import concurrent.futuresdef square(x):return x ** 2numbers = [1, 2, 3, 4, 5]# 使用多线程加速计算
with concurrent.futures.ThreadPoolExecutor() as executor:results = list(executor.map(square, numbers))print(results) # 输出 [1, 4, 9, 16, 25]
在 CPU 密集型任务中,使用 concurrent.futures.ProcessPoolExecutor
可以更好地利用多核 CPU。
15. 函数与异步编程(Async Programming)
Python 支持异步编程,可以通过 async def
和 await
关键字来定义异步函数。异步编程通常用于 I/O 密集型任务,比如网络请求、文件操作等,以提高程序的响应性和并发性。
示例:异步函数和事件循环
import asyncioasync def hello_world():print("Hello")await asyncio.sleep(1) # 模拟异步I/O操作print("World")# 运行异步任务
asyncio.run(hello_world())
输出:
Hello
World
在这个例子中,asyncio.sleep(1)
是一个异步操作,await
关键字表示等待该异步操作完成。由于 Python 是单线程运行的,通过异步编程,我们可以在等待 I/O 操作时继续执行其他任务,从而提高效率。
示例:并发执行多个异步任务
import asyncioasync def fetch_data(n):print(f"Fetching data {n}")await asyncio.sleep(1)print(f"Data {n} fetched")return f"Result {n}"async def main():tasks = [fetch_data(i) for i in range(5)]results = await asyncio.gather(*tasks)print(results)# 运行多个异步任务
asyncio.run(main())
输出:
Fetching data 0
Fetching data 1
Fetching data 2
Fetching data 3
Fetching data 4
Data 0 fetched
Data 1 fetched
Data 2 fetched
Data 3 fetched
Data 4 fetched['Result 0', 'Result 1', 'Result 2', 'Result 3', 'Result 4']
在这个例子中,asyncio.gather(*tasks)
用于并发执行多个异步任务,fetch_data()
是一个异步函数,它模拟了 I/O 操作(通过 await asyncio.sleep(1)
)。使用 asyncio.run(main())
来启动事件循环并执行所有任务。
函数的用法说完了,你是否都会用到呢?
相关文章:
python中函数的用法总结(二阶段)
话接上回,继续讲下函数的用法 10. 函数的注解(Function Annotations) Python 3 引入了函数注解,允许你在函数定义时给参数和返回值添加注解。注解并不影响函数的实际行为,它们更多地用于代码的可读性、文档生成以及静…...
一份关于 Ubuntu 系统下代理配置的故障排查笔记
Ubuntu下代理配置故障排查指南 问题描述 在 Ubuntu 系统中开启了代理模式但访问依然很慢或无法访问。 排查步骤 1. 检查代理服务状态 # 检查端口监听状态 sudo apt install net-tools # 如果未安装 netstat sudo netstat -tulpn | grep 7897 # network statistics# 正…...
使用 Colyseus 构建多人实时白板应用
使用 Colyseus 构建多人实时白板应用 使用 Colyseus 构建多人实时白板应用涉及以下几个关键步骤:设置服务器、设计房间逻辑、同步客户端状态以及实现前端交互。以下是详细的实现流程: 0. 示例白板功能 基础功能 实时绘制同步: 用户在白板上绘制时,其绘制的点会立即显示在…...
【探花交友】SpringCache
目录 通用缓存SpringCache 重要概念 导入依赖 开启缓存支持 编写UserInfoService 缓存Cacheable 发布视频清空缓存 通用缓存SpringCache 实现缓存逻辑有2种方式: 每个接口单独控制缓存逻辑 统一控制缓存逻辑Spring从3.1开始定义了org.springframework.cac…...

Spring API 接口加密/解密
API 接口加密/解密 为了安全性需要对接口的数据进行加密处理,不能明文暴露数据。为此应该对接口进行加密/解密处理,对于接口的行为,分别有: 入参,对传过来的加密参数解密。接口处理客户端提交的参数时候,…...
漏洞扫描:网络安全的 “体检” 与 “防护指南”
在当今数字化时代,网络安全如同守护城堡的坚固城墙,而漏洞扫描则是检查城墙是否存在缝隙与薄弱环节的重要手段。那么,究竟什么是漏洞扫描?又该如何进行呢? 什么是漏洞扫描? 漏洞扫描是一种安全检测过程&a…...
【可靠有效】springboot使用netty搭建TCP服务器
Netty Netty是一个高性能、异步事件驱动的网络应用程序框架,它提供了对并发和异步编程的抽象,使得开发网络应用程序变得更加简单和高效。 在Netty中,EventLoopGroup是处理I/O操作的多线程事件循环器。在上面的示例中,我们创建了两个EventLoopGroup实例:bossGroup和worker…...

机器视觉中的单线程、多线程与跨线程:原理与应用解析
在机器视觉应用中,程序的运行效率直接影响到系统的实时性和稳定性。随着任务复杂度的提高,单线程处理往往无法满足高性能需求,多线程技术因此被广泛应用。此外,跨线程操作(如在多线程中更新界面或共享资源)…...
0040__Linux内核4.14版本——drm框架分析(1)——drm简介
https://download.csdn.net/blog/column/11175480/133602965 通过DRM绘制图像_drmmodegetresources-CSDN博客 https://zhuanlan.zhihu.com/p/336395524 19. 屏幕显示(DRM)介绍 — [野火]Linux基础与应用开发实战指南——基于LubanCat-RK系列板卡 文档 DRM设备信息_drmmoder…...

珞珈一号夜光遥感数据地理配准,栅格数据地理配准
目录 一、夜光数据下载: 二、夜光遥感数据地理配准 三、计算夜光数据值 四、辐射定标 五、以表格显示分区统计 五、结果验证 夜光数据位置和路网位置不匹配,虽然都是WGS84坐标系,不匹配!!!不要看到就直接…...

【GlobalMapper精品教程】091:根据指定字段融合图斑(字段值相同融合到一起)
文章目录 一、加载数据二、符号化三、融合图斑1. 根据图斑位置进行融合2. 根据指定字段四、注意事项一、加载数据 订阅专栏后,从私信中查收配套实验数据包,找到data091.rar,解压并加载,如下图所示: 属性表如下: 二、符号化 为了便于比对不同的融合结果,查看属性表根据…...

Quartz任务调度框架实现任务动态执行
说明:之前使用Quartz,都是写好Job,指定一个时间点,到点执行。最近有个需求,需要根据前端用户设置的时间点去执行,也就是说任务执行的时间点是动态变化的。本文介绍如何用Quartz任务调度框架实现任务动态执行…...

ESP-IDF学习记录(1)ESPIDF环境安装,框架了解,资料整理
以后只要有空就会进行学习记录,主要是自用,学到哪记录到哪,有时候东西记录下来能得到不通的理解。 最终的目的是为了用esp32驱动屏幕,学习设计LVGL界面,做一些小产品,有益于公司及个人。之前接触多的UI还是…...

Windows系统提示synsoacc.dll文件报错要怎么解决?
一、文件丢失问题:深度剖析与应对策略 文件丢失是电脑运行时常见的问题之一。它可能由多种原因引起,如硬盘故障、病毒攻击、不当的文件操作等。当Windows系统提示synsoacc.dll丢失时,通常意味着该文件对于当前正在运行的程序或系统服务至关重…...

React(一)—— router/useRef/useState
文章目录 项目地址一、构建项目1.1 使用vite构建项目1.2 所需插件二、Router2.1 安装router2.2 创建路由规则2.3 创建导航栏2.3.1 添加样式文件2.3.2 添加导航栏组件2.3.3 给每个页面添加Menu导航栏2.4 通过路由给页面传值三、Hooks3.1 useRef3.2 useRef操作DOM元素3.3 useRef进…...

ipad如何直连主机(Moonlight Sunshine)
Windows 被连接主机(Windows) 要使用的话需要固定ip,不然ip会换来换去,固定ip方法本人博客有记载Github下载Sunshine Sunshine下载地址除了安装路径需要改一下,其他一路点安装完成后会打开Sunshine的Web UIÿ…...

音视频入门知识(二)、图像篇
⭐二、图像篇 视频基本要素:宽、高、帧率、编码方式、码率、分辨率 其中码率的计算:码率(kbps)=文件大小(KB)*8/时间(秒),即码率和视频文件大小成正比 YUV和RGB可相互转换 ★YUV(原始数据&am…...
v-if 和 v-show 的区别
一、原理区别 1. v-if 这是一个指令,用于条件性地渲染一个元素块。当v-if表达式的值为true时,元素及其包含的子元素才会被渲染到 DOM 中;当表达式的值为false时,元素及其子元素会被完全移除。这意味着在切换v-if的条件时&#x…...

解密MQTT协议:从QOS到消息传递的全方位解析
1、QoS介绍 1.1、QoS简介 使用MQTT协议的设备大部分都是运行在网络受限的环境下,而只依靠底层的TCP传输协议,并不 能完全保证消息的可靠到达。 MQTT提供了QoS机制,其核心是设计了多种消息交互机制来提供不同的服务质量,来满足…...

Java-02 深入浅出 MyBatis - MyBatis 快速入门(无 Spring) POM Mapper 核心文件 增删改查
点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatisÿ…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...