高阶函数
-
map()
map()
函数接收两个参数,一个是函数,一个是Iterable
,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator
返回。
例如,将一个函数f(x)=x2作用于一个list。就可以用map实现。
map()
作为高阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的f(x)=x2,还可以计算任意复杂的函数,比如,把list所有数字转为字符串
list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
运行效果图
-
reduce()
reduce把一个函数作用在一个序列[x1, x2, x3, ...]
上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。
例如:一个序列求和
序列求和python有内置的求和函数sum()
,用reduce似乎多此一举
小练习:
1.利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']:
# -*- coding: utf-8 -*-
def normalize(name):
name=name[0].upper()+name[1:].lower()
return name
L1 = ['adam', 'LISA', 'barT']
L2 = list(map(normalize, L1))
print(L2)
运行结果
2.编写一个prod()函数,可以接受一个list并利用reduce()求积:
运行结果-
filter()
Python内建的filter()
函数用于过滤序列。
与map()
类似,filter()
也接收一个函数和一个序列。和map()
不同的是,filter()
把传入的函数依次作用于每个元素,然后根据返回值是True
还是False
决定保留还是丢弃该元素。
例如:在一个list中只保留奇数:
fliter应用
注意到filter()
函数返回的是一个Iterator
,也就是一个惰性序列,所以要强迫filter()
完成计算结果,需要用list()
函数获得所有结果并返回list。
练习:
回数是指从左向右读和从右向左读都是一样的数,例如12321,909。利用filter()
筛选出回数:
def is_palindrome(n):
nn = str(n) #转成字符串
return nn == nn[::-1] #反转字符串并对比原字符串返回true/false
运行结果
-
sorted()
排序算法
Python内置的sorted()函数就可以对list进行排序
shorted排序sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序
例如绝对值排序:
key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。
字符串排序,是按照ASCII的大小比较的,由于'Z' < 'a',结果,大写字母Z会排在小写字母a的前面。
要想字符串排序忽略字母大小,就要加一个条件即可实现:
如果要进行反向排序,只需要传入第三个参数reverse=True
练习:
假设用一组tuple表示学生名字和成绩:
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
请用sorted()对上述列表分别按名字排序:
def by_name(t):
return t[0].lower()
L=[('Dob',75),('Adam',92),('Bart',66),('Cisa',88)]
L1=sorted(L,key=by_name)
print(L1)
运行结果
再按成绩从高到低排序:
def by_scort(t):
return t[1]
L=[('Bob',75),('Adam',92),('Bart',66),('Lisa',88)]
L1=sorted(L,key=by_scort,reverse=True)
print(L1)
运行结果
返回函数
函数作为返回值,就叫返回函数
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
不需要立刻求和,而是在后面的代码中,根据需要再计算,可以不返回求和的结果,而是返回求和的函数:
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
当我们调用lazy_sum()时,返回的并不是求和结果,而是求和函数
返回函数说明在函数lazy_sum
中又定义了函数sum
,并且,内部函数sum
可以引用外部函数lazy_sum
的参数和局部变量,当lazy_sum
返回函数sum
时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。
当我们调用lazy_sum()
时,每次调用都会返回一个新的函数,即使传入相同的参数,f1()
和f2()
的调用结果互不影响。
匿名函数
关键字lambda表示匿名函数
例如:
匿名函数
匿名函数
lambda x: x * x
就是函数
def f(x):
x * x
匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。
网友评论