Python高阶函数map()、reduce()、 filter()、sorted()

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28963915/article/details/83343768

先介绍一个名词:函数式编程
#函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,
任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。
而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,
因此,这种函数是有副作用的。
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
#Python 对函数式编程提供部分支持。由于 Python 允许使用变量,因此,Python 不是纯函数式编程语言
#高阶函数 Higher-order function
#函数本身也可以赋值给变量,即:变量可以指向函数
比如求一个绝对值

x = abs(-100)#函数赋值给变量
y = abs#函数本身赋值给变量
print(x,y)#打印结果 10 <built-in function abs>
#如果一个变量指向了一个函数,那么,可否通过该变量来调用这个函数
print(y(-10))#打印结果:10
打印结果:
100 <built-in function abs>
10
#说明变量 y 现在已经指向了 abs 函数本身。直接调用 abs() 函数和调用变量 y() 完全相同
#函数名也是变量
#那么函数名是什么呢?
#函数名其实就是指向函数的变量!对于 abs() 这个函数,
#完全可以把函数名 abs 看成变量,它指向一个可以计算绝对值的函数!

#传入函数
#既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,
这种函数就称之为高阶函数

#比如
def add(a,b,y):
    return y(a)+y(b)
print(add(-1,-1,abs))#abs作为一个一个参数传入
#编写高阶函数,就是让函数的参数能够接收别的函数。
打印结果:
2

#python内置函数 map() reduce()和filter()
#map() 函数接收两个参数,一个是函数,一个是 Iterable ,map 将传入的函数依次作用到序列的每个元素,
并把结果作为新的Iterator 返回,比如我们有一个函数 f(x)=x^2 ,要把这个函数作用在一个
list=[1,2, 3, 4, 5, 6, 7, 8, 9] 上,就可以用 map()

def f(x):
    return x*x
y= map(f,[1,2, 3, 4, 5, 6, 7, 8, 9])
print(y)
print(list(y))
打印结果:
<map object at 0x0000024777A265C0>
[1, 4, 9, 16, 25, 36, 49, 64, 81]
#map() 传入的第一个参数是f,即函数对象本身。由于结果y是一个Iterator,Iterator是惰性序列,
因此通过list()函数让它把整个序列都计算出来并返回一个 list

#再比如把一个list都转成字符串
print(list(map(str,[1,2,3,4,5,6,7,8,9])))
打印结果:
['1', '2', '3', '4', '5', '6', '7', '8', '9']
#map() 作为高阶函数,事实上它把运算规则抽象了

#reduce()
#reduce() 把一个函数作用在一个序列 [x1, x2, x3, …]
#上,这个函数必须接收两个参数, reduce 把结果继续和序列的下一个元
#素做累积计算,其效果就是:
#reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
#可以用于队列求和

from functools import reduce
def add(x,y):
    return x+y
def fn(x,y):
    return x*10+y
def normalize(name):
    return name.capitalize()
def pord(x,y):
    return x*y
print(reduce(add,[1,2,3,4,5,6,7,8,9]))#list
print(reduce(add,(1,2,3,4,5,6,7,8,9)))#tuple
print(reduce(fn,[1,3,5,7,9]))
L1 = ['AdmIn','anny','LUCY','sandY','wILl']
print(list(map(normalize,L1)))
print('3*5*7*9=',reduce(pord,[3,5,7,9]))
打印结果:
45
45
13579
['Admin', 'Anny', 'Lucy', 'Sandy', 'Will']
3*5*7*9= 945

#filter
#用于过滤序列 接收一个函数一个序列

def is_odd(n):
    return n%2==1
def is_empty(s):
    return s and s.strip()
print(list(filter(is_odd,[1,2,3,4,5,6,7,8,9])))#返回一个奇数序列
print(list(filter(is_empty,['A', '', 'B', None, 'C', ' '])))
打印结果:
[1, 3, 5, 7, 9]
['A', 'B', 'C']

#排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。
如果是数字,我们可以直接比较,但如果是字符串或者两个 dict 呢?
直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。
通常规定,对于两个元素 x 和 y ,如果认为 x < y ,则返回 -1 ,
如果认为 x == y ,则返回 0 ,如果认为 x > y ,则返回 1 ,
这样,排序算法就不用关心具体的比较过程,而是根据比较结果直接排序。

Python 内置的 sorted() 函数就可以对 list 进行排序
l1 = sorted([36, 5, -12, 9, -21])
l2 = sorted([36, 5, -12, 9, -21], key=abs)#接收一个 key 函数来实现自定义的排序
l3 = sorted(['bob', 'about', 'Zoo', 'Credit'])
#key 指定的函数将作用于 list 的每一个元素上,并根据 key 函数返回的结果进行排序
l4 = sorted(['bob', 'about', 'Zoo', 'Credit'],key=str.lower)
#要进行反向排序,不必改动key函数,可以传入第三个参数 reverse=True
l5 = sorted(['bob', 'about', 'Zoo', 'Credit'],key=str.lower,reverse=True)
l6 = sorted([36, 5, -12, 9, -21], key=abs,reverse=True)
print(l1)
print(l2)
print(l3)
print(l4)
print(l5)
print(l6)
打印结果:
[-21, -12, 5, 9, 36]
[5, 9, -12, -21, 36]
['Credit', 'Zoo', 'about', 'bob']
['about', 'bob', 'Credit', 'Zoo']
['Zoo', 'Credit', 'bob', 'about']
[36, -21, -12, 9, 5]
#sorted() 也是一个高阶函数。用 sorted() 排序的关键在于实现一个映射函数

python高阶函数之map()、reduce()、filter()、sorted()

猜你喜欢

转载自blog.csdn.net/qq_28963915/article/details/83343768