Python从0到100(十五):函数的高级应用

在这里插入图片描述

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学习学习和学业的先行者!
欢迎大家订阅专栏:零基础学Python:Python从0到100最新最全教程!

一、 闭包

闭包定义:
Python函数是支持嵌套的。 如果在一个内部函数中对外部函数作用域(非全局作用域)的变量进行引用,那么内部函数就会被称为闭包。闭包需要满足如下3个条件:

  • 存在于两个嵌套关系的函数中,并且闭包是内部函数;
  • 内部函数引用了外部函数的变量(自由变量);
  • 外部函数会把内部函数的函数名称返回。

闭包示例:
在这里插入图片描述

二、装饰器

1.装饰器的概念

假设我们已经开发了一个本有的函数,后续可能会增加临时的需求,例如插入日志,我们可以增加一个包裹函数,由它来负责这些额外的需求,这个包裹函数就是 装饰器
装饰器主要应用在如下场景:

  1. 引入日志;
  2. 函数执行时间统计;
  3. 执行函数前预备处理;
  4. 执行函数后清理功能;
  5. 权限校验;
  6. 缓存。

装饰器是一个函数,它需要接收一个参数,该参数表示被修饰的函数。例如,有如下一个装饰器函数:

def myDectoration(func):
    def inner():
        print("正在执行内部函数")
        func()
    return inner

def printMessage():
    print("--------欢迎您-------")
pm = myDectoration(printMessage)
pm()
# 正在执行内部函数
# --------欢迎您-------
  • 装饰器是个嵌套函数
  • 内部函数是一个闭包。
  • 外部函数接收的是被修饰的 函数(func)

通过在函数定义的前面添加@符号和装饰器名,实现装饰器对函数的包装。给f1函数加上装饰器,示例如下:

@w1
def f1():
    print(’f1')

此时,程序会自动编译生成调用装饰器函数的代码,等价于:

f1 = w1(f1)

2. 多个装饰器

多个装饰器应用在一个函数上,调用顺序是从下至上

@w1
@w2
def f1():
    print(---f1---)

执行顺序:
先执行@w2,后执行@w1

3.装饰有参数的函数

看看下面的代码,运行结果是什么呢?

def w1(func):
	def inner(a,b):
		print('开始验证权限')
		func(a,b)
	return inner
@w1
def tes(a,b):
    print('a=%d,b=%d'%(a,b))
tes(1,2)
# 开始验证权限
# a=1,b=2

三、递归调用

Python中允许函数嵌套定义,也允许函数之间相互调用,而且一个函数还可以直接或间接的调用自身。

def fac(num):
    if num in (0, 1):
        return 1
    return num * fac(num - 1)

上面的代码中,fac函数中又调用了fac函数,这就是所谓的递归调用。代码第2行的if条件叫做递归的收敛条件,简单的说就是什么时候要结束函数的递归调用,在计算阶乘时,如果计算到01的阶乘,就停止递归调用,直接返回1;代码第4行的num * fac(num - 1)是递归公式,也就是阶乘的递归定义。下面,我们简单的分析下,如果用fac(5)计算5的阶乘,整个过程会是怎样的。

# 递归调用函数入栈
# 5 * fac(4)
# 5 * (4 * fac(3))
# 5 * (4 * (3 * fac(2)))
# 5 * (4 * (3 * (2 * fac(1))))
# 停止递归函数出栈
# 5 * (4 * (3 * (2 * 1)))
# 5 * (4 * (3 * 2))
# 5 * (4 * 6)
# 5 * 24
# 120
print(fac(5))    # 120

注意,函数调用会通过内存中称为“栈”(stack)的数据结构来保存当前代码的执行现场,函数调用结束后会通过这个栈结构恢复之前的执行现场。栈是一种先进后出的数据结构,这也就意味着最早入栈的函数最后才会返回,而最后入栈的函数会最先返回。例如调用一个名为a的函数,函数a的执行体中又调用了函数b,函数b的执行体中又调用了函数c,那么最先入栈的函数是a,最先出栈的函数是c。每进入一个函数调用,栈就会增加一层栈帧(stack frame),栈帧就是我们刚才提到的保存当前代码执行现场的结构;每当函数调用结束后,栈就会减少一层栈帧。通常,内存中的栈空间很小,因此递归调用的次数如果太多,会导致栈溢出(stack overflow),所以递归调用一定要确保能够快速收敛。我们可以尝试执行fac(5000),看看是不是会提示RecursionError错误,错误消息为:maximum recursion depth exceeded in comparison(超出最大递归深度),其实就是发生了栈溢出。

我们使用的Python官方解释器,默认将函数调用的栈结构最大深度设置为1000层。如果超出这个深度,就会发生上面说的RecursionError。当然,我们可以使用sys模块的setrecursionlimit函数来改变递归调用的最大深度,例如:sys.setrecursionlimit(10000),这样就可以让上面的fac(5000)顺利执行出结果,但是我们不建议这样做,因为让递归快速收敛才是我们应该做的事情,否则就应该考虑使用循环递推而不是递归。

再举一个之前讲过的生成斐波那契数列的例子,因为斐波那契数列前两个数都是1,从第3个数开始,每个数是前两个数相加的和,可以记为f(n) = f(n - 1) + f(n - 2),很显然这又是一个递归的定义,所以我们可以用下面的递归调用函数来计算第​n个斐波那契数。

def fib(n):
    if n in (1, 2):
        return 1
    return fib(n - 1) + fib(n - 2)


# 打印前20个斐波那契数
for i in range(1, 21):
    print(fib(i))

需要提醒大家,上面计算斐波那契数的代码虽然看起来非常简单明了,但执行性能是比较糟糕的,原因大家可以自己思考一下,更好的做法还是之前讲过的使用循环递推的方式,代码如下所示。

def fib(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a

四、常见Python内置函数

1.map函数

map函数会根据提供的函数对指定的序列做 映射
map函数的定义如下:

map(function, iterable,)

第1个参数是函数的名称;第2个参数表示支持迭代的容器或者迭代器
map函数的作用是以参数序列中的每个元素分别调用function函数,把每次调用后返回的结果保存为对象。

func = lambda x:x+2
result = map(func, [1,2,3,4,5])
print(list(result))

2.filter函数

filter函数会对指定序列执行 过滤操作
filter函数的定义如下:

filter(function,iterable)

第1个参数可以是函数的名称;第2个参数表示的是序列、支持迭代的容器或迭代器。

func = lambda x:x%2
result = filter(func, [1, 2, 3, 4, 5])
print(list(result))

装饰器是Python中的特色语法,可以通过装饰器来增强现有的函数,这是一种非常有用的编程技巧。一些复杂的问题用函数递归调用的方式写起来真的很简单,但是函数的递归调用一定要注意收敛条件和递归公式,找到递归公式才有机会使用递归调用,而收敛条件确定了递归什么时候停下来。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ARFoundation自学01】搭建AR框架+检测平面+点击克隆立方体到地面=自信入门!

介绍 AR 的功能其实是个大手机系统厂商和眼镜设备厂商开发的功能,并不是Unity的功能,毕竟Unity没有自己的手机设备!比如谷歌公司的安卓开发了ARcore,让所有安卓8.0版本以上的用户能够在手机上体验AR功能!苹果推出了AR…

token逆向和简单的字体解密

一、token加密部分 网址:aHR0cHM6Ly9qenNjLmpzdC56ai5nb3YuY24vUHVibGljV2ViL2luZGV4Lmh0bWwjLw 点开查询的xhr的包,发现headers中含有token这一加密参数。 直接跟栈,很容发现在第三个栈加密。 s Object(L.b)(l).toString(),由…

VASA-1:一键生成高质量视频,颠覆你的想象!

VASA-1:语音生成AI视频 前言 最近,微软公司公布了一项图生视频的 VASA-1 框架,该 AI 框架只需使用一张真人肖像照片和一段个人语音音频,就能够生成精确逼真的相对应文本的视频,而且可以使表情和面部动作表现的十分自然…

Dubbo应用可观测性升级指南与踩坑记录

应用从dubbo-3.1.*升级到dubbo-*:3.2.*最新稳定版本,提升应用的可观测性和度量数据准确性。 1. dubbo版本发布说明(可不关注) dubbo版本发布 https://github.com/apache/dubbo/releases 【升级兼容性】3.1 升级到 3.2 2. 应用修改点 应用一般只需要升级dubbo-s…

Windows 的常用命令(不分大小写)

Net user (查看当前系统所有的账户) net user yourname password /add 添加新用户 net localgroup administrators yourname /add 添加管理员权限 net user yourname /delete 删除用户 net user 命令 [colorred]说明:以下命令仅限持管理员…

CentOS 7安装、卸载MySQL数据库(一)

说明:本文介绍如何在CentOS 7操作系统下使用yum方式安装MySQL数据库,及卸载; 安装 Step1:卸载mariadb 敲下面的命令,查看系统mariadb软件包 rpm -qa|grep mariadb跳出mariadb软件包信息后,敲下面的命令…

振弦采集仪在岩土工程施工控制中的作用与效果

振弦采集仪在岩土工程施工控制中的作用与效果 河北稳控科技振弦采集仪在岩土工程施工中是一种常见的测量仪器,它通过对地表地震波的传播和振动特性进行监测,可以提供关键的信息,用于控制施工质量和安全。振弦采集仪具有精度高、反应快的特点…

ADOP带您了解光模块发射光功率的四种测试方法

🤲🤲品质优良的光模块在发货前一般经过了严格的硬件测试和光学测试,光学测试主要检测光模块的兼容性,硬件测试主要是参数测试,其中包含发射光功率、接收灵敏度、工作温度、偏置电流等等。 🌐🌐…

07 文件-IO流字节流

File File类的使用 File对象既可以代表文件、也可以代表文件夹。它封装的对象仅仅是一个路径名,这个路径可以存在,也可以不存在 创建File类的对象 构造器说明public File(String pathname)根据文件路径创建文件对象public File(String parent, Strin…

(精)3款好用的企业防泄密软件推荐 | 好用电脑文件防泄密软件推荐

企业防泄密是指通过一系列的技术手段和管理措施,防止企业的敏感信息、核心技术、商业机密等被未经授权的第三方获取或泄露。 这不仅是保护企业资产和知识产权的重要手段,也是维护企业声誉、保持市场竞争力的关键因素。 而企业防泄密软件则是专门用于实…

JavaScript之模块化规范详解

文章的更新路线:JavaScript基础知识-Vue2基础知识-Vue3基础知识-TypeScript基础知识-网络基础知识-浏览器基础知识-项目优化知识-项目实战经验-前端温习题(HTML基础知识和CSS基础知识已经更新完毕) 正文 CommonJS、UMD、CMD和ES6是不同的模块…

2024/4/21周报

文章目录 摘要Abstract文献阅读题目问题贡献方法卷积及池化层LSTM层CNN-LSTM模型 数据集参数设置评估指标实验结果 深度学习使用GRU和LSTM进行时间预测1.库的导入&数据集2.数据预处理3.模型定义4.训练过程5.模型训练 总结 摘要 本周阅读了一篇基于CNN-LSTM黄金价格时间序列…

【热门话题】常用经典目标检测算法概述

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 常用经典目标检测算法概述1. 滑动窗口与特征提取2. Region-based方法R-CNN系列M…

心理学|变态心理学健康心理学——躯体疾病患者的一般心理特点

一、对客观世界和自身价值的态度发生改变 患者除了内部器官有器质或功能障碍外,他们的自我感觉和整个精神状态也会发生变化。使人改变对周围事物的感受和态度,也可以改变患者对自身存在价值的态度。这种主观态度的改变,可以使患者把自己置于人…

【Linux驱动层】iTOP-RK3568学习之路(三):字符设备驱动框架

一、总体框架图 二、字符设备相关函数 静态申请设备号 register_chrdev_region 函数原型:register_chrdev_region(dev_t from, unsigned count, const char *name) 函数作用:静态申请设备号,可以一次性申请多个连续的号,count指定…

Python读取influxDB数据库(二)(influxDB2.X版本)

1. influxDB连接 首先在浏览器中输入influxDB的IP和端口,然后输入账号密码进入到influxDB数据库来进行数据的相关操作: 里面的bucket相当于sql中的数据库,_measurement相当于sql中的表 2. 获取influxDB数据库的token方法 3. 写查询语句来查询…

新火种AI|号称“史上最强大开源模型”的Llama3,凭什么价值百亿美金?

作者:小岩 编辑:彩云 4月19日,Facebook母公司Meta重磅推出了Llama3。 即便大家现在对于大厂和巨头频繁迭代AI模型的行为已经见怪不怪,Meta的Llama3仍旧显得与众不同,因为这是迄今最强大的开源AI模型。 Meta推出了重…

Redis从入门到精通(二十一)Redis最佳实践(二)mset、pipeline、慢查询优化、内存划分

文章目录 前言7.2 批处理优化7.2.1 命令执行流程7.2.2 mset7.2.3 Pipeline7.2.4 集群下的批处理7.2.4.1 问题与解决方案7.2.4.2 基于Spring的串行化执行 7.3 服务器端优化7.3.1 持久化配置7.3.2 慢查询优化7.3.2.1 什么是慢查询7.3.2.2 如何查看慢查询 7.3.3 命令及安全配置7.3…

智慧安防边缘计算硬件AI智能分析网关V4算法启停的操作步骤

TSINGSEE青犀视频智能分析网关V4内置了近40种AI算法模型,支持对接入的视频图像进行人、车、物、行为等实时检测分析,上报识别结果,并能进行语音告警播放。硬件管理平台支持RTSP、GB28181协议、以及厂家私有协议接入,可兼容市面上常…

MySQL 基础语法(2)

文章目录 创建表查看表修改表表数据插入 本文为表结构相关的基础语言库相关的基础语句 创建表 CREATE TABLE table_name ( field1 datatype comment xxx, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;CREATE TABLE&#xff1…