热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python--函数式编程(高阶函数(map,reduce,filter,sorted),匿名函数(lambda))

1.1函数式编程面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元

1.1函数式编程

面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。

函数式编程:是使用一系列函数去解决问题,函数式编程就是根据编程的范式来的出想要的结果,只要是输入时确定的,输出就是确定的。

1.2高阶函数

能把函数作为参数传入,这样的函数就称为高阶函数。

1.2.1函数即变量

以python的内置函数print()为列,调用该函数一下代码

>>> print("hello world")
hello world

#只写print
>>> print
in function print>

#可见print("hello world")是函数调用,而print是函数本身

要获得函数调用执行的结果,我们把结果赋值给变量:

>>> aa = abs(-20)
>>> aa
20

如果把函数本身赋值给变量

>>> p = print
>>> p
in function print>

#函数本身可以赋值给变量,变量可以指向函数

我们通过变量来调用这个print函数,验证结果如下

>>> p("check")
check

总结:函数名也是变量,对于print()这个内置函数,完全可以把函数名print看成变量,它指向一个可以打印任何东西的函数

注:实际程序代码绝不能这么写,上面只是为了举例说明,要恢复print函数,请重启python的交互环境

1.2.2传入函数

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

函数的返回值是一个函数名,也是高阶函数。

例如:一个简单的高阶函数

def add(x,y,z):
    return abs(x)+abs(y)
aa = add(12,23,abs)   #函数执行的结果 赋值给 aa
print(aa) #查看aa的值
#35 

#注,abs()函数是求一个整数的绝对值

1.3匿名函数

什么是匿名函数:

在python中有一个匿名函数lambda,匿名函数就是指:无需定义标识符(函数名)的函数或子程序。

定义lambda表达式:

lambda  arguments:express    

#arguments 参数(可以有多个参数)
#express 表达式

#lambda返回值是一个函数的地址,也就是函数对象
aa = lambda  arguments:express  #把的到lambda函数地址,赋值给变量aa

查看这个lambda函数地址   ,用aa(argument)   查看这个函数的值

 

例1

def pf(x=0):
    return x**2
print(pf(3))
普通函数定义,求数字平方
aa = lambda x:x**2
print(aa(4))
#16
lambda函数,求数字平方

 总结:

1.lambda函数可以参数可以有多个,包含的表达式不能超过一个,不要试图向lambda函数中塞入太多东西,如果你需要做复杂的功能,应该定义一个普通函数,想定义什么就定义什么。

2.lambda函数用在需要封装特殊的,非重用代码上,避免令我们的代码充斥大量的单行函数。

1.4map函数

map()函数,map映射  

map(func,iterable)

map()函数接受两个参数,一个是函数,一个可迭代的对象(iterable),map将传入的函数依次作用到序列的每个元素,并把结果作为新的 可迭代的对象 的结果返回

例:有个函数,f(x) = x+1 把得到的数字 加1    要把这个函数作用在一个[1,2,3,4,5,6]上

number = [1,2,3,4,5,6]
#1.用普通函数定义方法
def add_one(x):
    return x+1
def map_test(func,arrey):
    res = []
    for i in arrey:
        i = func(i)
        res.append(i)
    return res
print(map_test(add_one,number))
#[2, 3, 4, 5, 6, 7]


#2.用lambda函数定义的得到结果,借助1定义的map_test函数
print(map_test(lambda x:x+1,number))
#[2, 3, 4, 5, 6, 7]

#3.用map()本身函数去定义
print(list(map(lambda x:x+1 ,number)))
#[2, 3, 4, 5, 6, 7]

#注:map()得出的结果是一个iterator ,需要用list()函数让它个整个序列都计算出来返回一个list

我们可能会想,写一个循环,也可以计算出结果,但要实现多个功能,是不是也要写多个循环 例:得出每个列表中元素的平方或则n次方

map()作为高阶函数,事实上把运算规则抽象了,不但可以计算简单的 f(x) = x+1 ,也能计算更复杂的函数。

总结:map() 处理序列中的每个元素,得到的结果是一个 iterator ,需通过list(iteratro),该list元素个数,与原来位置一样

1.5reduce函数

在python2可以直接用reduce()函数

在python3需要调用reduce模块

from functools import reduce
reduce(function, sequence, initial=None)  #该函数的默认用法

reduce函数,将function作用sequence序列的元素,每次携带一对(先前的结果以及下一序列的元素),连续的将现有的结果和下一个作用在获得的随后的结果上,最后得到我们的序列为一个最终结果的返回值

number1 = [2,3,4,10]
#1.普通函数定义
def chengfa(x,y):
    return x*y  #返回得到两个数相乘的结果
def reduce_test(func,seq,init=None):
    if init is None:
        res = seq.pop(0)   #seq删除第一个元素,并获取删除这个元素 赋值给res
    else:
        res = init
    for i in seq:
        res = func(res,i)  #循环一次,执行func这个函数
    return res
print(reduce_test(chengfa,number1))
#240
print(reduce_test(chengfa,number1,10))
#2400

#如果给了init 初始值,就是从初始值 乘以列表的每个元素的的出结果

#2.lambda函数,借助reduce_test()函数定义
print(reduce_test(lambda x,y:x*y,number1,init=3))
#720

#3.使用reduce(),结合lambda()
print(reduce(lambda x,y:x*y, number1))
#240

得到列表所有元素,相乘的结果

number1 = [2,3,4,10]
#1.普通函数定义
def chengfa(x,y):
    return x*y  #返回得到两个数相乘的结果
def reduce_test(func,seq,init=None):
    if init is None:
        res = seq.pop(0)   #seq删除第一个元素,并获取删除这个元素 赋值给res
    else:
        res = init
    for i in seq:
        res = func(res,i)  #循环一次,执行func这个函数
    return res
print(reduce_test(chengfa,number1))
#240
print(reduce_test(chengfa,number1,10))
#2400

#如果给了init 初始值,就是从初始值 乘以列表的每个元素的的出结果

#2.lambda函数,借助reduce_test()函数定义
print(reduce_test(lambda x,y:x*y,number1,init=3))
#720

#3.使用reduce(),结合lambda()
from functools import reduce
print(reduce(lambda x,y:x*y, number1))
#240
得到列表所有元素,相乘的结果
print(reduce(lambda x,y:x+y,range(1,101)))
得到1-100的和

 

1.6filter函数

filter()函数用于过滤序列

和map()类似,filter()也接受一个函数和一个序列(可迭代的对象,也就是能被for循环),和map()不同的是,fillter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

例:

aa = ['A', '', 'B', None, 'C', '  ']
#1.自定义函数测试
def not_empty(s):
    return  s and s.strip()
def filter_test(func,iter):
    res = []
    for i in iter:
        i = func(i)
        if i:
            res.append(i)
    return res
print(filter_test(not_empty,aa))

#['A', 'B', 'C']

#2.filter内置函数测试
print(list(filter(not_empty,aa)))
#['A', 'B', 'C']
把列表中空字符串,空元素,都去掉

filter()这个函数,关键在于正确实现一个筛选函数,

注:filter()函数返回的是一个iterator,内存地址,需要看内存地址的值, 用list()函数或得该地址的值 

1.7sorted函数

sorted()函数也是一个高阶函数,它可以接收key

sorted排序,排序是比较元素的大小,如果是数字可以直接比较,如果是字符串或则两个dict(字典)?

sorted()传入的参数是可迭代的对象,返回值的对象是一个列表

例:

aa = [11,-10,20,21,30,-40]
print(sorted(aa))
数字默认排序

接收一个key函数来实现自定义排序

例:根据绝对值大小来进行排序

aa = [11,-10,20,21,30,-40]
print(sorted(aa,key=abs))
#[-10, 11, 20, 21, 30, -40]
根据绝对值排序

例:字符串排序

print(sorted("hello"))
#['e', 'h', 'l', 'l', 'o']
print(sorted(["hello","ho","haha"]))
# ['haha', 'hello', 'ho']
字符串排序

注:默认情况下,对字符串排序是按照ASCII编码表的大小进行比较的

 

最后总结:

python内置的几个高阶函数:map() ,reduce(),filter,sorted()

 


推荐阅读
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • EzPP 0.2发布,新增YAML布局渲染功能
    EzPP发布了0.2.1版本,新增了YAML布局渲染功能,可以将YAML文件渲染为图片,并且可以复用YAML作为模版,通过传递不同参数生成不同的图片。这个功能可以用于绘制Logo、封面或其他图片,让用户不需要安装或卸载Photoshop。文章还提供了一个入门例子,介绍了使用ezpp的基本渲染方法,以及如何使用canvas、text类元素、自定义字体等。 ... [详细]
  • Python使用Pillow包生成验证码图片的方法
    本文介绍了使用Python中的Pillow包生成验证码图片的方法。通过随机生成数字和符号,并添加干扰象素,生成一幅验证码图片。需要配置好Python环境,并安装Pillow库。代码实现包括导入Pillow包和随机模块,定义随机生成字母、数字和字体颜色的函数。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • MATLAB函数重名问题解决方法及数据导入导出操作详解
    本文介绍了解决MATLAB函数重名的方法,并详细讲解了数据导入和导出的操作。包括使用菜单导入数据、在工作区直接新建变量、粘贴数据到.m文件或.txt文件并用load命令调用、使用save命令导出数据等方法。同时还介绍了使用dlmread函数调用数据的方法。通过本文的内容,读者可以更好地处理MATLAB中的函数重名问题,并掌握数据导入导出的各种操作。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
author-avatar
黄思悦-XHNZ_314
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有