Python基础(9):高阶函数(map,reduce,filter,sorted)

版权声明:转载请注明来处 https://blog.csdn.net/Daisy_zye/article/details/84754943

高阶函数

定义:一个函数,可以接收另一个函数作为参数,这种函数称之为高阶函数。

理论基础: 

1:函数可以接收变量

2:函数名是指向函数的变量。

例如:abs,原本指向一个计算绝对值的函数,将他指向123后,abs变量就不再具有计算绝对值的能力。

map/reduce

map函数接收两个参数,函数名和可迭代对象。旨在将函数作用于每一个值,并返回一个可迭代对象。

例如:利用map函数,将所有元素转化为字符串。返回一个map对象,转化为列表后输出。

reduce函数同样需要接收两个参数,函数名和序列。特点是将结果继续和序列下一元素做累计运算。

可以表现为:

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

filter

filter函数用于过滤序列。

filter接收两个参数,函数名和序列。将函数分别作用于序列中的元素,根据返回值true或false决定决定保留还是丢弃该元素。

示例:利用埃氏筛法计算素数。(素数,除了1和它本身之外,没有其他因数)

原理:

列出从2开始的所有自然数,构成一个序列。2,3,4,5,6,7,8,……

取第一个数,2,是素数。然后把序列中2的倍数筛除

取第一个数,3,是素数,然后把序列中3的倍数筛除

取第一个数,5,是素数,然后把序列中5的倍数筛除

不断筛下去,就可以得到所有的素数。

代码分析:

首先我们需要一个序列。

明确需求:这个序列需要能表示从2开始的所有自然数。

理性分析:所有偶数,除2之外,均为合数。保留偶数,没有必要。

最终方案:创建一个,从3开始的奇数序列。

def fun1():
    n=1
    while True:
        n=n+2
        yield n        #生成器是惰性算法,适合表现无限序列

其次我们需要一个函数,这个函数的作用是:取序列的第一个元素,将其倍数全部删除。

def fun2(n):                  #当调用形式为fun2((1),(2))时,表示n=1,x=2
    return lambda x:x%n>0     #匿名函数,后面讲解,这一段的意思是,如果x整除n,余数大于0,则返回Ture,否则返回False

接下来,需要写一个最终的生成器,不断返回下一个素数。

def fun3():
    yield 2
    it = fun1() # 初始序列
    while True:
        n = next(it) # 返回序列的第一个数
        yield n
        it = filter(fun2(n), it) # 构造新序列

调试结果:

sorted

python内置的sorted函数可以进行排序。

但sorted也可以是一个高阶函数,通过Key参数接收一个函数,进行自定义排序。

实例:

对字符串排序,忽略大小写。

sorted(['aaa', 'aab', 'AAA', 'AAB'], key=str.lower)

对比:(字符串对比,是拿字符的ASCII码依次对比的)

猜你喜欢

转载自blog.csdn.net/Daisy_zye/article/details/84754943