我们先来看两句代码:
items1=list(map(lambdax:x**2,filter(lambdax:x%2,range(1,10))))items2=[x**2forxinrange(1,10)ifx%2]
这两句代码的结果都是相同的,都返回一个序列[1,9,25,49,81]。我们先来看第二句,很简单,就是循环里面加了个条件,最后输出平方这么个操作。
而第一句,出现了两个匿名函数和两个高阶函数filter和map,这两个函数在有些场景下很常见,而且性能很好,那这两个函数到底是做什么的呢?以及输入和输出的参数又有什么要求呢?
Filter函数filter函数用于过滤有限系列,返回的是一个迭代器对象,可通过list()查看具体内容。该函数需要传入两个参数,第一个是过滤规则(函数),第二个待过滤的序列(迭代器),默认地,会将序列的每个元素作为参数传递给过滤规则进行判断,如果结果返回True/1,则保留,返回结果是False/0,则舍弃。
语句如下:filter(function,iterable)
对于这种函数作为参数传入另一个函数的场景,常用的写法有两种:一种是类似上面例子使用匿名函数;另一种是定义函数,并调用函数名,默认序列内各个元素传入规则函数。
#第一种filter(lambdax:x%2,range(1,10))#第二种defis_odd(n):returnn%2filter(is_odd,range(1,10))
用list()转化成列表形式,结果都为:[1,3,5,7,9]。利用高阶函数filter能实现多种过滤,可以用于删除序列中数字、空格、None值等操作。
Map函数map函数会根据提供的函数对指定序列做映射,返回一个新的迭代器,同样的,可以用list()查看迭代器的具体内容。该函数同样需要传入两个参数,第一个是映射规则(函数),第二个是待映射的序列(迭代器,可以是一个或多个,map函数不改变原传入的迭代器)。默认的,会将序列的每个元素作为参数传递给映射规则进行处理。
购买专栏解锁剩余24%