[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**2c = 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.rhkb.cn/news/438963.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 无边框窗体,加阴影效果、多组件拖动、改变大小等功能完美实现优化版效果体验

一、预览效果 国庆节第一天,祝祖国繁荣昌盛! 1.1 效果图 (WinForm无边框窗体,F11可全屏) 拖动窗体时半透明效果(拖动时参考窗体后面释放位置) 说明:本功能的实现基于网友的原型完善而来,更多代码可以参考他的文章 h

图解大模型计算加速系列:vLLM源码解析3,Prefix Caching

【全文目录如下】 一、两种不同的BlockAllocator 二、物理块和逻辑块的结构 三、prefill阶段的物理块分配方法 3.1 allocate函数入口 3.2 计算物理块hash值的方法 3.3 使用LRUEvictor管理物理块分配细节 3.4 再探LRUEvictor&#xff0c;理解“prefix” …

Elasticsearch学习记录

阅读前须知 本文通过安装elasticsearch-7.17.0为基础&#xff0c;使用 kibana-7.17.0 对 elasticsearch 进行操作&#xff0c;本文中 es 是对 elasticsearch 的简写。 下载地址&#xff1a;elasticsearch_免费高速下载|百度网盘-分享无限制 (baidu.com) 1 初识Elasticsearch …

阿里巴巴开源的FastJson 1反序列化漏洞复现攻击保姆级教程

免责申明 本文仅是用于学习检测自己搭建的靶场环境有关FastJson1反序列化漏洞的原理和攻击实验,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其所在…

【重学 MySQL】四十五、数据库的创建、修改与删除

【重学 MySQL】四十五、数据库的创建、修改与删除 一条数据存储的过程数据输入数据验证数据处理数据存储数据持久化反馈与日志注意事项 标识符命名规则基本规则长度限制保留字与特殊字符命名建议示例 MySQL 中的数据类型创建数据库创建数据库时指定字符集和排序规则 查看数据库…

Ubuntu安装Hadoop3.4

1、创建Hadoop用户 sudo adduser hadoop 将Hadoop加进sudo用户组,赋予更高权限: sudo usermod -G sudo hadoop 3、安装JDK(略) 查看JDK安装路径:which java 和 ls -al 3、配置SSH免密登录 在Hadoop分布式集群环境中,各个机器之间的通信通常需要使用SSH的方式进行连…

探索Python网络世界的利器:Requests-HTML库

文章目录 探索Python网络世界的利器&#xff1a;Requests-HTML库背景&#xff1a;为何选择Requests-HTML&#xff1f;什么是Requests-HTML&#xff1f;如何安装Requests-HTML&#xff1f;5个简单库函数的使用方法3个场景下库的使用示例常见Bug及解决方案总结 探索Python网络世界…

【多线程】多线程(8):单例模式:阻塞队列

【阻塞队列】 阻塞队列是在普通的“先进先出”队列的基础上&#xff0c;做出了扩充&#xff0c;可以组成「生产者消费者模型」 1.线程安全性 标准库是原有的队列Queue和其子类&#xff0c;默认都是“线程不安全的”&#xff0c;而阻塞队列是“线程安全的” 2.具有阻塞特性 …

基于STM32的智能风扇控制系统设计

引言 本项目将基于STM32微控制器设计一个智能风扇控制系统&#xff0c;通过温度传感器实时检测环境温度&#xff0c;并根据预设的温度范围自动调节风扇的转速。该系统展示了STM32的PWM输出、传感器接口以及自动控制应用的实现。 环境准备 1. 硬件设备 STM32F103C8T6 开发板…

Java | Leetcode Java题解之第457题环形数组是否存在循环

题目&#xff1a; 题解&#xff1a; class Solution {public boolean circularArrayLoop(int[] nums) {int n nums.length;for (int i 0; i < n; i) {if (nums[i] 0) {continue;}int slow i, fast next(nums, i);// 判断非零且方向相同while (nums[slow] * nums[fast]…

51单片机的宠物自动投喂系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温湿度传感器DS1302时钟模块蓝牙步进电机按键、蜂鸣器等模块构成。适用于猫猫/狗狗宠物自动喂食器等相似项目。 可实现基本功能: 1、LCD1602实时显示北京时间和温湿度 2、温湿度传感器DHT11采集环境温湿度 3、时…

MySQL 实验1:Windows 环境下 MySQL5.5 安装与配置

MySQL 实验1&#xff1a;Windows 环境下 MySQL5.5 安装与配置 目录 MySQL 实验1&#xff1a;Windows 环境下 MySQL5.5 安装与配置一、MySQL 软件的下载二、安装 MySQL三、配置 MySQL1、配置环境变量2、安装并启动 MySQL 服务3、设置 MySQL 字符集4、为 root 用户设置登录密码 一…

【Docker】配置文件

问题 学习Docker期间会涉及到docker的很多配置文件&#xff0c;可能会涉及到的会有&#xff1a; /usr/lib/systemd/system/docker.service 【docker用于被systemd管理的配置文件】 /etc/systemd/system/docker.service.d【覆盖配置文件的存放处】 /etc/systemd/system/mul…

828华为云征文|部署音乐流媒体服务器 mStream

828华为云征文&#xff5c;部署音乐流媒体服务器 mStream 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 mStream3.1 mStream 介绍3.2 mStream 部署3.3 mStream 使用 四、…

【MySQL】Ubuntu环境下MySQL的安装与卸载

目录 1.MYSQL的安装 2.MYSQL的卸载 1.MYSQL的安装 首先我们要看看我们环境里面有没有已经安装好的MySQL 我们发现是默认是没有的。 我们还可以通过下面这个命令来确认有没有mysql的安装包 首先我们得知道我们当前的系统版本是什么 lsb_release -a 我们在找apt源的时候&a…

20241004给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Android12时永不休眠的步骤

20241004给荣品RD-RK3588-AHD开发板刷Rockchip原厂的Android12时永不休眠的步骤 2024/10/4 19:22 1、 Z:\rk3588s4_3588a12\device\rockchip\common\device.mk ifeq ($(strip $(BOARD_HAVE_BLUETOOTH_RTK)), true) include hardware/realtek/rtkbt/rtkbt.mk endif ifeq ($(str…

【文件增量备份系统】MySQL百万量级数据量分页查询性能优化

&#x1f3af; 导读&#xff1a;本文针对大数据量下的分页查询性能问题进行了深入探讨与优化&#xff0c;最初查询耗时长达12秒&#xff0c;通过避免全表计数及利用缓存保存总数的方式显著提升了浅分页查询速度。面对深分页时依然存在的延迟&#xff0c;采用先查询倒数第N条记录…

【机器学习】探索GRU:深度学习中门控循环单元的魅力

目录 &#x1f354; GRU介绍 &#x1f354; GRU的内部结构图 2.1 GRU结构分析 2.2 GRU工作原理 2.4 Bi-GRU介绍 2.3 使用Pytorch构建GRU模型 2.5 GRU优缺点 &#x1f354; 小结 学习目标 &#x1f340; 了解GRU内部结构及计算公式. &#x1f340; 掌握Pytorch中GRU工具…

【开源免费】基于SpringBoot+Vue.JS洗衣店订单管理系统(JAVA毕业设计)

本文项目编号 T 068 &#xff0c;文末自助获取源码 \color{red}{T068&#xff0c;文末自助获取源码} T068&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 顾…