一个很神奇的问题
Topic source虽然还没有完完全全整明白,但大体上知道个大概原因了,问题出在这个n这里,
filter(_not_divisible(n), it)
这样写的时候,因为有函数调用,所以n的值正确的传给了lambda函数,不管是lambda x: x % 3 > 0 还是 lambda x: x % 5 > 0 等都是没问题的,但是
filter(lambda x: x % n > 0, it)
这样写的时候因为没有函数调用,Iterator又是惰性的,所以这里的n在我们定义这个iterator的时候并不会传进去,而是下次调用它的next()函数的时候才会。
首先梳理一下流程,通过debug发现,这个写法是每次调用next()的时候,将当前的数x 和 3~x 之间的数取余来判断,比如现在 _odd_iter() 函数 yield 回来的是9,那么会依次将它和3、5、7取余,如果余数为0则继续调用 _odd_iter()函数 yield下一个数重复前面的操作,反之则说明这个数是素数。
正是因为第二种写法没有调用函数,所以在和前面的数取余的时候它们的n全是相同的,就起不到filter的作用,比如比如现在 _odd_iter() 函数 yield 回来的是9,那么本应是依次将它和3、5、7取余,现在却变成了依次将它和7、7、7取余
哦我现在明白了,因为这里的n其实是同一个n,你写lambda x:x%n>0的话,这里n是变量,一直都是最新的那个n,也就是说filter里出现的函数全是同一个函数。non_d(n)相当于输入了一个n=n0,return了一个函数,这个函数每次都是不同的函数,也就相当于保存了每次循环n的数值。
- 1
新雨沐晨风
生成素数那里
这里的最后一句的 _not_divisible(n) 调用的是
这个函数,但是调用这个不就是等于
这样写吗,但是这样写运行结果是错的,有大佬知道为什么吗