朋友们,如需转载请标明出处:https://blog.csdn.net/jiangjunshow
声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是由我所写,所以不如我的AI技术教学风趣幽默,学起来比较枯燥;但它的知识点还是讲到位的了,也值得阅读!想要学习AI技术的同学可以点击跳转到我的教学网站。PS:看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!
函数式编程的意思就是对序列应用一些函数。例如,下面这个filter的调用实现了从一个序列中挑选出大于0的元素。
>>>list(range(-5,5)) # An iterator in 3.0
[-5,-4,-3,-2,-1,0,1,2,3,4]
>>>list(filter((lambda x: x > 0),range(-5,5))) # An iterator in 3.0
[1,2,3,4]
这个函数也能够用一个for循环来等效实现,但是它也是内置的函数,所以运行比for循环要快。
>>>res = []
>>> for x in range(-5,5):
... if x > 0:
... res.append(x)
...
>>>res
[1,2,3,4]
reduce在Python 2.6中只是一个简单的内置函数,但是在Python 3.0中则位于functools模块中,要更复杂一些。这里是两个reduce调用,计算了在一个列表中所有元素加起来的和以及乘起来的乘积。
>>>from functools import reduce # Import in 3.0,not in 2.6
>>>reduce((lambda x,y: x + y),[1,2,3,4])
10
>>>reduce((lambda x,y: x * y),[1,2,3,4])
24
下面是一个对第一个调用的for循环的等效实现。
>>>L = [1,2,3,4]
>>>res = L[0]
>>>for x in L[1:]:
... res = res + x
...
>>>res
10
编写自己的reduce版本实际上相当简单:
>>>def myreduce(function,sequence):
... tally = sequence[0]
... for next in sequence[1:]:
... tally = function(tally,next)
... return tally
...
>>>myreduce((lambda x,y: x + y),[1,2,3,4,5])
15
>>>myreduce((lambda x,y: x * y),[1,2,3,4,5])
120
内置的operator模块提供了一些函数,它们使用起来是很方便的(要了解关于这一模块的更多内容,请参阅Python的库手册)。
>>>import operator,functools
>>>functools.reduce(operator.add,[2,4,6]) # Function-based +
12
>>>functools.reduce((lambda x,y: x + y),[2,4,6])
12