Python学习笔记六-高阶函数
函数本身可以直接赋值给变量,那进一步推理,可以得到,函数名其实就是一个变量,这个变量可以通过其他的变量来赋值替换。
当然,函数名也可以指向其他对象,比如一个数字,但是,单纯对该函数名的赋值只能作用于该函数实际定义在的模块中,如果要修改函数变量的指向在其他模块中也生效,要找到定义模块,进行更改。
例如:
abs定义在import builtins模块中,完全修改时,用 import builtins; builtins.abs = 10
一个函数接收另一个函数作为参考,这种函数成为高阶函数。简单说,其实就是让函数的参数接收别的函数,比如abs(-5)编程f(-5),诸如此类的!
一、map( )用法:可以计算任意复杂的函数,比如计算、转化为字符串等。
map(函数名, [序列中的每个元素] ),结果作为新的惰性序列Iterator返回。然后通过list( )把整个序列呈现出来。
二、reduce( )函数必须接收2个参数,类似于符合函数的算法,把结果继续和序列的下一个元素做累积计算。
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
例子:

※lambda函数的用法
三、filter( )函数:过滤序列。根据返回值的Ture或者False决定保留还是丢弃元素。用法和map( )相似。
filter求素数的方法:埃氏筛法
列出从2开始的自然数集,然后取2,把2的倍数刷掉,再取3,把3的倍数刷掉,再取5,把5的倍数刷掉,不断取新数列的第一个数刷掉他的倍数即可。
Python实现该算法的过程:
1.构造一个从3开始的奇数序列:(生成器,无限序列)
def_odd_iter(): n =1whileTrue: n = n +2yieldn
2.然后定义一个筛选函数:
def_not_divisible(n):returnlambdax: x % n >0
3.最后,定义一个生成器,不断返回下一个素数:
defprimes():yield2it = _odd_iter()# 初始序列whileTrue: n = next(it)# 返回序列的第一个数yieldn it = filter(_not_divisible(n), it)# 构造新序列
这个生成器先返回第一个素数2,然后,利用filter()不断产生筛选后的新的序列。
由于primes()也是一个无限序列,所以调用时需要设置一个退出循环的条件
4. 设置一个退出循环条件:
# 打印1000以内的素数:forninprimes():
ifn <1000:
print(n)
else:
break
☆filter( )返回的结果是Iterator,为惰性序列,所以使用惰性计算,因此只有在filter( )取结果的时候,才会真正进行筛选并返回下一个筛选的元素。
四、sorted( )函数可以对list进行排序,并且可以通过key函数来实现自己想做的排序。
例如:


默认情况下,对于字符串的排序,Python按照ASCII的大小进行比较,从小到大排序。比较字符的时候,如果忽略大小写,就用key把字符全部变成大写或者全部变成小写。
一般情况下,sorted的排序都是从小到大,如果要反过来从大到小的话,就加上 reverse=True 即可。
例如:

以上,为高阶函数的几个重要函数的总结。