一些python的基础知识--高阶函数

filter(f,l)函数:第一个参数是过滤规则,一般来说是一个函数,filter根据这个函数处理结果来进行过滤(True或者False),第二个参数是待过滤对象或者叫序列。

首先要说明的是,在python2.x和3.x中,filter的返回值是有些区别的,python2.x中,调用filter后返回的是一个序列,也就是原序列过滤后的结果,但是,在python3.x中,经过filter()函数处理后,返回值是一个地址值(可以使用变量来接收它,然后对其操作),提高了运算的速度,节约空间。

下面,举个栗子!一个老栗子!

使用filter()删除1到100之间的素数(python3.x)

# def del_prime(n):
      #在这里,有人用引入math库,其实结果是一样的,至于效率,我不太清楚。
#     for i in range(2,int(n/2)+1):
#         if n%i==0:
#             return False
##此处只是想操作列表,不然可以直接在filter的第二个参数处写range(0,101)【顾左不顾右】
# def create_list(m):
#     new_list=[]
#     for i in range(0,m-10):
#         new_list.append(i)
#     return new_list
# m=100
#下面两句的处理结果是一样的
# # a = filter(del_prime,create_list(100))
# a = filter(del_prime,range(1,10))
# print(a)
结果:
(菜鸟教程里面说,处理的结果是一个迭代器,是一个filter类,不过,我觉得应该叫做生成器,而且,是一个filter对象,这样应该更合理一些)如有不对,评论指正

map(f,seq)第一个参数是一个函数,或者说是一个操作规则(操作后边的序列的规则),第二个参数是一个序列(了一时list或者其他),map()处理后的结果,不改变原序列,还可以使用新的变量来接收。

和filter函数一样,map()在python3.x中也做了和filter相同的改变

再来个栗子:将一个数组的每个元素都变为原来的2倍。代码太过简单,不注释了

listl = [1,2,3,4]
def double_num(n):
    return 2*n
x = map(double_num,listl)
print(x)

还有一个高阶函数,那就是sorted()这个函数,在python2.x和3.x中区别并不是很大。

直接给列表元素排序就不写了,太简单。。给字符串列表排序,是按照ASCII码值进行的

(下面的栗子,产自廖雪峰网站)

我们再看一个字符串排序的例子:

>>> sorted(['bob', 'about', 'Zoo', 'Credit'])
['Credit', 'Zoo', 'about', 'bob']

默认情况下,对字符串排序,是按照ASCII的大小比较的,由于'Z' < 'a',结果,大写字母Z会排在小写字母a的前面。

现在,我们提出排序应该忽略大小写,按照字母序排序。要实现这个算法,不必对现有代码大加改动,只要我们能定义出忽略大小写的比较算法就可以:

def cmp_ignore_case(s1, s2):
    u1 = s1.upper()
    u2 = s2.upper()
    if u1 < u2:
        return -1
    if u1 > u2:
        return 1
    return 0

忽略大小写来比较两个字符串,实际上就是先把字符串都变成大写(或者都变成小写),再比较。

这样,我们给sorted传入上述比较函数,即可实现忽略大小写的排序:

>>> sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case)
['about', 'bob', 'Credit', 'Zoo']

从上述例子可以看出,高阶函数的抽象能力是非常强大的,而且,核心代码可以保持得非常简洁。


你可能感兴趣的:(Python,StandLib)