filter是python内建的过滤函数
filter把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素
filter()函数返回的是一个Iterator(迭代器),也就是一个惰性序列,需要通过next()使filter()返回以一个值,或者通过for循环或list()强制filter完成计算
创建main函数
因为prime()函数是一个无限的序列,所以需要设置一个跳出循环 的条件,
prime()是一个Iterator,是惰性序列,需要for循环不断的调用next()
def main():
for n in prime():
if(n<10):
print(n)
else:
break
创建prime函数
第一个数2肯定为素数,所以可以率先筛选掉序列中2的倍数()do_iter()),do_iter()函数为Iterator,需要不断地调用next()使do_iter返回下一个值,使用filter调用yes_not()函数筛选序列
为什么不直接使用匿名函数
因为filter生成的是惰性数列,也就是说它其实只是将一个规则存储下来,并不是立即计算出结果存储的。当filter后使用lambda函数,lambda x:x%n>0,n的值在每次循环中都会被迭代成新的,这时候filter只会存储最后的n值……比如你让最后的n等于999,那所有在之前的do_iter里生成的数除以999的余数当然都是大于0的……那最后你就是打印出了所有的奇数’
def prime():
yield 2
it=do_iter()
while True:
n=next(it)
yield n
it=filter(yes_not(n),it)
创建do_iter函数
do_iter函数直接去掉了序列中2的倍数
def do_iter():
n=1
while True:
n=n+2
yield n
创建yes_not函数
筛选x是否为n的倍数,返回True和False以供filter函数筛选## 标题
def yes_not(n):
return lambda x:x%n>0