继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【Python入门】7.高阶函数之 map( )、reduce( )、filter( )、sorted( )的用法

慕哥9229398
关注TA
已关注
手记 1272
粉丝 199
获赞 913

目录

高阶函数
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 ndef _not_divesible(n):                       #定义筛选函数,不是n的倍数则返回True
    return lambda x : x % n > 0def 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从尾到头顺序重新排列。



作者:三贝_
链接:https://www.jianshu.com/p/09d4284f33e1


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP