python的高阶函数与匿名函数
一、高阶函数的定义
高阶函数:就是把函数当成参数传递的一种函数,例如:
def add(x,y,f):
return f(x)+f(y)
print(add(-8,11,abs)
结果:19
解释:
1.调用add函数,分别执行abs(-8)和abs(11),分别计算出他们的值
2.最后再做和运算
二、Python内置的几个高阶函数
1.map()函数
map()函数接收两个参数,一个是函数(function),一个是序列(sequence),map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。程序代码如下:
lt = (1,2,3,4,5)
def f2(x):
return x*x
ml = map(f2,lt)
print (type(ml))
print (ml)
结果:
解释:定义的函数f2
。写f2
时,指的是函数对象本身,当我们写f2(1)
时,指的是调用f函数,并传入参数1,期待返回结果1。因此,map()
传入的第一个参数是f2
,即函数对象本身。像map()
函数这种能够接收函数作为参数的函数,称之为高阶函数(Higher-order function)。
2.reduce()函数:reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
程序例子如下:
print("#############reduce################")
def f(x,y):
return x + y
print (reduce(f,[1, 2, 3, 4, 5],10))
结果:
3.filter()函数
Python内建的filter()函数用于过滤序列。和map类似,filter()也接收一个函数和一个序列。和map不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是true还是false决定保留还是丢弃。true保留,false丢弃
例子:在一个list中,删掉偶数,只保留奇数,程序代码如下:
print ("###############filter##################")
a = [1, 2, 3, 4, 5]
def is_odd(x):
return x%2 == 1
print (filter(is_odd,a))
结果:
4.匿名函数
- 没有函数名
- 单条语句组成
- 语句执行的结果就是返回值
- 可用作sort的key函数
例子如下:
def sum(x,y):
return x+y m = lambda x,y:x+y
print (m(4,5))
结果:9
5.sorted函数
对List、Dict进行排序,Python提供了两个方法。对给定的List L进行排序:
方法1.用List的成员函数sort进行排序,在本地进行排序,不返回副本
方法2.用built-in函数sorted进行排序(从2.4开始),返回副本,原始输入不变
sorted函数的语法:
def sorted(iterable, cmp=None, key=None, reverse=False):
可以看到其中第一个参数是可迭代对象,后面的参数都是具有默认值的,重点阐述如下:
- iterable:是可迭代类型;
- cmp:用于比较的函数,比较什么由key决定;
- key:用列表元素的某个属性或函数进行作为关键字,有默认值,迭代集合中的一项;
- reverse:排序规则. reverse = True 降序 或者 reverse = False 升序,有默认值。
- 返回值:是一个经过排序的可迭代类型,与iterable一样。
参数说明:
(1) cmp参数
cmp接受一个函数,拿整形举例,形式为:
def f(a,b):
return a-b
如果排序的元素是其他类型的,如果a逻辑小于b,函数返回负数;a逻辑等于b,函数返回0;a逻辑大于b,函数返回正数就行了
(2) key参数
key也是接受一个函数,不同的是,这个函数只接受一个元素,形式如下
def f(a):
return len(a)
key接受的函数返回值,表示此元素的权值,sort将按照权值大小进行排序
(3) reverse参数
接受False 或者True 表示是否逆序
例子:对字典进行排序,程序代码如下:
print ("############对字典进行排序####################")
mm = dict(a=1,c=3,d=9,b=10,f=4)
print (mm)
for i in mm:
print i
print ('#####################################')
for j in mm.iteritems():
print j
test = sorted(mm)
test =sorted(mm.iteritems(),key=lambda d:d[1])
print (test)
结果:
最新文章
- 侯捷老师C++大系之C++面向对象开发:(一)不带指针的类:Complex复数类的实现过程
- redis缓存分页数据ID
- 《CSS3专业网页开发指南》笔记
- UESTCOJ-BiliBili, ACFun… And More!(水题)
- 【转】JAVA字符串格式化-String.format()的使用
- 【Spark亚太研究院系列丛书】Spark实战高手之路-第一章 构建Spark集群(第五步)(2)
- 关于Java和.NET之间的通信问题(JSON)
- C#丨爬虫基础
- Java对象与类中的一个小练习
- 机器学习-KNN分类器
- 单元测试系列:JUnit单元测试规范
- 如何在Java应用中提交Spark任务?
- RxJS操作符(三)
- Java基础学习-Eclipse综述和运算符的使用
- Jquery 选择器 特殊字符 转义字符
- svn和NetBeans一起使用造成svn老是死锁, database is locked
- MP实战系列(五)之封装方法讲解
- 使用RetionalRose根据现有的java工程逆向生成类图
- SQL Server MSSQLSERVER 服务无法启动解决方案
- backbone学习笔记:集合(Collection)