我正在编写一个素数生成器,与此链接中的任何人不同
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个和所有奇数。这里出了什么问题?
答案 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,但这可以简单地解决。