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']
从上述例子可以看出,高阶函数的抽象能力是非常强大的,而且,核心代码可以保持得非常简洁。