在python中的Prime生成器

时间:2015-12-01 14:38:48

标签: python python-3.x

我正在编写一个素数生成器,与此链接中的任何人不同

generator in Python generating prime numbers

这是我的代码

  @SuppressWarnings("unused")
  public static void main(String[] args) throws Exception {
    BufferedReader br = new BufferedReader(new FileReader("NewStripped.txt"));
    PrintWriter pw = new PrintWriter(new FileWriter("FinalStripped.txt"));
    String line; 
    int count = 0;
    try{
      while ((line = br.readLine()) != null) {
        count++;
        if (line != null){
          line = line.replaceAll("\\{", "\t{");
        } else if(line.contains("}")) {
          line = line.replaceAll("}","\t}");
        }                                       
        pw.println(line);
        System.out.println(line);
      }
      pw.close();
    } catch(Exception e) {
      e.printStackTrace();          
    }
  }
}

当我运行

之类的东西时
def sequence():
    i = 1 
    while True:
        i += 2
        yield i

def prime_generator(n):
    i = 2
   it = sequence()
    while i < n:
        it= filter(lambda x: x % i, it)
        i = next(it)
        yield i

它永远不会像我那样倾倒15,33 ......总之,它给了我2个和所有奇数。这里出了什么问题?

1 个答案:

答案 0 :(得分:3)

问题是lambda中的i不是“固定的”;当i在外部范围内发生变化时,先前创建的lambda函数都使用新值,因此它们都进行相同的检查:查看sequence()的当前值是否可被最后找到的素数整除。他们从未如此。

将其包装到另一个lambda然后调用它以便i的值可以修复起作用:

def prime_generator(n):
    i = 2
    it = sequence()
    while i < n:
        it = (lambda i: filter(lambda x: x % i, it))(i)
        i = next(it)
        yield i

编辑:我也不相信你的代码(也不是这个)确实产生了2,但这可以简单地解决。