初学Python 8 高阶函数

本文深入探讨了Python中的高阶函数概念,包括map、reduce、filter等函数的应用及原理,并介绍了如何利用这些函数进行高效的数据处理。此外,还讨论了闭包、装饰器和偏函数等高级主题。

Python中的高阶函数是指,以函数作为另一个函数的参数。
map:
接受两个参数,一个函数,一个iterable,将函数依次作用到序列的每个元素,并把写过作为新的iterator返回。
这里的r就是一个iterator(迭代器)

>>> def f(x):
      return x*x
>>> r=map(f,[1,2,3,4,5,6,7,8,9]) 
>>> r
<map object at 0x05518C30>
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> list(map(str,[1,3,4,5,6]))  //把数字转化为字符串     
['1', '3', '4', '5', '6']
>>> 

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
>>> reduce(add,[1,3,5,7,9])
25
>>> def func(x,y):
      return x*10+y
>>> reduce(func,[1,3,5,7,9])
13579

注意,字符串也是一个序列
filter:
用于过滤序列,接收一个函数和一个序列,把函数以此作用于每个元素,根据返回值是True还是False,决定保留还是丢弃该元素。

>>> def odd(x):
      return  x%2==0   
>>> list(filter(odd,[1,2,3,4,5,6,7,8,9]))
[2, 4, 6, 8]

iterator是Python的惰性序列,当要用到某些元素时,才去计算它的值。可用于计算无限序列。
filter()的作用是从一个序列中筛选出符合条件的元素,而且由于使用了惰性计算,只有在取filter()结果的时候,才会真正筛选并返回下一个晒出的元素。
sorted()
可以对list进行排序,也是一个高阶函数,能接受一个key函数来自定义排序。
对数字默认升序,对字符串默认以ASCII升序排序,注意大写字母<小写字母

>>> sorted([1,22,435,-242,-3],key=abs)     
[1, -3, 22, -242, 435]

如果要实现反向排序,可以再传入第三个参数reverse=True

>>> sorted([1,22,435,-242,-3],key=abs,reverse=True)     
[435, -242, 22, -3, 1]

和c里面的sort挺像的,key=函数就像cmp函数,定义了排序规则。

高阶函数不仅可以以函数作为参数,还可以以函数作为返回值。

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum
>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function lazy_sum.<locals>.sum at 0x101c6ed90>
//只有再次调用返回的函数,才能得到计算结果
>>> f()
25

第一次调用时,相关的参数和变量都保存在返回函数中,这种程序结构称为“闭包“
但是,每次调用就算是相同的参数,返回的都是一个新的函数,是不同的。调用结果互不影响。

>>> f1 = lazy_sum(1, 3, 5, 7, 9)
>>> f2 = lazy_sum(1, 3, 5, 7, 9)
>>> f1==f2
False

因为”闭包“,所以参数和变量不利己计算,所以闭包的返回函数不要反悔任何循环变量,或者后续会发生变化的变量。
定义函数!=执行函数

匿名函数lambda
关键字lambda表示匿名函数,冒号前面的表示参数,当然也可以没有参数,直接以lamdba的式子作为返回。
只能有一个表达式,可以把lambda表达式复制给一个变量,而后直接使用变量名来使用函数。

>>> f=lambda x :x*x
>>> f
<function <lambda> at 0x05D00A98>
>>> f(5)
25
>>> l=list(filter(lambda x:x%2==1,range(0,20)))
>>> l
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19] 
效果一样
>>> def fun(x):
    return x%2==1
>>> ll=list(filter(fun,range(0,20)))
>>> ll
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

Python的functools模块,用于高阶函数,那些以函数作为参数或返回函数的函数。
装饰器Decorator
能够在代码运行期间动态增加功能的方法
由于函数也是一个对象,函数对象可以赋值给一个变量,而后通过变量也能调用函数。注意使用变量要像使用函数一样加括号。
Python的装饰器可以用函数实现,也可以用类实现。
函数的__name__属性可以看到函数的名字

>>> def hah():
    print('hahahahha')
>>> hah
<function hah at 0x053F1858>
>>> hah()
hahahahha
>>> f=hah()
hahahahha
>>> f=hah
>>> f
<function hah at 0x053F1858>
>>> f()
hahahahha
>>> f.__name__
'hah

偏函数functools.partial
可以把原函数的某些参数设为指定值(即固定住),从而在使用时可以简化。
int()函数把字符串转化为整数,默认为十进制,也可以指定base参数,把字符串当作指定的进制数。

int('12345')
12345
int('12345',base=8)
5349
本指南详细阐述基于Python编程语言结合OpenCV计算机视觉库构建实时眼部状态分析系统的技术流程。该系统能够准确识别眼部区域,并对眨眼动作与持续闭眼状态进行判别。OpenCV作为功能强大的图像处理工具库,配合Python简洁的语法特性与丰富的第三方模块支持,为开发此类视觉应用提供了理想环境。 在环境配置阶段,除基础Python运行环境外,还需安装OpenCV核心模块与dlib机器学习库。dlib库内置的HOG(方向梯度直方图)特征检测算法在面部特征定位方面表现卓越。 技术实现包含以下关键环节: - 面部区域检测:采用预训练的Haar级联分类器或HOG特征检测器完成初始人脸定位,为后续眼部分析建立基础坐标系 - 眼部精确定位:基于已识别的人脸区域,运用dlib提供的面部特征点预测模型准确标定双眼位置坐标 - 眼睑轮廓分析:通过OpenCV的轮廓提取算法精确勾勒眼睑边缘形态,为状态判别提供几何特征依据 - 眨眼动作识别:通过连续帧序列分析眼睑开合度变化,建立动态阈值模型判断瞬时闭合动作 - 持续闭眼检测:设定更严格的状态持续时间与闭合程度双重标准,准确识别长时间闭眼行为 - 实时处理架构:构建视频流处理管线,通过帧捕获、特征分析、状态判断的循环流程实现实时监控 完整的技术文档应包含模块化代码实现、依赖库安装指引、参数调优指南及常见问题解决方案。示例代码需具备完整的错误处理机制与性能优化建议,涵盖图像预处理、光照补偿等实际应用中的关键技术点。 掌握该技术体系不仅有助于深入理解计算机视觉原理,更为疲劳驾驶预警、医疗监护等实际应用场景提供了可靠的技术基础。后续优化方向可包括多模态特征融合、深度学习模型集成等进阶研究领域。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值