python lambda函数
2015-12-15 11:56
537 查看
使用一个叫做“lambda”的构造器,Python支持在运行时创建匿名函数(也就是函数并没有绑定一个名字)。这和函数编程语言中的lambda还不是完全一样的,但是这是一个非常强大的概念很好地集成到了Python中,并且经常和典型的函数式概念比如filter(),map()还有reduce()一起结合起来使用。
以下代码片段显示了一个正常的函数定义("f")和一个lambda函数("g")的区别:
正如你所看到的,f()和g()所做的完全一样,而且可以可以用相同的方法去使用。注意lambda函数不包含一个“return”语句--它总是包含一个表达式,并且将它返回。你也注意到你可以将一个lambda定义到任何一个期望函数的地方,你根本不需要将它赋给一个变量。
以下的代码片段展示了lambda函数的使用。注意你应该使用Python 2.2或者更新的版本,为了支持嵌套的范畴(nested scope)。
以上代码定义了一个“make_incrementor”的函数,该函数在运行时创建了一个匿名函数并将它返回。返回的函数增加它的参数到它创建时指定的值上。
你现在可以创建多个不同的增量函数并将它们赋给一个变量,然后独立地使用它们。就像最后一个语句展示的那样,你甚至根本不需要在任何地方将整个函数赋值--你可以立即使用它,但你不再需要他的时候你可以忘了他。
以下的部分更进了一步。
首先我们定义了一个简单的整型值的列表,然后我们使用了标准函数filter(),map()和reduce()去做不同的事情。所有的三个函数都期待两个参数:一个函数和一个列表。
当然,我们可以在其它地方定义一个单独的函数,然后使用这个函数的名字作为filter()等函数的参数,实际上这确实是一个好主意如果我们想要使用这个函数好多次,或者这个函数写在一行会太复杂。但是,如果我们只是用它一次那就很简单了(也就是说它只包含了一个表达式,像上面的例子那样),更方便的是使用一个lambda构造去产生一个(临时的)匿名函数,并将它立即传到filter()里。这样创建了非常紧凑,并且可读的代码。
在第一个例子中,filter()调用我们的lambda函数作用于列表中的每一个元素,并且返回一个新的列表,该列表包含使这个函数返回“真”的元素。这个例子中,我们得到了所有为3的整数倍的元素。表达式x % 3 == 0 计算x被3除的余数并将它和0比较。
第二个例子中,map()用来转换我们的列表。指定的函数会调用原来的列表中的每一个元素,并创建一个新的元素包含我们的lambda函数的返回值。在这个例子中,它对每个元素计算2 * x + 10.
最后,reduce()函数有一些特殊。该函数的“worker function”必须接受两个参数(我们称之为x和y),并不是一个参数。这个函数调用列表中的前两个参数,然后调用返回值与第三个元素,等等,直到列表中的元素被遍历完全。这就意味着我们的函数被调用了n-1次,如果这个列表包含n个元素的话。最后一次调用的返回值就是reduce()构造的结果。从上面的例子中看出,它简单地叠加了参数,所以我们得到了所有参数的和。
原文链接:这里
你先爱可以创建多个不同的
以下代码片段显示了一个正常的函数定义("f")和一个lambda函数("g")的区别:
>>> def f (x): return x**2 ... >>> print f(8) 64 >>> >>> g = lambda x: x**2 >>> >>> print g(8) 64
正如你所看到的,f()和g()所做的完全一样,而且可以可以用相同的方法去使用。注意lambda函数不包含一个“return”语句--它总是包含一个表达式,并且将它返回。你也注意到你可以将一个lambda定义到任何一个期望函数的地方,你根本不需要将它赋给一个变量。
以下的代码片段展示了lambda函数的使用。注意你应该使用Python 2.2或者更新的版本,为了支持嵌套的范畴(nested scope)。
>>> def make_incrementor (n): return lambda x: x + n >>> >>> f = make_incrementor(2) >>> g = make_incrementor(6) >>> >>> print f(42), g(42) 44 48 >>> >>> print make_incrementor(22)(33) 55
以上代码定义了一个“make_incrementor”的函数,该函数在运行时创建了一个匿名函数并将它返回。返回的函数增加它的参数到它创建时指定的值上。
你现在可以创建多个不同的增量函数并将它们赋给一个变量,然后独立地使用它们。就像最后一个语句展示的那样,你甚至根本不需要在任何地方将整个函数赋值--你可以立即使用它,但你不再需要他的时候你可以忘了他。
以下的部分更进了一步。
>>> foo = [2, 18, 9, 22, 17, 24, 8, 12, 27] >>> >>> print filter(lambda x: x % 3 == 0, foo) [18, 9, 24, 12, 27] >>> >>> print map(lambda x: x * 2 + 10, foo) [14, 46, 28, 54, 44, 58, 26, 34, 64] >>> >>> print reduce(lambda x, y: x + y, foo) 139
首先我们定义了一个简单的整型值的列表,然后我们使用了标准函数filter(),map()和reduce()去做不同的事情。所有的三个函数都期待两个参数:一个函数和一个列表。
当然,我们可以在其它地方定义一个单独的函数,然后使用这个函数的名字作为filter()等函数的参数,实际上这确实是一个好主意如果我们想要使用这个函数好多次,或者这个函数写在一行会太复杂。但是,如果我们只是用它一次那就很简单了(也就是说它只包含了一个表达式,像上面的例子那样),更方便的是使用一个lambda构造去产生一个(临时的)匿名函数,并将它立即传到filter()里。这样创建了非常紧凑,并且可读的代码。
在第一个例子中,filter()调用我们的lambda函数作用于列表中的每一个元素,并且返回一个新的列表,该列表包含使这个函数返回“真”的元素。这个例子中,我们得到了所有为3的整数倍的元素。表达式x % 3 == 0 计算x被3除的余数并将它和0比较。
第二个例子中,map()用来转换我们的列表。指定的函数会调用原来的列表中的每一个元素,并创建一个新的元素包含我们的lambda函数的返回值。在这个例子中,它对每个元素计算2 * x + 10.
最后,reduce()函数有一些特殊。该函数的“worker function”必须接受两个参数(我们称之为x和y),并不是一个参数。这个函数调用列表中的前两个参数,然后调用返回值与第三个元素,等等,直到列表中的元素被遍历完全。这就意味着我们的函数被调用了n-1次,如果这个列表包含n个元素的话。最后一次调用的返回值就是reduce()构造的结果。从上面的例子中看出,它简单地叠加了参数,所以我们得到了所有参数的和。
原文链接:这里
你先爱可以创建多个不同的
相关文章推荐
- ipython notebook使用
- python 实现 loadrunner xml脚本格式化
- python:Unable to find vcvarsall.bat错误
- python 遍历文件夹子文件夹,批量生成txt
- Python继承与多继承
- [从头学python] 第06节 文件、日期和日志的摸索
- Python note
- python 错误提示
- 使用Python开发微信公众号
- 关于python all(itrable)的使用 和列表表达式使用以及复习一下短路效应。
- Python中Swithch Case语法实现
- 一篇文章告诉你,该学R还是Python
- python学习日记_第七天(ex16~17)
- Python的GIL是什么鬼,多线程性能究竟如何
- python 自学笔记20151214 定制类
- python基础-图形界面库
- 最好的Python机器学习库
- Python——debug
- Python模块
- python aerospike client 实现CAS更新操作