【Python】高阶函数

高阶函数

高阶函数是接受另一个函数作为参数,并返回一个函数作为结果的函数。

这种类型的函数是函数式编程的核心,因为它们允许对行为进行抽象和复用,使得代码更加简洁和灵活。

def apply_function(func, value):return func(value)def square(x):return x * xprint(apply_function(square, 5))  # 输出 25
  • 使用高阶函数实现简易四则运算计算器

    class calculator:def apply(self, func, *value):return func(*value)def add(self, *value):num = 0value_len = len(value)for i in range(value_len):num = num + value[i]return numdef sub(self, *value):value_len = len(value)num = value[0] if (value_len > 0) else 0for i in range(1, value_len):num = num - value[i]return numdef product(self, *value):value_len = len(value)num = 1 if (value_len > 0) else 0for i in range(value_len):num = num * value[i]return numdef division(self, *value):value_len = len(value)num = value[0] if (value_len > 0) else 0for i in range(1, value_len):num = num / value[i]return numcal = calculator()num_add = cal.apply(cal.add, 1,2,3,4,5)
    num_sub = cal.apply(cal.sub, 10,1,1,1,1)
    num_pro = cal.apply(cal.product, 10,1,1,1,1)
    num_div = cal.apply(cal.division, 10,1,1,1,1)
    

常用的高阶函数工具:

  1. lambda

    • 功能:创建匿名函数,并返回一个函数对象。

    • 语法lambda arguments: expression

    • 参数

      • arguments:函数的参数,可以是任意数量的参数。
      • expression:函数体,只能是一个表达式,该表达式的结果就是这个匿名函数的返回值。
    • 返回值:返回一个函数对象。

    • 示例

      # 定义一个简单的 lambda 表达式作为函数
      add = lambda x, y: x + y
      # 使用定义的 lambda 函数计算两数之和并打印
      print(add(3, 5))  # 输出: 8
      
  2. filter()

    • 功能:应用函数过滤序列,过滤掉不符合条件的元素。

    • 语法filter(function, iterable)

    • 参数

      • function:用来测试元素是否符合条件的函数。
      • iterable:包含需要过滤的元素的可迭代对象。
    • 返回值:返回一个迭代器,迭代器中的元素是符合条件的元素。

    • 示例

      nums = [1, 2, 3, 4, 5, 6]
      even_nums = filter(lambda x: x % 2 == 0, nums)
      print(list(even_nums))  # 输出 [2, 4, 6]
      
  3. map():

    • 功能:用于对序列中的每个元素应用一个给定的函数,并返回一个包含结果的迭代器。

    • 语法map(function, iterable, ...)

    • 参数

      • function:接受一个输入并返回一个值的函数。
      • iterable:一个或多个序列。如果提供了多个序列,则函数应该接受相同数量的参数,每个序列中的元素按顺序配对。
    • 返回值:返回一个迭代器,其元素是将输入的序列中的元素传递到函数后得到的结果。

    • 示例

      nums = [1, 2, 3, 4, 5]
      squared_nums = map(lambda x: x ** 2, nums)
      print(list(squared_nums))  # 输出 [1, 4, 9, 16, 25]
      
  4. reduce():

    • 功能:用于将一个接受两个参数的函数依次地应用到序列的元素上,从而将序列减少为单一的值。

    • 语法reduce(function, iterable[, initializer])

    • 参数

      • function:接受两个参数并返回单个值的函数。
      • iterable:可迭代序列,其元素将被从左到右依次处理。
      • initializer:(可选) 初始值,如果提供,它被放在参与处理的序列的最前面,并在空序列上作为默认值。
    • 返回值:返回单一的值,是通过将函数应用于序列的元素累积得到的。

    • 示例

      from functools import reducenums = [1, 2, 3, 4, 5]
      result = reduce(lambda x, y: x + y, nums)
      print(result)  # 输出 15result = reduce(lambda x, y: x + y, nums, 2)
      print(result)  # 输出 17
      

递归函数

函数可以返回自身来解决问题(函数本身调用自己),这称为递归函数。

# 计算斐波那契数
def factorial(x):if x == 1:return 1else:return x * factorial(x - 1)if __name__ == '__main__':x = factorial(10)print(f"The factorial number is {x}")# The factorial number is 3628800

装饰器

装饰器是一种设计模式,用于修改一个函数、方法或类的行为,而无需直接修改其本身的代码。装饰器在Python中通过高阶函数实现,它接收一个函数作为参数并返回一个新的函数。

def my_decorator(func):def wrapper():print("Something is happening before the function is called.")func()print("Something is happening after the function is called.")return wrapper# 方法一:不使用语法糖 @
def say_hello():print("Hello!")hello = my_decorator(say_hello)
hello()# 方法二:使用语法糖 @
@my_decorator
def say_hello():print("Hello!")say_hello()

闭包

闭包是一个记录了某些函数变量的包裹体,使这些变量即使在函数执行完成后也仍然可访问。闭包常用于封装私有数据。

def outer_function(msg):message = msgdef inner_function():print(message)return inner_functionmy_func = outer_function('Hello')
my_func()

类型提示

从Python 3.5开始,可以在函数中添加类型提示,提高代码的可读性和可维护性。

# 参数:字符串类型   返回值:字符串类型
def greet(name: str) -> str:return f"Hello {name}"print(greet("Alice")) # Hello Alice

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

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

相关文章

MySQL 存储函数及调用

1.mysql 存储函数及调用 在MySQL中,存储函数(Stored Function)是一种在数据库中定义的特殊类型的函数,它可以从一个或多个参数返回一个值。存储函数在数据库层面上封装了复杂的SQL逻辑,使得在应用程序中调用时更加简单…

tcp协议中机制的总结

目录 总结 分析 三次握手 总结 分析 其中,序列号不止用来排序,还可以用在重传时去重 确认应答是机制中的核心 因为都需要依靠应答来拿到协议字段,从而判断是否触发机制 保证可靠性的策略也可以提高效率,比如: 流量控制,可以根据多个因素来动态调整数据发送量拥塞控制也是,让…

揭开FFT时域加窗的奥秘

FFT – Spectral Leakage 假设用于ADC输出数据分析的采样点数为N,而采样率为Fs,那我们就知道,这种情况下的FFT频谱分辨率为δf,那么δfFs/N。如果此时我们给ADC输入一个待测量的单频Fin,如果此时Fin除以δf不是整数&a…

Follow Carl To Grow|【LeetCode】235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树中的节点

【LeetCode】235. 二叉搜索树的最近公共祖先 题意:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q…

翻译《The Old New Thing》- Why do messages posted by PostThreadMessage disappear?

Why do messages posted by PostThreadMessage disappear? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20090930-00/?p16553 Raymond Chen 2008年09月30日 为什么 PostThreadMessage 发布的信息会消失? 在显示用户界面的线…

mybatis-plus 多租户方案1使用和坑注意事项,方案是需要实现租户功能的表都增加租户id字段

1 前提springboot整合好 mybatis-plus (版本3.5.4) 需要实现多租户的表,添加修改对应字段和 pojo类 (表添加tenant_id字段,pojo添加tenantId属性) 2 配置文件更改,方便扩展 #多租户配置 tenant:enable: truecolumn: tenant_idignoreTable…

【Java】网制焦,实也难,0基础,学反射

【Java】网制焦,实也难,0基础,学反射 文章目录 【Java】网制焦,实也难,0基础,学反射反射的概述 获取Class对象的三种方式通过对象的getClass()方法通过类的静态属性class通过Class.forName()方法 通过反射获…

代码随想录算法训练营第三十三天|LeetCode1005 k次取反后最大化的数组和、LeetCode134 加油站

题1: 指路:1005. K 次取反后最大化的数组和 - 力扣(LeetCode) 思路与代码: 题意清晰,需要注意的是需要把k次机会用完。数组中的数分为三种情况:正数,负数,0。要求数组…

《平凡的世界》读后感:走进平凡的世界

《平凡的世界》是一部充满人性光辉的小说,通过描写普通人的生活,展现了人生的苦乐交织。这篇读后感旨在通过秀、少平、金秀、兰香、秀莲、少安、孙玉厚、孙玉亭、顾养民、润生、润叶、向前、登云、晓霞、田福堂、田福军、张有智、苗凯、王满银、兰花等人…

算法 | 子集数排列树满m叉树二分搜索归并排序快速排序

子集树:O(2^n) 一个序列的所有子集为2^n,即可看成具有2^n个叶节点的满二叉树 int backtrack(int k) //k表示扩展结点在解空间树中所处的层次 {if(k>n) //n标识问题的规模output(x); //x是存放当前解的一维数组if(constraint(k)…

01—Linux网络设置

1.1查看及测试网络 1.1.1 查看网络配置 1.查看网络接口地址 主机的网络接口卡通常称为网络接口。在LInux操作系统中,使用ifconfig命令可以查看网络接口的地址配置信息。 (1)查看活动的网络接口设备 若采用mini版CenOS7安装的系统&#x…

新技术前沿-2023-大模型学习根据个人数据集微调一个Transformer模型

参考如何根据自己的数据集微调一个 Transformer 模型 我们将通过NLP中最常见的文本分类任务来学习如何在自己的数据集上利用迁移学习(transfer learning)微调一个预训练的Transformer模型——DistilBERT。DistilBERT是BERT的一个衍生版本,它的优点在它的性能与BERT相…

Vue14-监视属性

一、天气案例 1-1、方式一:{{三目运算符}} 1-2、方式二:计算属性 1-3、方式三:click中写简单逻辑 click里面可以写简单的逻辑语句。不用this 解决方式: 小结: 绑定事件的时候,xxx"yyy" xxx&…

C语言学习系列:GCC编译器Windows版本MinGW-w64的安装教程

本文图文分享如何安装C语言编译器——MinGW-w64。 只要看到这篇文章,就可以按照文中步骤正确安装MinGW-w64并使用。 一、什么是 MinGW-w64 ? 我们知道C语言是高级语言,必须编译为二进制文件,才能为计算机运行,MinGW…

Web前端Canvas教程:绘制图形、动画与交互的奇妙世界

Web前端Canvas教程:绘制图形、动画与交互的奇妙世界 在Web前端技术中,Canvas无疑是一个强大的工具,它允许开发者在网页上绘制复杂的图形、创建生动的动画,并实现丰富的交互效果。本文将带领你走进Canvas的奇妙世界,从…

理解我的积木编程思想

1 学习教程,至少7139手册2 编程实践,遇到实际问题后,在技术资料中查找关键词3 选择适合的条目找到代 码。修正,组合。

[发布]嵌入式系统远程测控软件-基于Qt

目录 一. 引言二. 软件功能2.1 原理2.2 软件功能2.3 运行环境 三. 软件操作使用3.1 软件界面3.2 软件功能使用详解3.2.1 连接3.2.2 数据监测3.2.3 数据修改3.2.4 数据保存 3.3 软件的硬件连接 四. 通信协议——STM32移植篇4.1 通信协议4.2 STM32如何传输浮点数4.3 简单移植&…

shell编程(三)—— 控制语句

程序的运行除了顺序运行外,还可以通过控制语句来改变执行顺序。本文介绍bash的控制语句用法。 一、条件语句 Bash 中的条件语句让我们可以决定一个操作是否被执行。结果取决于一个包在[[ ]]里的表达式。 bash中的检测命令由[[]]包起来,用于检测一个条…

第一次视频学习

1、了解AI答题应用 1.1 业务流程架构图 1.2 自定义上传题目流程 1.3 时序图 这个比较困难,第一次了解到流式,便于前端与用户交互

千益畅行,引领旅游新潮流,共享经济下的创新旅游模式

在当前旅游行业中,千益畅行作为一种新型的旅游模式,正逐渐受到市场的关注和认可。它不仅为旅行社带来了新的客流,还巧妙地规避了高额的广告费用,实现了资源配置的优化和营销成本的大幅节约。 面对旅游经济的下滑,许多…