zoukankan      html  css  js  c++  java
  • python lambda函数

    首先说一下什么是lambda函数。 lambda函数是python中的一种定义函数的方法(当然在很多其它语言中,比如lisp也有)。通过lambda定义的函数,没有函数名。比如下面的代码:

    >>> lambda x: x*x
    <function <lambda> at 0x2ae456263938>
    

    这段lambda代码只是返回了一个函数对象的指针(姑且这么理解吧)。 lambda 后面跟的是该函数的参数列表,这里是一个 x. 而 " : " 后面跟的是函数体。 这一段代码的意识是创建一个函数,该函数接受一个参数并返回其平方。  这段代码创建了一个函数对象后,这个函数对象没有被任何人引用,所以在这段代码结束后,这个对象的引用就为0了,这个函数就消失了。如果你像下面这样

    >>> a= lambda x:  x*x
    

    你就对这个函数对象做了一次引用,并把引用保存到了a中。这时a就是这个函数的一个别名了。你可以像普通函数一样用它。比如:

    >>> a(22)
    484
    

    OK.相信你已经很清楚lambda 的语法以及其作用了。但是你一定还觉得很迷惑,因为你不知道它存在的意义。 我们已经非常熟悉函数的意义了,那就是把一段逻辑抽象化,这样在变成的时候就不用把那些常用的逻辑复制的到处都是了。可是没有名字的函数有什么意义呢?

    其实很有意义。 函数的意义在于抽象化,不用大量的复制代码,但是有一个潜在的问题是,理解抽象的东西需要一定的精力。 比如你在阅读代码的时候看到一个函数不是很熟悉,那么你通常就要去看一下这个函数的定义以及作用。如果这个函数是大量使用的,那没办法,只能这么做了,付出一点精力去了解这个函数总比让这个函数的代码被解开复制的到处都是要好。 但是如果这个函数你压根儿只用一次呢? 如果这个函数的定义非常简单呢? 那么这时候我想你更倾向于直接看函数的定义而不是看到函数名字之后再去查看函数的代码。 请看下面的例子:

    >>> map( lambda x: x*x, [y for y in range(10)] )
    

    这段代码一目了然非常清晰。 这是因为你用了lambda的原因。如果你不用lambda,这段代码应该这么写:

    >>> def sq(x):
    ...     return x * x
    ...
    >>> map(sq, [y for y in range(10)])
    

    ok, 当你看到map这里调用的时候,你一定需要去查一下sq到底是个什么函数。如果sq是一个大量使用的函数也好,也许你已经记住了,可如果sq只在这里用一次,那么这种写法就显得不简洁了,而且sq的定义就可以说是一个多余的垃圾了。

    再看一个更极端一点的:

    >>> map(sq,a)
    

    如果你看到上面这一段代码,你明白它是什么意思吗? 肯定不能明白,你只能知道sq应该是个函数 a应该是个sequence。 这时你需要去查看sq的定义和a的定义,然后发现是这样的

    >>> def sq(x):
    ...     return x*x
    ...
    >>> a=[1,2,3]
    >>>
    >>>
    >>> map(sq,a)
    [1, 4, 9]

    oh 这太麻烦了。如果用lambda的话,map(sq,a)就可以写成下面这样

    >>> map(lambda x:x*x, [1,2,3])
    

    是不是一目了然。

    总而言之,函数的目的是为了抽象,那么lambda的用处,就可以简单的理解为具化。如果没有lambda那么抽象可能就会被滥用,lambda就是帮助解决这种问题的。

  • 相关阅读:
    基于Android的学生电子假条管理平台(笔记18)
    基于Android的学生电子假条管理平台(笔记17)
    请假制度管理与责任规避(笔记16)
    高校学生考勤管理系统功能设计(笔记15)
    浅析普通高校考勤请假制度的困境及其解决方法(笔记14)
    浅析普通高校考勤请假制度的困境及其解决方法(笔记13)
    高职大学生非正常请假现象透视(笔记12)
    学校应该完善与落实学生考勤制度——两张与众不同的请假条的故事(笔记11)
    《基于ASP.NET技术的小区物业管理系统设计与实现》论文笔记(二十)
    《基于JSP小区物业信息管理系统的设计与实现》论文笔记(十九)
  • 原文地址:https://www.cnblogs.com/kramer/p/3642963.html
Copyright © 2011-2022 走看看