从0.1开始学Python——[15]
一等对象,指的是在运行时创建,能赋值给变量,能作为参数传递也能作为返回值返回的对象。在Python中,所有对象都是一等对象,包括函数。但是函数不是在所有编程语言中都是一等对象。
高阶函数
高阶函数是接收函数作为参数或将函数作为返回值的函数。定义一个函数,让它筛选列表的偶数或奇数,并保存到一个新列表里面,或者筛选大于五的数等等。如果就单纯得写判断语句进行判断,这当然可以,而且代码也不多。但是,如果我们希望随时调整功能,那这种方式可能就需要修改多条语句,比较麻烦。但是如果我们在函数内部定义包含了以上功能的多个函数,在需要用到某个的时候在判断语句里面调用相应的函数,那么就能使函数的判断语句最大简化。但是如果我们可以在该函数外部定义一些我们想用的函数,然后希望用哪个就在该函数的参数里面调用,这样则更加方便灵活,只需要增加一个形参输入函数对象,即可实现。
# 定义一个函数用于检查是否为奇数
def jishu(i):
if i % 2 != 0:
return True
return False
# 定义一个函数用于找大于5的数
def dawu(i):
if i > 5:
return True
return False
def duogongneng(fun,list1):
jieguo = []
for i in list1:
# 假如要看是否大于五
if fun(i):
jieguo.append(i)
return jieguo
l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(duogongneng(dawu, l))
[6, 7, 8, 9]
这就是典型的高阶函数,属于接收函数作为参数的那一类高阶函数。相当于往函数里面传代码。
filter()函数
上述函数实际上是按照某种原则筛选序列里面的元素,然后保存到一个新序列中。而这个功能通过Python内置函数filter(函数对象,序列)函数可以直接实现。输入的两个形参分别是决定过滤功能的函数(其实是可迭代结构)和需要过滤的序列(其实是可迭代结构),返回值是过滤完的可迭代结构,这个结构需要类型转换之后才能成为相应种类的序列。
print(list(filter(dawu, l)))
[6, 7, 8, 9]
匿名函数
上面介绍的filter()函数,输入的函数对象都是需要在程序中定义好的,那其实为了用这个函数而专门定义别的函数其实也挺繁琐,要写不少代码,所以引出了更加方便的匿名函数。基本语法为:lambda 参数:得到返回值的表达式。这个整体相当于一个函数对象,可以赋值给其他变量然后输入实参打印结果,也可以直接输入实参打印出来。匿名函数也被叫做语法糖。例如:
f = (lambda a, b: a+b)
print((lambda a, b: a+b)(11, 23))
print(f(10, 99))
34
109
匿名函数主要解决有些函数只用一次的问题,如果放个地方定义多少有些浪费,所以就可以用匿名函数节省空间,只在用的地方输入一次就行。比如上面使用filter()函数的某个函数功能过滤数列,如果我只想用一次,不妨写成:
l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
s = filter(lambda i: i % 2 == 0, l)
r = list(s)
print(r)
[2, 4, 6, 8]
当然,因为匿名函数后面只能加一个得到返回值的表达式,因此一些循环语句和复杂的判断语句是写不了的。
map()函数
他的作用是对可迭代对象的所有元素做指定的操作,然后将操作完的元素添加到一个新的对象中返回,返回值同样需要类型转换。比如:
l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
f = map(lambda i: i // 2, l)
print(list(f))
[0, 1, 1, 2, 2, 3, 3, 4, 4]
.sort()方法
之前说到,.sort()方法是用来对列表元素排序的方法,但是他是直接用小于号进行比较,比大小或说Unicode编码大小,所以只能比相同类型的数据。为了解决这个问题,我们可以使用.sort()方法中的另一个用于接收关键字的参数——key,key需要一个函数做参数。设置某函数作为参数之后,运行这个方法的时候,会依次将列表中的元素作为调用这个函数的参数使用,也就是说依次将列表元素代入函数,然后函数用各个元素得到的返回值进行比大小,然后排序。如:
l = [123, 2666, 'maolei', 'zhangchulan', 'kongtiaochengtailang']
l.sort(key=str)
print(l)
[123, 2666, 'kongtiaochengtailang', 'maolei', 'zhangchulan']
sorted()函数和.sort()方法的用法基本一致,但是sorted()函数可以排序任意序列。另外,用sorted()函数处理过序列之后会返回新对象,而不是直接改变原对象的元素顺序,也就是说原对象不受影响。
l = [123, 2666, 'maolei', 'zhangchulan', 'kongtiaochengtailang']
l1 = sorted(l, key=str)
print(l1)
print(l)
[123, 2666, 'kongtiaochengtailang', 'maolei', 'zhangchulan']
[123, 2666, 'maolei', 'zhangchulan', 'kongtiaochengtailang']