今天给你们介绍几个比较特殊的函数,他们具备函数式编程的特色,有人将它们视为 Python 可进行 「函数式编程」 的见证,至于什么是函数式编程,不是本篇文章的重点,感兴趣的能够去了解一下。老读者可能都知道,我很是推崇 Python 的简洁优雅,而今天的这几个函数,有了它们,最大的好处就是可让程序更简洁,固然,没有它们程序也能够用其它方式实现。编程
lambda 是一个能够只用一行就能解决问题的函数,让咱们先看下面的例子:bash
>>> def add(x):
... x += 1
... return x
...
>>> numbers = range(5)
>>> list(numbers)
[0, 1, 2, 3, 4]
>>> new_numbers = []
>>> for i in numbers:
... new_numbers.append(add(i))
...
>>> new_numbers
[1, 2, 3, 4, 5]
复制代码
在上面的这个例子中,函数 add() 充当了一个中间角色,固然上面的例子也能够以下实现:app
>>> new_numbers = [i+1 for i in numbers]
>>> new_numbers
[1, 2, 3, 4, 5]
复制代码
首先我要说,上面的列表解析式实际上是很好用的,可是我恰恰要用 lambda 这个函数代替 add(x)
:函数式编程
>>> lamb = lambda x: x+1
>>> new_numbers = []
>>> for i in numbers:
... new_numbers.append(lamb(i))
...
>>> new_numbers
[1, 2, 3, 4, 5]
复制代码
在这里的 lamb 就至关于 add(x) ,lamb = lambda x : x+1
就至关于 add(x) 里的代码块。下面再写几个应用 lambda 的小例子:函数
>>> lamb = lambda x,y : x + y
>>> lamb(1,2)
3
>>> lamb1 = lambda x : x ** 2
>>> lamb1(5)
25
复制代码
由上面的例子咱们能够总结一下 lambda 函数的具体使用方法:lambda 后面直接跟变量,变脸后面是冒号,冒号后面是表达式,表达式的计算结果就是本函数的返回值。性能
在这里有一点须要提醒的是,虽然 lambda 函数能够接收任意多的参数而且返回单个表达式的值,可是 lambda 函数不能包含命令且包含的表达式不能超过一个。若是你须要更多复杂的东西,你应该去定义一个函数。优化
lambda 做为一个只有一行的函数,在你具体的编程实践中能够选择使用,虽然在性能上没什么提高,可是看着舒服呀。ui
咱们在上面讲 lambda 的时候用的例子,其实 map 也能够实现,请看下面的操做:spa
>>> numbers = [0,1,2,3,4]
>>> map(add,numbers)
[1, 2, 3, 4, 5]
>>> map(lambda x: x + 1,numbers)
[1, 2, 3, 4, 5]
复制代码
map 是 Python 的一个内置函数,它的基本格式是:map(func, seq)
。翻译
func 是一个函数对象,seq 是一个序列对象,在执行的时候,seq 中的每一个元素按照从左到右的顺序依次被取出来,塞到 func 函数里面,并将 func 的返回值依次存到一个列表里。
对于 map 要主要理解如下几个点就行了:
1.对可迭代的对象中的每个元素,依次使用 fun 的方法(其实本质上就是一个 for 循环)。
2.将全部的结果返回一个 map 对象,这个对象是个迭代器。
咱们接下来作一个简单的小题目:将两个列表中的对应项加起来,把结果返回在一个列表里,咱们用 map 来作,若是你作完了,请往下看:
>>> list1 = [1,2,3,4]
>>> list2 = [5,6,7,8]
>>> list(map(lambda x,y: x + y,list1,list2))
[6, 8, 10, 12]
复制代码
你看上面,是否是很简单?其实这个还看不出 map 的方便来,由于用 for 一样也不麻烦,要是你有这样的想法的话,那么请看下面:
>>> list1 = [1,2,3,4]
>>> list2 = [5,6,7,8]
>>> list3 = [9,10,11,12]
>>> list(map(lambda x,y,z : x + y + z,list1,list2,list3))
[15, 18, 21, 24]
复制代码
你看三个呢?是否是用 for 的话就稍显麻烦了?那么咱们在想若是是 四个,五个乃至更多呢?这就显示出 map 的简洁优雅了,而且 map 还不和 lambda 同样对性能没有什么提升,map 在性能上的优点也是杠杠的。
filter 翻译过来的意思是 “过滤器”,在 Python 中,它也确实是起到的是过滤器的做用。这个解释起来略微麻烦,仍是直接上代码的好,在代码中体会用法是我在全部的文章里一直在体现的:
>>> numbers = range(-4,4)
>>> list(filter(lambda x: x > 0,numbers))
[1, 2, 3]
复制代码
上面的例子其实和下面的代码是等价的:
>>> [x for x in numbers if x > 0]
[1, 2, 3]
复制代码
而后咱们再来写一个例子体会一下:
>>> list(filter(lambda x: x != 'o','Rocky0429'))
['R', 'c', 'k', 'y', '0', '4', '2', '9']
复制代码
我在以前的文章中不少次都说过,个人代码都是用 Python3 版本的。在 Python3 中,reduce 函数被放到 functools 模块里,在 Python2 中仍是在全局命名空间。
一样我先用一个例子来跑一下,咱们来看看怎么用:
>>> reduce(lambda x,y: x+y,[1,2,3,4])
10
复制代码
reduce 函数的第一个参数是一个函数,第二个参数是序列类型的对象,将函数按照从左到右的顺序做用在序列上。若是你还不理解的话,咱们下面能够对比一下它和 map 的区别:
>>> list1 = [1,2,3,4]
>>> list2 = [5,6,7,8]
>>> list(map(lambda x,y: x + y,list1,list2))
[6, 8, 10, 12]
复制代码
对比上面的两个例子,就知道二者的区别,map 至关因而上下运算的,而 reduce 是从左到右逐个元素进行运算。
至此,我在上面介绍了四个函数,这些函数不只使得代码更加的简单,并且在 Python3 中也优化了它们的性能。因此若是你喜欢的话,尽能够放心大胆的使用。
更多内容,欢迎关注公众号「Python空间」,期待和你的交流。