美文网首页Pythoner集中营
【Python入门】7.高阶函数之 map( )、reduce(

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

作者: 三贝_ | 来源:发表于2018-08-08 20:56 被阅读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吧( ̄▽ ̄)~*

    相关文章

      网友评论

        本文标题:【Python入门】7.高阶函数之 map( )、reduce(

        本文链接:https://www.haomeiwen.com/subject/syffbftx.html