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

news2024/11/17 23:41:19

[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 作为参数传入

代码输出如下:

 

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

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

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

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

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

相关文章

酒店智能开关的组成与功能

酒店智能开关作为智能家居系统的重要组成部分&#xff0c;其应用日益广泛。本文将深入探讨酒店智能开关的组成部分及其功能特点。 酒店智能开关的组成 酒店智能开关的构成相对复杂&#xff0c;但主要可以归纳为以下几个核心部分&#xff1a; 开关主体&#xff1a;开关主体是智能…

带链的队列,入队,退队,检测带链队列的状态

代码&#xff1a; #include<iostream> using namespace std; template<class T> struct node {T d;node *next;}; template<class T> class linked_Queue {private:node<T> *front;node<T> *rear;public:linked_Queue();void prt_linked_Queue(…

联想电脑怎么开启vt_联想电脑开启vt虚拟化教程(附intel和amd主板开启方法)

最近使用联想电脑的小伙伴们问我&#xff0c;联想电脑怎么开启vt虚拟。大多数可以在Bios中开启vt虚拟化技术&#xff0c;当CPU支持VT-x虚拟化技术&#xff0c;有些电脑会自动开启VT-x虚拟化技术功能。而大部分的电脑则需要在Bios Setup界面中&#xff0c;手动进行设置&#xff…

掌握DFIR报表: 法医专家指南

介绍 在数字安全领域&#xff0c;DFIR&#xff08;数字取证和事件响应&#xff09;是一门重要的学科&#xff0c;体现了调查网络事件和破坏行为所必不可少的方法和实践。作为DFIR的核心&#xff0c;对DFIR报告的重视怎么强调都不为过。这些报告不仅仅是文件&#xff1b;它们是…

每天3分钟,彻底弄懂神经网络的优化器(三)Momentum

前面从最初的SGD开始&#xff0c;介绍SGD的算法细节&#xff0c;以及其在深度神经网络中的劣势&#xff0c;本文引入Momentum算法&#xff0c;解决SGD的一些问题。 1. Momentum算法的提出 动量&#xff08;Momentum&#xff09;方法最初由B.T.Polyak在1964年提出。这一方法被…

IAR全面支持国科环宇AS32X系列RISC-V车规MCU

IAR嵌入式开发解决方案将全面支持国科环宇AS32X系列ASIL-B MCU&#xff0c;共同推动汽车高品质应用的安全开发 中国上海&#xff0c;2024年9月29日 – 全球领先的嵌入式系统开发软件解决方案供应商IAR与北京国科环宇科技股份有限公司&#xff08;以下简称“国科环宇”&#xf…

Rust语言桌面应用开发GTK3 Gtk3-rs Glade

文章目录 GTK-RSGithub官网Rust 教程Rust 环境安装 GTK安装 Gladedemo.glade 文件完整示例 main.rs创建 Rust 项目Cargo.toml 文件main.rs 文件 编译运行GTK主题 GTK-RS gtk-rs 是一个用于在 Rust 编程语言中使用 GTK 图形用户界面工具包的库。GTK 是一个流行的跨平台 GUI 工具…

每日论文7-17MWCL基于IMOS的小vco增益变化的VCO

《Small VCO-Gain Variation Adding a Bias-Shifted Inversion-Mode MOS Varactor》17MWCL 对于PLL来说&#xff0c;其中VCO的调谐增益KVCO越线性&#xff0c;其变化程度ΔKvco越小&#xff0c;对PLL的稳定有较大的好处。这篇文章给了一个很简单朴素而有效的补偿var非线性的方…

Maven 编译和Nexus 构建私有仓库

Java 程序编译 编译流程 C 语言源码编译过程&#xff0c;对于单文件&#xff0c;我们可以使用 gcc 命令直接编译即可&#xff0c;但如果是大型商业项目&#xff0c;源码文件多&#xff0c;存在各种依赖&#xff0c;各种配置路径&#xff0c;各种库的支持等&#xff0c;几乎无法…

C0004.Qt中QComboBox设置下拉列表样式后,下拉列表样式无效的解决办法

问题描述 我们平时在使用Qt Creator对控件QComboBox的样式进行设置后,在运行程序启动界面时,发现设置的样式无效,效果如下: /* 设置下拉菜单框的样式 */ QComboBox QAbstractItemView {border: 1px solid rgb(161,161,161); /* 下拉菜单框的边框样式 */ }/* 设置下拉菜单…

现在转行AI晚不晚,应该怎么做呢?

对于40岁以上的非AI程序员来说&#xff0c;转行进入AI领域虽然可能面临一些挑战&#xff0c;但并非不可实现。凭借你已有的编程经验和技术背景&#xff0c;加上适当的学习策略和实践&#xff0c;你可以成功跨入AI领域。以下是一些针对40岁程序员转行AI的建议&#xff0c;特别是…

GCC使用入门

文章目录 GCC简介单个文件编译过程预处理(Preprocessing)编译(Compilation)汇编(Assembly)链接(Linking) 多文件编译过程头文件搜索路径三种不推荐的方法两种推荐的方法 库文件静态库文件创建和使用静态库链接顺序 动态库文件创建和使用动态库 Warning编译选项调试信息(-g)编译…

快递单号物流跟踪管理快速筛选出已签收单号

看着满屏的单号&#xff0c;是不是感觉眼前一黑要查询到什么时候&#xff1f;别灰心&#xff0c;这不快递批量查询高手来了&#xff01;这神器就是用来查询物流的好帮手。一键筛选已签收件单号&#xff0c;并导出表格。有了它&#xff0c;你也能轻松查询大量的单号物流。一起试…

买前必看,教你挑选适合自己的蓝牙耳机(我早点刷到该多好啊)

无论是运动、通勤&#xff0c;还是休闲娱乐时&#xff0c;蓝牙耳机已经成为我们便捷生活的一部分。那么&#xff0c;市场上这么多款蓝牙耳机&#xff0c;我们究竟该怎么选&#xff1f;耳机挑不对&#xff0c;买了也白费&#xff01;买蓝牙耳机之前要搞清楚耳机的这些参数&#…

【算法业务】关于数据驱动的用户增长思考

这篇内容是多年之前&#xff08;2020年&#xff09;的用户增长项目时自己写的总结&#xff0c;这里做一下对于实践和思考的回顾&#xff0c;便于知识的记录和经验分享&#xff0c;内容涉及用户增长理解、个性化推送系统框架、个性化推送问题建模、推送内容池构建、智能文案生成…

BMT Building Maker Toolset 房屋建筑快速创建工具

BuildingMakerToolset提供了一个用于创建建筑和放置预制件的自定义工作流程。 如果你需要为你的游戏设计一些带室内装饰的建筑,或者你是一名关卡设计师,你想让你的工作流程更有效,这可能是适合你的资产。 该工具集与200多个墙壁、电缆、管道等预制件配对。所有预制件都指定了…

基于NXP LS1046+FPGA的轨道交通3U CPCI多网口解决方案,支持QNX/VXWOKRS/LINUX

Feature Summary Specification Description 处理器 NXP LS1046A at up to 1.4GHz 存储 DDR4&#xff0c; 16GB Emmc&#xff0c;16MB QSPI FLASH 板卡形状 3U标准CPCI板卡 尺寸 160.00 100.00mm 接口 2路2.5GE 2路1GE 1路RS232 1路IRIGB 调试接口 JTAG / COP de…

AI生成头像表情包副业,每天仅需十分钟,无脑操作月入过万!

项目介绍 今天我想与大家分享一个有趣的项目&#xff1a;AI生成表情包和头像。这对于我们进行IP打造来说&#xff0c;实在是个不错的选择&#xff0c;尤其是像我这样的头像。那为什么说每天只需花费10分钟呢&#xff1f;接下来我们来探讨一下。 这个项目的核心在于利用AI技术…

读取到json数据拿出来,修改后重新写入json文件

在写程序过程中&#xff0c;有些时候需要拿到json里面的数据&#xff0c;再进行修改&#xff0c;哪该怎么操作呢&#xff1f;跟着我以下的操作进行&#xff0c;就能更改json文件的内容了。 比如说我要修改年级的状态&#xff0c;修改为0 先创建一个json文件&#xff0c;数据格…

vue3项目中引入Cesium

1、创建项目 本文章是我学习Cesium时记录下来的&#xff0c;是我用来学习使用的。 使用vitevue3创建项目&#xff0c;组件库使用element plus&#xff0c;项目地址在我的gitee仓库中有&#xff0c;https://gitee.com/the-world-keeps-blooming/my-vite-vue-cesium。 在vite中有…