Pythoner集中营

【Python入门】7.高阶函数之 map( )、reduce(

2018-08-08  本文已影响25人  三贝_

*写在前面:为了更好的学习python,博主记录下自己的学习路程。本学习笔记基于廖雪峰的Python教程,如有侵权,请告知删除。欢迎与博主一起学习Pythonヽ( ̄▽ ̄)ノ *


目录

高阶函数
map( )函数
reduce( )函数
•【练习】字符串转为整数的函数实现
filter( )函数
•【应用】产生素数的函数实现
sorted( )函数
补充笔记

高阶函数

Higher-order function,即高阶函数。
事实上,变量是可以指向函数的。

>>>abs(-2)
2
>>>f = abs                        #f变量指向函数abs()
>>>f(-2)
2

而函数名也是变量。

>>>abs = 1
>>>abs(-1)                        #TypeError: 'int' object is not callable,此时abs不再是函数,而是整数1

注:由于abs函数实际上是定义在import builtins模块中的,所以要让修改abs变量的指向在其它模块也生效,要用import builtins; builtins.abs = 10。

既然变量可以指向函数,那么函数也可以传入函数和返回函数,这种函数就叫高阶函数。

map( )函数

map( )是一种高阶函数,它接收两个参数,第一个是函数,第二个是Iterable,即可迭代对象。map( )将函数依次作用于Iterable的每个元素,并将结果以Iterator,迭代器的形式返回。这种方式类似构造出了数学中的映射过程。由于Iterator是惰性序列,可以用list( ) 将其转化为list输出。

>>>list(map(str,[1,2,3,4,5,6]))                  #str()可以将整数转化为字符串
['1', '2', '3', '4', '5', '6'] 

我们还能用列表生成器得到同样的结果,但要用到for语句:

>>>b = [str(x) for x in [1,2,3,4,5,6]]
['1', '2', '3', '4', '5', '6'] 

reduce( )函数

reduce( )函数同样接收一个函数和一个Iterable两个参数,不同的是所传入的函数必须要接收两个参数,而reduce是把函数作用的结果继续与序列中下一个元素做累计计算。

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

这个有什么用呢,举个简单的例子,可以把序列转化为相应的整数显示。

>>>from functools import reduce                  #加入内置函数reduce
>>>def fn(x, y):
...   return(x * 10 + y)
...
>>>reduce(fn, [1, 2, 3, 4, 5])
12345
【练习】字符串转为整数的函数实现
from functools import reduce
d={'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
def str2int(s):
    def char2num(s):                          #将字符串的每个字符转化为对应的整数,并组成序列
        return d[s]

    def fn(x, y):                             #将一个序列转化为对应的整数
        return x * 10 + y  

    return reduce(fn,map(char2num,s))

输出结果如下

>>>str2int('0110234')
110234

filter( )函数

filter,即过滤的意思,filter( )函数的作用是过滤序列。与上面两个函数一样,接收一个函数与一个序列,而在函数作用于序列的元素之后,根据返回值True或False来保留或移除该元素。如写一个保留奇数的函数:

>>>def odd(n):
...    return n % 2 == 1
...
>>>list(filter(odd,[1, 2, 3, 4, 5, 6, 7, 8]))
[1, 3, 5, 7] 

需要注意的是,filter( )函数返回的也是Iterator,惰性序列,需要用list( )来转化才能直接显示计算结果。

【应用】产生素数的函数实现

(以下代码转自廖雪芳的官方网站)

def _odd_iter():                             #定义一个初始值为3,且不存在偶数的初始序列生成器
    n = 1
    while True:
        n = n + 2
        yield n

def _not_divesible(n):                       #定义筛选函数,不是n的倍数则返回True
    return lambda x : x % n > 0

def primes():                                #定义一个初始值为2,
    yield 2
    it = _odd_iter()                         #it为序列n的生成器,初始序列
    while True:
        n = next(it)                         #返回序列n的第一个值
        yield n
        it = filter(_not_divesible(n), it)   #过滤序列中为n的倍数的值

for n in primes():                           #for循环取值
    if n < 100:                              #打印100以为的素数
        print(n)
    else:
        break

sorted( )函数

sort,分类、排序的意思。在Python总sorted( )函数可以将list排序。

>>>sorted([5, 9, -55, 90, 1])
[-55, 1, 5, 9, 90] 

sort( )函数还能接收一个key函数来自定义排序,也就是先把传入的函数作用于list,根据结果进行排序,把传入的初始序列按照结果的顺序进行排序。如接收一个abs( )函数

>>>sorted([5, 9, -55, 90, 1], key = abs) 
[1, 5, 9, -55, 90] 

还能加入第三个参数reverse=True,进行反向排序

>>>sorted([5, 9, -55, 90, 1], key = abs, reverse = True) 
[90, -55, 9, 5, 1] 

补充笔记

补充几个函数的用法,s.index('x')返回字符串中字符'x'的索引值;s.strip( )函数去除字符串首尾的空格或其他指定字符;s[::-1]把字符串s从尾到头顺序重新排列。


感谢你的阅读,有任何问题与想法欢迎评论与吐槽,和博主一起学习Python吧( ̄▽ ̄)~*

上一篇下一篇

猜你喜欢

热点阅读