python 通过filter和生成器可以过滤出‘素数’

这里的原理是通过“埃氏筛法”过滤

#先定义个大于1的无限奇数列表:

#!/usr/bin/python3.5

# -*- coding=utf-8 -*-

def odd_num():

    n=1

    while True:

        n = n + 1

        yield n

#定义个过滤器:

def _Filter(n):

    return lambda x:x%n>0

# 素数过滤主函数

def primes():

    yield 2        #把特殊素数 2打印出来

    it=odd_num()  #一个除了1外的所有奇数(生成器)

    while True:

        n=next(it)     #这里是非常巧妙的用法,根据 "埃氏过滤" ,列表的第一个数一定是“素数",第一次循环为3

        yield n        #把’列表‘第一个数打印出来,因为埃氏规则,列表第一个数肯定是素数

        it=filter(_Filter(n),it) #  _Filter(n) 函数是一个二层嵌套函数,只不过第二层为一个lambda匿名函数,当生成器的第一个数3被打印出后,3作为参数传递给了_Filter 函数,

#如果把匿名函数写成等同的正常函数,那个么_Filter函数可以写成如下:

_Fiter(n):

    f1(x):

        return x%n>0

    return f1

所以3传递过来后,就变成了

f1(x):

    return x%3>0

这个函数和生成器对象it 一块传递给了 过滤函数filter(),filter 函数会作把函数f1作用于后面it 生成器上,把it生成器能被3整除的数全部过滤掉,结果重新复制给 it

再次循环的时候,it生成器的经过3的过滤后,剩下第一个数为5(符合埃氏规则,为素数),通过yield n 打印出 5,然后过滤函数变成了

f1(x):

    return x%5>0

通过 filter函数通过f1再次对经过3过滤后的生成器it过滤一次。然后把过滤后的结果再次赋值给it,此时it第一数值变成了7,打印出来,反复循环,打印出所有的素数,这个是无限的,通过条件判断取有限的个数。


请注意,这几个高阶函数只有filter可以作用于生成器,其他几个都不行



请先 登录 后评论
  • 0 关注
  • 0 收藏,505 浏览
  • 石天 提出于 2016-11-28 22:39

相似问题