技术图文:Python 匿名函数 VS. C# Lambda表达式
背景
前段时间在知识星球上立了一个Flag,至少写10篇关于 Python,Matlab 和 C# 对比的总结。
这是第 2 篇,从定义和应用两个角度来对比 Python 的匿名函数 与 C# 的Lambda表达式。
匿名函数/Lambda表达式的定义
Python 匿名函数
在 Python 里有两类函数:
- 第一类:用
def
关键词定义的正规函数 - 第二类:用
lambda
关键词定义的匿名函数
python 使用 lambda
关键词来创建匿名函数,而非def
关键词,它没有函数名,其语法结构如下:
lambda argument_list: expression
lambda
- 定义匿名函数的关键词。argument_list
- 函数参数,它们可以是位置参数、默认参数、关键字参数,和正规函数里的参数类型一样。:
- 冒号,在函数参数和表达式中间要加个冒号。expression
- 只是一个表达式,输入函数参数,输出一些值。
注意:
expression
中没有 return 语句,因为 lambda 不需要它来返回,表达式本身结果就是返回值。- 匿名函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
【例】
def sqr(x):return x ** 2print(sqr)
# <function sqr at 0x000000BABD3A4400>y = [sqr(x) for x in range(10)]
print(y)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]lbd_sqr = lambda x: x ** 2
print(lbd_sqr)
# <function <lambda> at 0x000000BABB6AC1E0>y = [lbd_sqr(x) for x in range(10)]
print(y)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]sumary = lambda arg1, arg2: arg1 + arg2
print(sumary(10, 20)) # 30func = lambda *args: sum(args)
print(func(1, 2, 3, 4, 5)) # 15
C# Lambda表达式
Lambda 表达式是 匿名委托 更为简洁的一种写法,这个概念来自函数式编程,很多语言都加入了这个功能。通俗点讲,你需要写一个函数,但是懒得给它起名字,而且懒得写那么多封装和类,并且可能就这个地方调用,其它地方几乎不调用这段代码,那么我们就可以用这个来搞定。
Lambda 运算符:
“=>” 运算符将表达式分为两部分,左边指定输入参数,右边是 Lambda 的主体,表达式或语句块。
Lambda 表达式:
- 一个参数:param => expr;
- 多个参数:(param-list) => expr;
【例】
static void Print<T>(List<T> lst)
{foreach (T item in lst){Console.Write(item + " ");}Console.WriteLine(Environment.NewLine);
}static void Main(string[] args)
{Func<int, int> sqr = delegate (int x) { return x * x; };Func<int, int> lbd_sqr = x => x * x;List<int> y1 = new List<int>();List<int> y2 = new List<int>();for (int i = 0; i < 10; i++){y1.Add(sqr(i));y2.Add(lbd_sqr(i));}Print(y1);// 0 1 4 9 16 25 36 49 64 81Print(y2);// 0 1 4 9 16 25 36 49 64 81Func<int, int, int> sumary = (arg1, arg2) => arg1 + arg2;Console.WriteLine(sumary(10, 20)); //30Func<int[], int> sum = x => x.Sum();Console.WriteLine(sum(new int[] { 1, 2, 3, 4, 5 }));//15
}
匿名函数/Lambda表达式的应用
Python 匿名函数
匿名函数 常常应用于函数式编程的高阶函数 (high-order function)中。
如,在 filter
和map
函数中的应用:
filter(function, iterable)
过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用list()
来转换。
【例】
odd = lambda x: x % 2 == 1
templist = filter(odd, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print(list(templist)) # [1, 3, 5, 7, 9]
map(function, *iterables)
根据提供的函数对指定序列做映射。
【例】
m1 = map(lambda x: x ** 2, [1, 2, 3, 4, 5])
print(list(m1))
# [1, 4, 9, 16, 25]m2 = map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
print(list(m2))
# [3, 7, 11, 15, 19]
除了 Python 这些内置函数,我们也可以自己定义高阶函数。
【例】
def apply_to_list(fun, some_list):return fun(some_list)lst = [1, 2, 3, 4, 5]
print(apply_to_list(sum, lst))
# 15print(apply_to_list(len, lst))
# 5print(apply_to_list(lambda x: sum(x) / len(x), lst))
# 3.0
C# Lambda表达式
Lambda 表达式常常应用于 LINQ 的扩展函数中。
- Where 扩展:属于System.Linq,基于谓词筛选值序列,返回一个包含输入序列中满足条件的元素集合。
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
【例】
static void Print<T>(T[] nums)
{foreach (T item in nums){Console.Write(item + " ");}Console.WriteLine(Environment.NewLine);
}static void Main(string[] args)
{int[] nums = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };int[] result = nums.Where(x => x % 2 == 1).ToArray();Print(result);// 1 3 5 7 9
}
- Select 扩展:属于System.Linq,将序列中的每个元素投影到新表单。
public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector);
【例】
static void Print<T>(T[] nums)
{foreach (T item in nums){Console.Write(item + " ");}Console.WriteLine(Environment.NewLine);
}static void Main(string[] args)
{int[] nums = new int[] { 1, 2, 3, 4, 5 };int[] result = nums.Select(x => x * x).ToArray();Print(result);//1 4 9 16 25 int[][] nums1 = new int[5][] {new int[]{ 1,2 },new int[]{ 3,4 },new int[]{ 5,6 },new int[]{ 7,8 },new int[]{ 9,10 }};result = nums1.Select(x => x[0] + x[1]).ToArray();Print(result);// 3 7 11 15 19
}
【例】
static int Apply_To_List(Func<int[],int> func,int[] list)
{return func(list);
}
static double Apply_To_List(Func<int[], double> func, int[] list)
{return func(list);
}static void Main(string[] args)
{int[] nums = new int[] { 1, 2, 3, 4, 5 };int result = Apply_To_List(x => x.Sum(), nums);Console.WriteLine(result); // 15result = Apply_To_List(x => x.Length, nums);Console.WriteLine(result); // 5double result1 = Apply_To_List(x => 1.0 * x.Sum() / x.Length, nums);Console.WriteLine(result1); // 3
}
总结
函数式编程是当今比较流行的以简洁著称的一种编程方式。而 匿名函数/Lambda表达式 是这种编程方式的基础。
前段时间看到教务处通知老师们上报线上考试的方案,感觉这个学期可能不会开学了。今天看到通知6月8日毕业生可以申请返校,也就意味着让他们回去收拾东西办理离校手续准备毕业了。不管怎样,希望疫情尽快过去吧。
今天就到这里吧。See You!
当前活动
我是 终身学习者“老马”,一个长期践行“结伴式学习”理念的 中年大叔。
我崇尚分享,渴望成长,于2010年创立了“LSGO软件技术团队”,并加入了国内著名的开源组织“Datawhale”,也是“Dre@mtech”、“智能机器人研究中心”和“大数据与哲学社会科学实验室”的一员。
愿我们一起学习,一起进步,相互陪伴,共同成长。
后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:
相关文章:

php是否区分大小写
按常理来说,大多数语言都是区分大小写的,比如变量 ab 和 AB 是不同的,函数cd 和 CD 也是不同的,但是php有点特别。 首先,php中的变量和常量是区分大小写的。 <?php$a a; $A A; echo $a; echo $A;?>这里打印了…

如何创建和获取正则对象?
在JavaSript应用中,使用正则表达式之前,需要创建正则对象。创建正则表达式的方式有两种,一种是用字面量方式创建,另种是通过RegExp0构造函数的方式创建。这两种方式的语法格式如下。 //字面量方式 var变量名/表达式/; // RegExp构…

Numpy入门教程:01. 数组的创建与属性
背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执行各种数学任务,如:数值积分、微分、…

深入浅出WPF——x:Class详解
小序:按照惯例,我会在年末的最后一篇文章里感谢所有帮助过我的人们。今年也不例外,只是形式简单一些。祝所有帮助过我的朋友、同事、学生和兄弟姐妹们——2009年身体健康、平安快乐、财源滚滚。愿2009年的中国,平安祥和、远离各种…

SQL Date 函数
MySQL Date 函数 函数描述NOW()返回当前的日期和时间CURDATE()返回当前的日期CURTIME()返回当前的时间DATE()提取日期或日期/时间表达式的日期部分EXTRACT()返回日期/时间按的单独部分DATE_ADD()给日期添加指定的时间间隔DATE_SUB()从日期减去指定的时间间隔DATEDIFF()返回两个…

什么是java常量
相信很多在学java技术的同学,对java常量这个并不陌生,什么是java常量呢?java常量就是在程序中固定不变的值,是不能改变的数据。例如数字1、字符“a”、浮点数3.2等。在Java中,常量包括整型常量、浮点数常量、布尔常量、字符常量等…

Numpy入门教程:02. 索引、切片与迭代
背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执行各种数学任务,如:数值积分、微分、…

php中OR与|| AND与的区别
本身没有区别,习惯问题 ,但是有时候牵涉到运算符优先级的问题,结果会不同,记录下。例如:$p 6 or 0;var_dump($p);//int(6)$p 6 || 0;var_dump($p);//bool(true)$p 6 and 0;var_dump($p); //int(6) $p 6 &&…

beego数据输出
概览直接输出字符串模板数据输出 静态模板数据输出动态模板数据输出json格式数据输出xml格式数据输出jsonp调用概览 直接输出字符串 通过beego.Controller.Ctx.WriteString()方法可以直接向http response body中输出字符串 beego中的函数定义如下: // WriteString W…

缓存和web缓存分别是什么?
什么是缓存? 缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。 什么是web缓存…

【Python】12、字典的实现
一、字典的实现 dic 可以使用list来实现 i(索引) hash(key) % solt(槽位数) 此时i重复了怎么办(hash冲突)? 1、拉链法 每个槽位上拉一个List,就是拉链法 1234567891011121314151617181920212223242526272…

Numpy入门教程:03.数组操作
背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执行各种数学任务,如:数值积分、微分、…

13个JavaScript图表图形绘制插件
由于绘制矢量图的不同技术愈发成熟以及现代浏览器所具备的更强大的计算能力等原因,目前网上出现了越来越多免费 的JavaScript图表和图形绘制解决方案。在本文中就将分享13个优秀实用的JavaScript图表和图形绘制插件,它们少数是独立的框架,大多…

Java swing是什么?有什么作用?
在早期JDK1.0发布时,Sun公司就为GUI开发提供了一套基础类库,这套类库被称为AWT(Abstract Window Toolkit),即抽象窗口工具包。AWT的起初设想就是为了统一实现不同操作系统的图像界面,但问题是,不同操作系统图形库的功能…

python之网络爬虫
一、演绎自已的北爱 踏上北漂的航班,开始演奏了我自已的北京爱情故事 二、爬虫1 1、网络爬虫的思路 首先:指定一个url,然后打开这个url地址,读其中的内容。 其次:从读取的内容中过滤关键字;这一步是关键&a…

Numpy入门教程:04. 数学函数
背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执行各种数学任务,如:数值积分、微分、…

SAXParserFactory之求解
SAX是Simple API for XML的简称,在Android里面提供对XML文件的解析接口方法,如果给我们一个XML文件,要求把里面我们关心的数据解析出来,我们就可以使用SAX技术,在具体使用中,会对XML文件的每一个字符逐一读取并出发相应…

学习Java知识应该注意哪些基础原则
想要做java程序猿,学习起来没有那么快的,尤其是零基础学员,java技术在学习的过程中是比较枯燥的,下面小编就为大家详细的介绍一下学习Java知识应该注意哪些基础原则,方便大家在学习的时候能够更加有效率! 学习Java知识…

Numpy入门教程:05. 逻辑函数
背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执行各种数学任务,如:数值积分、微分、…

git获取指定release版本代码
首先手里必须有release的版本的备份出来的/.repo/manifests/default.xml文件,该文件记录了每个git库的在该版本下的具体的版本情况,整个代码的sync都是依据他来的; 1、repo sync 将本地代码更新至最新; 2、将手里的manifests.xml&…

【内网福音】如何离线部署Rancher
2019独角兽企业重金招聘Python工程师标准>>> 对于在公司内网环境中、无法访问互联网的用户而言,离线安装部署Rancher是解决问题的关键。本文是Rancher离线部署教程,专为内网用户排坑解难。 版本说明 OS:Centos7.3 Docker version:…

JAVA工资高吗
JAVA工资高吗?很多人都是非常关注这个问题的,近几年,java技术在互联网行业有了自己的一席之地,越来越多的人都投身到java技术行业,下面我们来看看详细的介绍。 JAVA工资高吗? 近年来,在美国、加拿大、澳大利亚、新加坡等发达国家…

Numpy入门教程:06. 排序,搜索和计数
背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执行各种数学任务,如:数值积分、微分、…

活动目录在构建核心过程中的八个关键点(下)
活动目录是一个面向Windows Server级别的目录服务。在之前的博客文章中介绍了活动目录设计中需要遵循的七个原则,今天在这里讲解有关《活动目录构建核心关键点》。 全文请见专题:http://os.51cto.com/art/201104/254054.htm 5. LDAP协议简介 LDAP的英文全…

smarty变量调节器--count_words[计算词数]
计算变量里的词数 。 Example 5-7. count_words <?php$smarty->assign(articleTitle, Dealers Will Hear Car Talk at Noon.);?>Where template is:{$articleTitle}{$articleTitle|count_words}This will output:Dealers Will Hear Car Talk at Noon.7 See also cou…

如何开发属于自己的第一个Java程序
学习java技术都是循序渐进的,搭建好了Java开发环境之后,下面就来学习一下如何开发Java程序。为了让初学者更好地完成第一个Java程序,接下来小编通过几个步骤进行逐一讲解。 1.编写Java源文件 在D盘根目录下新建一个test文件夹,并在…

Numpy入门教程:07. 随机抽样
背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执行各种数学任务,如:数值积分、微分、…

如何成为一个Android高手
很多Android开发者已经度过了初级、中级,如何成为一个Android高手呢? eoeAndroid就各个级别的程序员应该掌握哪些内容作为下面分类. 一、初级 1. 拥有娴熟的Java基础,理解设计模式,比如OOP语言的工厂模式要懂得. 2. 掌握Android U…

云终端处理器——Atom
由于上周展会的缘故,开始对云终端【I】处理器产生兴趣,接下来在“物理层”【II】来理解下X86-Atom,ARM,MIPS三种处理器,这是第一篇,主Atom Intel公司的官网简单介绍了一句 “英特尔 凌动【III】 处理器&am…

Java培训的学费标准是多少
很多想要进入到互联网行业的小伙伴都会选择java这门编程语言,java编程语言技术在互联网公司是起着非常重要的作用的,那么如今市面上的java培训机构有很多,选择报Java培训的学费标准是多少呢?来看看下面的详细介绍。 Java培训的学费…