读书人

下令式至函式(五)

发布时间: 2012-11-08 08:48:11 作者: rapoo

命令式至函式(五)
的好了!要把一list中的料全部加1怎?
def addOne(list):
result = []
for ele in list:
result.append(ele + 1)
return result

改成函式呢?
def addOne(list):
return [] if list == [] else [list[0] + 1] + addOne(list[1:])

那要把一list中的料全部乘3呢?
def multiplyThree(list):
return [] if list == [] else [list[0] * 1] + multiplyThree(list[1:])

那要把一list中的料全部OOXX呢?乾脆通用的map:
def map(func, list):
return [] if list == [] else [func(list[0])] + map(func, list[1:])

那要把一list中的料全部加1就可以:
map(lambda ele: ele + 1, list)

把一list中的料全部乘3就可以:
map(lambda ele: ele * 3, list)

要把一list中的料OOXX就可以:
map(lambda ele: OOXX(ele), list)

似地,要list中大於3的元素出怎?
def greatThanThree(list):
result = []
for ele in list:
if ele > 3:
result.append(ele)
return result

改成函式呢?
def greatThanThree(list):
return [] if list == [] else \
([list[0]] + greatThanThree(list[1:]) if list[0] > 3 else greatThanThree(list[1:]))

如果想list中小於3的元素出呢?你出似的西,所以直接filter吧!
def filter(func, list):
return [] if list == [] else \
([list[0]] + filter(func, list[1:]) if func(list[0]) else filter(func, list[1:]))

那要list中小於3的元素出就是:
filter(lambda ele: ele > 3, list)

到可以看到,map、filter先前文章的fold,都是很常用的作,因程式常就是在一料作些作。不你有有, map、filter的fold很像?上map、filter都可以用fold。例如直接用Python的functool中 reduce(也就是foldLeft的)map:
def map(func, list):
return reduce(lambda lt, elem: lt + [func(elem)], list, [])

也可以用reducefilter:
def filter(func, list):
return reduce(lambda lt, elem: lt + [elem] if func(elem) else lt, list, [])

你要直接用reduce把一list中的料全部加1也可以,只不成reduce(lambda lt, elem: lt + [elem + 1], list, []),要直接用reducelist中小於3的元素出也可以,只不成reduce(lambda lt, elem: lt + [elem] if elem > 3 else lt, list, []),不如分map(lambda ele: ele + 1, list)filter(lambda ele: ele > 3, list)清楚,然要更清楚可以成addOne(list)、greaterThanThree(list),是可性的。使用通用 reduce、map、filter不要火就是,你意的,可以都用map、filter、reduce重到尾,但是略封一下可以 清晰的,不妨之。要加[1, 2, 3],你是用Python建的sumsum([1, 2, 3])好呢?是reduce(lambda s, e: s + e, [1, 2, 3], 0)好呢?是reduce(int.__add__, [1, 2, 3], 0)好呢?

Python中的functools除了有reduce之外,也有mapfilter,不回值自行作的不太一,Python的map filter不是直接回list,而分是mapfilter物件,,它作了 生器,如果要取得list,可以使用list函式。例如list(map(int.__add__, [1, 2, 3]))或list(filter(lambda ele: ele > 3, [1, 2, 3, 4, 5]))。

上有些言提供有list comprehension法,可用比的法作到map、filter。例如Python中要所有元素加1,可以[ele + 1 for ele in list],要大於3的元素出,可以[ele for ele in list if ele > 3],熟悉Python的常用法。

基本上map、filter作得到的,list comprehension都作得到,但list comprehension作得到的,map、filter可能嗦。例如一情是巢:
[(i, j) for i in [1, 2, 3] for j in [4, 5, 6]]

生[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)],如果用自行定的map,加上functools中的reduce,至少得成:
reduce(list.__add__, map(lambda i: map(lambda j: (i, j), [4, 5, 6]), [1, 2, 3]))

不list comprehension也不只是了一些而立的法,在某些言中,它的子更像表式,例如中1到100的正整中由2倍成 的列可表 {2 * x | x ∈ {1, 2..100}},若用Haskell的list comprehension,是[2 * x | x <- [1, 2..100]],跟原本的定真的是像的。

读书人网 >编程

热点推荐