天天看点

python:高阶函数、内置高阶函数:map\reduce\filter\sorted\lambda示例:

一:什么是高阶函数(Higher-order function):

函数本身可以赋值给变量

变量也可以指向函数

示例:

在python中有许多内置函数,比如:求绝对值函数

abs()

python:高阶函数、内置高阶函数:map\reduce\filter\sorted\lambda示例:

我们以往学习的函数都是可以直接通过名字调用的,那么我们也同样对其进行调用:

python:高阶函数、内置高阶函数:map\reduce\filter\sorted\lambda示例:

发现,abs不能达到调用的效果,反而刚才的abs(-5)是我们需要的调用效果。可见:abs是函数本身,而abs(-5)这才是函数调用

将其赋值:

f = abs()

python:高阶函数、内置高阶函数:map\reduce\filter\sorted\lambda示例:

说明函数本身可以赋值给变量,即变量可以指向函数。

二:作为高阶函数:

它的实参可以是一个函数名

其函数返回值是一个函数

示例:

def fun(x,y,f):
	return f(x),f(y)
print(fun(-10,5,abs))
           
python:高阶函数、内置高阶函数:map\reduce\filter\sorted\lambda示例:

在fun函数中,我们有三个形参:x,y,f,其中f是对应的实参为高阶函数abs

返回值f(x)和f(y)即将x和y分别作用在了abs中,即abs(x),abs(y)

三:内置高阶函数:map():

map() 接收两个参数,一个是函数,一个是序列

map将传入的函数依次作用到序列的每个元素,并把结果作为的新的序列返回

示例:有10个2-7之间的随机数,对每个元素求阶乘

def JC(x):  ##定义阶乘函数
    s = 1
    for i in range(1,x+1):
        s = s * i
    return s

import random
k = []
for i in range(10):  ##生成10个随机数
    k.append(random.randint(2,7))
print(k)

print(list(map(JC,k)))  ##列表输出阶乘结果,调用map高阶函数
           
python:高阶函数、内置高阶函数:map\reduce\filter\sorted\lambda示例:

四:内置高阶函数:reduce():

格式:reduce(函数+列表)

把一个函数作用在一个序列上,这个函数必须接收两个参数

reduce把结果继续和序列的下一个元素做累积计算【累加,累乘,除法,减法等都可以】

python2中内置,python3中需要手动导入

列式说明:

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

示例:求累乘

from functools import reduce  ##导入reduce模块
def multi(x,y):
    return x*y
print(reduce(multi,range(1,5)))   ##得到结果24
           

在multi函数中定义乘法运算,在reduce高阶函数中,通过reduce(函数+列表)的形式,将列表中的每个数依次作用进函数,达到12345累乘的效果

五:内置高阶函数:filter()过滤函数:

接收一个函数一个序列

filter把传入的函数依次作用于每个元素,根据返回值是true还是false决定保留还是丢弃该元素

示例:

def isodd(num):  ##判断是不是偶数
    if num % 2 == 0:
        return True
    else:
        return False
print(list(filter(isodd,range(1,101))))  ##得到100以内的偶数
           
python:高阶函数、内置高阶函数:map\reduce\filter\sorted\lambda示例:

filter(函数+序列),将序列中的所有元素作用于函数中,如果函数返回值为True,则保留该元素,返回值为False,则丢弃该元素。我们在上述示例中对于判定结果为偶数的数给予返回值True,而奇数False,从而达到过滤的效果。

六:内置高阶函数:sorted()排序函数:

python:高阶函数、内置高阶函数:map\reduce\filter\sorted\lambda示例:

默认sort和sorted由小到大排序,reverse=True由大到小排序

python:高阶函数、内置高阶函数:map\reduce\filter\sorted\lambda示例:

按照指定位置的元素大小进行排序: 【指定排序规则】

格式:sorted(序列+函数)

排序是根据函数返回值的大小进行排序

示例:

info = [
    ('apple1',200,32),
    ('apple2',40,12),
    ('apple3',40,2),
    ('apple4',1000,23),
    ('apple5',40,5),
]  #第0列名称,第1列个数,第2列价格

print(sorted(info))

#按照商品数量进行排序
def sorted_by_count(x):
    return x[1]

#按照商品价格排序
def sorted_by_price(x):
    return x[2]

#先按照商品数量由小到大排序,如果商品数量一眼
#则按照商品价格由小到大排序
def sorted_by_count_price(x):
    return x[1],x[2]

print(sorted(info,key=sorted_by_count))
print(sorted(info,key=sorted_by_price))
print(sorted(info,key=sorted_by_count_price))
           
python:高阶函数、内置高阶函数:map\reduce\filter\sorted\lambda示例:

在上述示例中:通过sorted(序列+函数),先将序列带入指定的函数中,比如当按照个数排序是,便将整个序列带入sorted_by_count()这个函数中,通过返回值x[1]来指定排序的规则是根据第而列元素个数来排序。默认的排序方法即从小到大。

七:内置高阶函数:lambda匿名函数:

没有名字的函数

冒号前面是形参,冒号后面为返回值

print(reduce(lambda x,y:x+y,[1,2,3,4,5,]))

#对序列做累加运算,返回冒号后面的累加结果 ##reduce(函数+序列)

示例:

nums = [7,0,5,9,6,4,0,1,0]   ##定义一个列表

print(sorted(nums,key=lambda x:2 if x == 0 else 1))  ##将其中的0都排到最后

print(list(filter(lambda x:x%2==0,range(1,51))))   ##筛选0-51中的偶数
           
python:高阶函数、内置高阶函数:map\reduce\filter\sorted\lambda示例:

在上述示例中:

1.sorted(序列+方法),序列即为nums,方法使用匿名函数,而在匿名函数部分,如果x为0,则将其返回值赋为2,其他均赋为1,在sorted默认排序中,是从小到大排序,因此0的返回值大,会被排在最后。而其他返回值都相等则不进行排序。

2.filter(函数+序列),函数即lambda匿名函数,冒号前面x为形参,冒号后面为返回值,返回值我们取对2取余为0的结果,即偶数。filter判断如果结果为True,则保留。序列即为range(1,51)

大大的小小阳