本篇文章主要是对一行代码求素数的思路解析,分别解释了map()函数、filter()函数和all()函数 的使用方法,并具体分析了该行代码的求解思路,最后,又用一些实际例子说明了一下all函数。
目录
-
代码如下:
list(filter(lambda x:all(map(lambda p:x % p != 0,range(2,x))),range(2,20)))
-
关于里面用到的函数的解释:
- map(func,*iterables):map函数接收两个参数,一个是函数func,一个是可迭代对象iterables,map将传入的函数func用于传入的可迭代对象上,返回的结果是一个迭代器。
- filter(func,iterable):filter函数也是接收两个参数,一个是函数func,一个是可迭代序列。filter将函数作用于可迭代序列,只不过返回值是根据func运行的结果是True还是False选择保留该元素。
- all()判断是否全为True,是则返回True,不是则返回False;其中,0、False、None、空均为False。
-
这行代码的思路解析:
-
对于这行代码来说,x由range(2,20)提供,p由range(2,x)提供;
-
先是lambda p:x % p != 0依次作用于range(2,x)上,当一个x,对range(2,x)中的数依次进行求余,由map()函数,可得一个元素为True或者False组成的可迭代序列。
-
再用all()函数对这个元素为True或者False组成的可迭代序列进行判断,如果all()函数返回True,说明序列内的元素全为True,也就是说,x对range(2,x)求余全部不为0,那么x即为一个素数;否则,all()函数返回False,说明序列内含有False,也就是,x可以被range(2,x)中的数整除,那么,x就不是素数。
-
最后,filter()函数,依次返回all()为True对应的x值。可以获得一个素数序列。
-
最后,关于all()进一步解释
all(map(lambda p:5 % p != 0,range(2,5))) # 返回ture,说明5是质数
# all判断可迭代对象中的所有元素是否都为真,是则返回True;否则,返回False;
# 0,None,False,空都算是false;
all(map(lambda p:4 % p != 0,range(2,4))) #返回False,说明4不是质数
list(map(lambda p:4 % p != 0,range(2,4)))
# map返回[False, True],因此用all会返回False;
# map是将函数依次作用于序列上
# filter将函数依次作用于序列上,值为True的则返