【速学速记】lambda表达式的两种应用场景「面试用到」

  • lambda表达式
  • python书写简单,功能强大, 迅速发展成为 AI ,机器学习,深度学习的主要语言。

    今天花三分钟,介绍Python中的lambda表达式,注意到,它只是一个表达式,不是语句啊。

    lambda的语法规则: 一个或多个参数以冒号终止输入参数,这些参数可以理解为有名函数原型的输入参数,以后是一个表达式,相当于有名函数的函数体部分。lambda的函数体部分,是作为返回值输出部分。

    1. 两种应用功能场景

    (1)map 和 reduce

    Python 中的 map 和 reduce,使用书写很方便,详细可参考: 【每天3分钟学Python】Python中的 Map 和 Reduce 再结合 lambda表达式的话,使用起来会更加高效,如下所示:

    def sum(mylist):
    return reduce(lambda x, y: 2x + 1y, mylist)
    可以看到两个输入参数 x, y , 返回为 2*x + y ,通过这样对 mylist 的元素完成化简操作。

    (2) lambda 和 list 结合使用

    这个场景在面试中经常被问到,如下所示:

    li = [lambda :x for x in range(10)]
    得到一个 lambda 的list,看一看 li :

    [<function main.<listcomp>.<lambda>>,
    <function main.<listcomp>.<lambda>>,
    <function main.<listcomp>.<lambda>>,
    <function main.<listcomp>.<lambda>>,
    <function main.<listcomp>.<lambda>>,
    <function main.<listcomp>.<lambda>>,
    <function main.<listcomp>.<lambda>>,
    <function main.<listcomp>.<lambda>>,
    <function main.<listcomp>.<lambda>>,
    <function main.<listcomp>.<lambda>>]
    打印 li[0]() 会得到什么,注意这种调用方法,因为是数组,先拿第一个元素,li[0],后面的括号表示调用lambda表达式。打印的结果为 0 吗? NO!是 9

    lambda表达式不会形成对函数体内变量的记忆,只记录最后一个状态。 那么如果lambda的入参中带有x, 会得到我们想要的结果0 吗?

    li = [lambda x :x for x in range(10)]
    res = li0
    print(res)
    输出:0
    因此,需要注意区分这两种写法的不同,记得这个区别,在一次新浪面试中,曾经被问到。希望对大家有用。

    原文地址:https://blog.51cto.com/14186420/2363654

    时间: 2024-10-23 17:02:05

    【速学速记】lambda表达式的两种应用场景「面试用到」的相关文章

    python lambda表达式的两种用处

    1 用处1定义匿名函数 不带参数的: a = lambda : print("123") 带参数的 b = lambda x, y:x * y 2 当函数作为参数时,直接为该函数传参. def func1(m, n): return str(m + n) def func2(func): print("结果:" + func()) # 调用func2这种函数时,一般情况下,无法直接为作为参数的函数传参, # func2(func1(4,5)) #这样是不行的 #但是

    【速学速记】Python 高阶函数

    前言: python 迅速发展壮大起来,多亏了人工智能,AI ,机器学习,深度学习的发展.所以小的给各位看官们准备了收藏已久的视频教程分享给大家!希望能带给大伙儿一些学习上的帮助 觉得好的话可以多多关注哟~ 每天持续分享更多优质内容! · 正 · 文 · 来 · 啦 · 今天花三分钟时间学习python的核武器:高阶函数 函数名也是变量! abs(-100) 对于abs()这个函数,完全可以把函数名abs看成变量,它指向一个计算绝对值的函数! 因此,函数名其实就是指向函数的变量,也就是说,变量可

    C#中的Lambda表达式和表达式树

    在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在不牺牲可读性的前提下,进一步简化了委托. LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态.这些操作表示了各种关于数据的逻辑,例如数据筛选,数据排序等等.通常这些操作都是用委托来表示.Lambda表达式是对LINQ数据操作的一种符合语言习惯的表示方式. Lambda表达式不仅可以用来创

    Lambda表达式和表达式树

    在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在不牺牲可读性的前提下,进一步简化了委托. LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态.这些操作表示了各种关于数据的逻辑,例如数据筛选,数据排序等等.通常这些操作都是用委托来表示.Lambda表达式是对LINQ数据操作的一种符合语言习惯的表示方式. Lambda表达式不仅可以用来创

    .NET中那些所谓的新语法之三:系统预定义委托与Lambda表达式

    开篇:在上一篇中,我们了解了匿名类.匿名方法与扩展方法等所谓的新语法,这一篇我们继续征程,看看系统预定义委托(Action/Func/Predicate)和超爱的Lambda表达式.为了方便码农们,.Net基类库针对实际开发中最常用的情形提供了几个预定义好的委托,这些委托可以直接使用,无需再重头定义一个自己的委托类型.预定义委托在.Net基类库中使用的比较广泛,比如在Lambda表达式和并行计算中都大量地使用,需要我们予以关注起来! /* 新语法索引 */ 1.自动属性 Auto-Impleme

    Lambda表达式遍历集合

    1.Collection Java 8 为Iterable接口新增了一个forEach(Consumer action)默认方法,该方法所需参数的类型是一个函数式接口,而Iterable接口是Collection接口的父接口,因此Collection集合也可以直接调用该方法. 当程序调用Iterable的forEach(Consumer action)遍历集合元素时,程序会依次将集合元素传给Consumer的accept(T t)方法(该接口中唯一的抽象方法).正因为Consumer是函数式接口

    JDK8的新特性——Lambda表达式

    JDK8已经发布快4年的时间了,现在来谈它的新特性显得略微的有点“不合时宜”.尽管JDK8已不再“新”,但它的重要特性之一——Lambda表达式依然是不被大部分开发者所熟练运用,甚至不被开发者所熟知. 国内的开发环境大家都知道,有各种的老项目,有各种各样的发布风险,让公司以及项目组对新的技术往往望而却步,有公司甚至时至今日还在使用JDK6来进行项目开发,这导致了在很多技术的选择上受到了很大限制,进而不能跟随时代的脚步使得项目甚至公司一步一步走向衰落. 本文简单认识JDK8的重要新特性之一——La

    Lambda表达式-使用说明

    jdk8已经发布4年,其中有一个特性:Lambda,它是一个令开发者便捷开发的一种方式,Lambda Expression (Lambda表达式)是为了让java提供一种面向函数编程,原本在jdk8之前只支持面向对象编程, 而函数式编程则是对行为的抽象(将行为作为一个参数进行传递),接下来通过例子来说明: 这是一个线程对象,传入匿名内部类的例子: new Thread(new Runnable() { @Override public void run() { System.out.printl

    lambda表达式语法与函数式编程接口

    java8中lambda表达式的两种语法 1.(parameters) ->expression   单表达式 2.(parameters) ->{statements;}  语句 语法解释 (parameters),lambda表达式的参数列表,其定义方法为JAVA普通的方法相同,例如(Object a, Object b). -> 箭头,是参数列表与lambda表达式主题部分的分隔符号. ------------------------------------------------