Discuss / Python / 教程中filter求素数那个不是很懂

教程中filter求素数那个不是很懂

Topic source

it=filter(_not_divisible(n),it)为什么一定要把filter之后的结果赋值给it才行,另外_not_divisible(n)中的x怎么来的,是来自it吗?我调试了一下代码,发现每次除法都是x不变,n从3开始增加,这是怎么回事啊。关于这个求素数的代码十分不理解,希望有谁理解的能交流下

8uglyboy8

#2 Created at ... [Delete] [Delete and Lock User]

(1)赋值给it,上面的说明已经很清楚了,要不停的取序列的第一个数,进行新的倍数筛选 (2)_not_divisible(n)中的x怎么来的,是来自it吗? 可以这么理解。实际和上面的empty函数没啥区别 m = _not_divisible(n)(x)

He11oBUG

#3 Created at ... [Delete] [Delete and Lock User]

这个过滤的函数,不用lambda应该怎么写。这个x是从哪里来的。 没太理解

def _not_divisible(n):
    return lambda x: x % n > 0

CliuGeek9229

#4 Created at ... [Delete] [Delete and Lock User]

第一次答题,有点小紧张。(我也是刚向大神请教会了之后才来答题的。。。) 首先,我们要知道filter()的两个参数:一个函数和一个序列。我们的这个函数就是处理后面序列的操作。(切记这一点) 所以_not_divisible(n)这个函数作为filter()的第一个参数,它返回的必定是一个函数。 而关于这个筛选函数,我们需要了解关于闭包的相关知识。 在了解完闭包概念之后,我们不难写出_not_divisible()的另一种写法。即:

def _not_divisible(n):
    def _filter(x):
        return x % n > 0
    return _filter

所以很明显,我们的x是什么?这个x就是参数,也就是_not_divisible()充当filter()第一个参数作为处理后边序列的函数的参数,也就是我们的it了。 以上是我的理解,希望对大家有所帮助,有不对的地方也希望大家不吝指教。

调试的时候发现x%n时,当5都被打印出来的时,n还是每次都是从3开始,不知道为啥。CliuGeek9229,你能帮忙解答下疑惑吗

CliuGeek9229

#6 Created at ... [Delete] [Delete and Lock User]

难道不应该是从3开始的吗?感觉你现在还是懵的。it是通过下面这个函数生成的:

def _odd_iter():
    n = 1
    while True:
        n = n + 2
        yield n

所以肯定是从3开始的。 实在搞不懂就自己手动跑一遍程序,应该没问题的,加油!


  • 1

Reply