ITS·黑客

Python学习笔记六-高阶函数

2017-04-13  本文已影响84人  6156fc232124

函数本身可以直接赋值给变量,那进一步推理,可以得到,函数名其实就是一个变量,这个变量可以通过其他的变量来赋值替换。

当然,函数名也可以指向其他对象,比如一个数字,但是,单纯对该函数名的赋值只能作用于该函数实际定义在的模块中,如果要修改函数变量的指向在其他模块中也生效,要找到定义模块,进行更改。

例如:

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 即可。

例如:

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

上一篇 下一篇

猜你喜欢

热点阅读