[Python学习日记-33] Python 中的嵌套函数、匿名函数和高阶函数

[Python学习日记-33] Python 中的嵌套函数、匿名函数和高阶函数

简介

嵌套函数

匿名函数

高阶函数

简介

        在 Python 当中函数除了能减少重复代码、扩展性强和易维护外,其实还有挺多不通的玩法的,例如嵌套函数、匿名函数、高阶函数等,它们是一些强大的编程概念,可以使代码更加简洁、灵活和高效,下面我们将会一一介绍。

嵌套函数

        函数里不仅可以写代码,还可以嵌套函数。而嵌套函数是指在一个函数内部定义另一个函数的情况。嵌套函数可以访问其外部函数的变量,但外部函数无法访问嵌套函数的变量。嵌套函数可以作为内部函数返回或作为参数传递给其他函数使用。代码如下

name = "Python日记"

def change():
    name = "Python日记,成长每一天"

    def change2():
        # global name  如果声明了这句,下面的name改的是最外层的全局变层
        name = "Python日记,成长每一天,天天长高高"    # 这句注释掉的话,下面name打印的是哪个值?
        print("第3层打印", name)

    change2()    # 调用内层函数
    print("第2层打印", name)

change()
print("最外层打印", name)

代码输出如下:

        通过上面的例子,我们理解了,每个函数里的变量是互相独立的,变量的查找顺序也是从当前层依次往上层找。在这里可能有的同学会有疑问,这个嵌套函数感觉有点多此一举呀,为什么非要在函数里面再嵌套一个呢?嵌套函数有其自身的有点

  • 封装性:内部函数可以访问外部函数的变量,提供了一种封装数据和逻辑的方式,减少了全局变量的使用,提高了代码的安全性和可维护性。
  • 增加代码的可读性和组织性:可以将相关的功能分组在一起。

        但是最主要的还是因为在后面的一些高级技巧里面我们会使用到这个嵌套函数,例如装饰器,所以我们在这里要先提前了解它的用法。 

匿名函数

        匿名函数就是不需要显式的指定函数名的函数,也称为lambda函数。匿名函数通常用于简单的功能,可以在需要函数的地方直接定义和使用,而不需要显式地定义一个函数。我们先看一段普通代码

def calc(x,y):
    return x**y
print(calc(2,5))

        换成匿名函数我们应该怎么写呢?

calc = lambda x,y:x**y
print(calc(2,5))

代码输出如下:

         你也许会说,用上这个东西没感觉有什么方便呀。确实如果是这么用,确实没什么改进,不过匿名函数主要是和其它函数搭配使用的呢,我们先看一下匿名函数最简单的一个用法,为了方便理解,我们先看用普通的方法如何实现,代码如下

def calc(x):
    return x**2

c = map(calc, [1,5,7,4,8])

print(c)
for i in c:
    print(i)

代码输出如下:

        使用匿名函数实现上面代码的功能 

c = map(lambda x:x**2, [1,5,7,4,8])

print(c)    # 返回的是一个内存地址,可以for循环取出来
for i in c:
    print(i)

代码输出如下:

 

        从输出结果来看,可以看得出实现的结果是完全一样的,并且还少了好几行代码。下面我们来看看匿名函数最复杂的一种用法,即匿名函数内使用三元运算,代码如下 

c = map(lambda x:x**2 if x > 10 else x**3, [1,5,7,4,8,12])    # lambda最复杂就是写三元运算
print(c)    # 返回的是一个内存地址,可以for循环取出来
for i in c:
    print(i)

代码输出如下:

 

        从上面的演示来看匿名函数除了减少了几行代码外也没有多大用处,其最复杂的程度只到三元运算,不过由于他的结构简单其特别适合作为高阶函数的参数,比如在 map()、filter() 和 sortef() 等函数中使用。不过它其主要是用作于后面将会讲到的装饰器上。 

高阶函数

        变量(字符串、整形、浮点型、列表、字典、集合、元组)可以指向函数,函数的参数能接收变量,那么一个函数即可以接收一个或多个函数作为参数,也可以返回一个函数,这种函数就称之为高阶函数。例如,map()、filter() 和 reduce() 是 Python 内置的高阶函数。代码如下

# 取绝对值函数
def get_abs(n):
    if n < 0:
        n = int(str(n).strip("-"))
    return n

# 高级函数
def add(x,y,f):
    return f(x) + f(y)

print(add(5,-10,get_abs))    # 函数 get_abs 作为参数传入

代码输出如下:

 

其实高阶函数只要满足以下任意一个条件,即是高阶函数

  • 接收一个或者多个函数作为输入
  • 把另一个函数作为返回值

        在本篇提到的嵌套函数、匿名函数和高阶函数,在现在所学到的知识看来是毫无用处的,其实这三个函数类型主要的用处是用在后面将会讲到的装饰器上面。

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

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

相关文章

毕业论文设计javaweb+VUE高校教师信息管理系统

目录 一、系统概述 二、功能详解 1. 教师管理 2. 部门管理 3. 奖惩管理 4. 业绩管理 5. 培训管理 6. 报表查询 三、总结 四、示例代码 1 前端VUE 2 后端SpringBootjava 3 数据库表 随着教育信息化的发展&#xff0c;传统的手工管理方式已经不能满足现代学校对教师…

算法葫芦书(笔试面试)

一、特征工程 1.特征归一化&#xff1a;所有特征统一到一个区间内 线性函数归一化&#xff08;0到1区间&#xff09;、零均值归一化&#xff08;均值0&#xff0c;标准差1&#xff09; 2.类比型特征->数值性特征 序号编码、独热编码、二进制编码&#xff08;010&#xf…

Squaretest单元测试辅助工具使用

1、idea安装插件 Squaretest 然后关掉idea 2、安装字节码软件&#xff08;jclasslib&#xff09; 3、找到idea里面的Squaretest安装目录 找到包含TestStarter的jar包 4、打开 com.squaretest.c.f 打开后选择常量池 5、找到第16个修改 Long value值&#xff0c;修改的数字即为使…

C语言系列4——指针与数组(1)

我们开始C语言的指针与数组 这部分开始进阶了&#xff0c;得反复学习 在开始正题之前&#xff0c;写说一下我们都知道当写一个函数的时候需要进行传参&#xff0c;当实参传递给形参的时候&#xff0c;形参是有独立空间的&#xff0c;那么数组传参又是怎么样的呢&#xff0c;我…

基于Spring Boot+Vue的减肥健康管理系统设计和实现【原创】(BMI算法,协同过滤算法、图形化分析)

&#x1f388;系统亮点&#xff1a;图形化分析、BMI算法&#xff0c;协同过滤算法&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a…

TI DSP TMS320F280025 Note17:CMPSS原理与使用

TMS320F280025 模数转换器(ADC) ` 文章目录 TMS320F280025 模数转换器(ADC)CMPSS框图比较器参考斜坡发生器滤波器比较器应用CMPSSDriver.cCMPSSDriver.hEPWM与CMPSS配合使用信号流程EPWMDriver.cEPWMDriver.hCMPSS框图 所谓比较器,正端输入大于负端输入时,输出高;正端输入小…

启动 Ntopng 服务前需先启动 redis 服务及 Ntopng 常用参数介绍

启动Ntopng服务之前需要先启动redis服务&#xff0c;因为Ntopng服务依赖于redis服务的键值存储。 服务重启 服务启动 Ntopng常用参数&#xff1a; -d 将 Ntopng 进程放入后台执行。默认情况下&#xff0c;Ntop 在前台运行。 -u 指定启动Ntopng执行的用户&#xff0c;默认为…

基于Hadoop的NBA球员大数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

Mysql 删除表的所有数据

在 MySQL 中&#xff0c;如果你想要删除一个表中的所有数据&#xff0c;可以使用 TRUNCATE TABLE 命令或者 DELETE 语句。下面是两种方法的对比以及如何使用它们&#xff1a; 使用 TRUNCATE TABLE TRUNCATE TABLE 是一个非常快速的方法来删除表中的所有记录&#xff0c;并且它…

MFU简介

1、缩写 MFU - Mask Field Utilization&#xff08;光刻掩膜版有效利用比例&#xff09; GDPW - Gross Die Per Wafer&#xff0c;每张wafer上die的数量 2、什么是MASK 在光刻机中&#xff0c;光源&#xff08;紫外光、极紫外光&#xff09;透过mask曝光在晶圆上形成图…

汽车总线之---- LIN总线

Introduction LIN总线的简介&#xff0c;对于传统的这种点对点的连接方式&#xff0c;我们可以看到ECU相关的传感器和执行器是直接连接到ECU的&#xff0c;当传感器和执行器的数量较少时&#xff0c;这样的连接方式是能满足要求的&#xff0c;但是随着汽车电控功能数量的不断增…

Ubuntu开机进入紧急模式处理

文章目录 Ubuntu开机进入紧急模式处理一、问题描述二、解决办法参考 Ubuntu开机进入紧急模式处理 一、问题描述 Ubuntu开机不能够正常启动&#xff0c;自动进入紧急模式&#xff08;You are in emergency mode&#xff09;。具体如下所示&#xff1a; 二、解决办法 按CtrlD进…

Ks渲染做汽车动画吗?汽车本地渲染与云渲染成本分析

Keyshot是一款强大的实时光线追踪和全域光渲染软件&#xff0c;它确实可以用于制作汽车动画&#xff0c;包括汽车模型的渲染和动画展示。Keyshot的动画功能允许用户创建相机移动、物体变化等动态效果&#xff0c;非常适合用于汽车动画的制作。 至于汽车动画的渲染成本&#xff…

golang小项目1-家庭收支记账系统

项目地址&#xff1a;golang小项目 参考资料&#xff1a;尚硅谷golang教程P229 家庭收支记账系统 1. 系统简介 1.1 项目背景 在现代社会中&#xff0c;家庭的财务管理显得尤为重要。随着生活成本的不断上升&#xff0c;家庭需要有效地记录和分析收支情况&#xff0c;以确保…

【C++打怪之路Lv4】-- 类和对象(中)

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文(平均质量分82)&#…

权威人工智能行业认证证书——计算机视觉工程师(中级)

随着人工智能技术的快速发展&#xff0c;越来越多的人开始关注并学习人工智能。然而&#xff0c;由于人工智能领域知识的复杂性和多样性&#xff0c;许多人往往会感到困惑&#xff0c;不知道该从何入手。这时&#xff0c;一份权威的人工智能行业证书可以帮助学习者更好地了解人…

利用Puppeteer-Har记录与分析网页抓取中的性能数据

引言 在现代网页抓取中&#xff0c;性能数据的记录与分析是优化抓取效率和质量的重要环节。本文将介绍如何利用Puppeteer-Har工具记录与分析网页抓取中的性能数据&#xff0c;并通过实例展示如何实现这一过程。 Puppeteer-Har简介 Puppeteer是一个Node.js库&#xff0c;提供…

AI大模型技术已是中小企业数字化转型的战略资源

中小企业数字化转型面临资金、技术、数据隐私和安全等多重挑战&#xff0c;大模型技术的崛起为其提供了新的机遇。 大模型技术凭借庞大的参数和数据处理能力&#xff0c;推动行业创新&#xff0c;展现AI技术的巨大潜力。它提供成本效益高的AI服务&#xff0c;降低技术门槛&…

CMake教程(八):添加定制命令和生成的文件

本篇继续 CMake 官网教程的第八篇教程&#xff0c;所用材料是 Step8 目录下的源代码。 本篇教程主要讲解如何通过 CMake 生成一个头文件&#xff0c;该头文件当中包含了 1 到 10 的平方根表格&#xff0c;然后在程序的其它部分包含这个生成的头文件。 出于教学的目的&#xf…

OpenStack Yoga版安装笔记(十四)启动一个实例

1、官方文档 OpenStack Installation Guidehttps://docs.openstack.org/install-guide/ 本次安装是在Ubuntu 22.04上进行&#xff0c;基本按照OpenStack Installation Guide顺序执行&#xff0c;主要内容包括&#xff1a; 环境安装 &#xff08;已完成&#xff09;OpenStack…