对函数 reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)), funcs) 的理解

2024-04-20 20:18

本文主要是介绍对函数 reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)), funcs) 的理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

标题 对函数 reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)), funcs) 的理解

参考文献:https://ask.csdn.net/questions/698225

一、先看一下reduce():
参考文献:https://www.cnblogs.com/863652104kai/p/11826421.html
通俗解释:reduce(function, sequence): function是一个函数,sequence是一个数据集合(元组、列表等)。先将集合里的第1,2个参数参入函数执行,再将执行结果和第3个参数传入函数执行…,最终得到最后一个结果
比如:reduce(lambda x, y: x + y,[1,2,3,4])执行步骤:
先将1,2传入:1+2 = 3
再将3,3传入:3+3 = 6
再将6,4传入:6+4 = 10
最终结果为:10

二、首先研究简化一点的:

def add(x):x = x + 1return xdef mut(x):x = 2 ** xreturn xprint(reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)),[add,mut,add,mut])(1))

32 #运行,输出结果为32

算法原理分析:
1、lambda f, g: lambda *a, **kw: g(f(*a, **kw))
此函数等价于:

def func1(f,g):def func2(*a,**kw):return g(f(*a,**kw))return func2

分析一下func1(),输入参数是f,g,(f,g的意义是对函数f、g的引用,不是调用,调用是f()、g()),返回的是函数func2的引用,func2的输入参数是(*a, **kw),因此可以对func1(f,g)进行调用,即func1(f,g)(*a, **kw)

2、reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)),[add,mut,add,mut])
此函数式编程采用了reduce(),等价于:
func1(func1(func1(add,mut),add),mut) (再进一步分析,等价于: mut(add(mut(add))) 。) ,这是一个复合函数。
func1(func1(func1(add,mut),add),mut)的输出结果是函数func2的引用,因此可以对其进行调用,看下面第3步。

3、reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)),[add,mut,add,mut])(1)
该式是对reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)),[add,mut,add,mut])的调用,等价于func1(func1(func1(add,mut),add),mut) (1),即mut(add(mut(add(1)))

回到reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)), funcs),funcs是一个函数列表,整个式子实现的是复合函数的功能。
在yolov3的代码中(keras-yolo3-master\yolo3\utils.py),有相关的应用。

def compose(*funcs):"""Compose arbitrarily many functions, evaluated left to right.Reference: https://mathieularose.com/function-composition-in-python/"""# return lambda x: reduce(lambda v, f: f(v), funcs, x)if funcs:return reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)), funcs)else:raise ValueError('Composition of empty sequence not supported.')

这篇关于对函数 reduce(lambda f, g: lambda *a, **kw: g(f(*a, **kw)), funcs) 的理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/921225

相关文章

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

MySQL 中 ROW_NUMBER() 函数最佳实践

《MySQL中ROW_NUMBER()函数最佳实践》MySQL中ROW_NUMBER()函数,作为窗口函数为每行分配唯一连续序号,区别于RANK()和DENSE_RANK(),特别适合分页、去重... 目录mysql 中 ROW_NUMBER() 函数详解一、基础语法二、核心特点三、典型应用场景1. 数据分

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Python get()函数用法案例详解

《Pythonget()函数用法案例详解》在Python中,get()是字典(dict)类型的内置方法,用于安全地获取字典中指定键对应的值,它的核心作用是避免因访问不存在的键而引发KeyError错... 目录简介基本语法一、用法二、案例:安全访问未知键三、案例:配置参数默认值简介python是一种高级编

python 常见数学公式函数使用详解(最新推荐)

《python常见数学公式函数使用详解(最新推荐)》文章介绍了Python的数学计算工具,涵盖内置函数、math/cmath标准库及numpy/scipy/sympy第三方库,支持从基础算术到复杂数... 目录python 数学公式与函数大全1. 基本数学运算1.1 算术运算1.2 分数与小数2. 数学函数

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

Java Lambda表达式的使用详解

《JavaLambda表达式的使用详解》:本文主要介绍JavaLambda表达式的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言二、Lambda表达式概述1. 什么是Lambda表达式?三、Lambda表达式的语法规则1. 无参数的Lambda表