【问题标题】:Prime Sieve algorithm in Python : Help ExplainingPython中的Prime Sieve算法:帮助解释
【发布时间】:2017-12-01 20:28:18
【问题描述】:

我使用我模糊理解的枚举函数遇到了这个素数筛,我理解代码背后的一般思想,即将“真”列表中的所有非素数值变为“假”,然后从创建一个主要列表。但我不确定如何解释第 5 行之后的代码,is_prime 是函数还是变量?我有点困惑

def prime_sieve(n):
    sieve = [True] * n #Generates a list of 'True' of length n
    sieve[:2] = [False, False]  #  0 and 1 are not primes
    primes = []
    for prime, is_prime in enumerate(sieve): 
        if not is_prime:
            continue
        primes.append(prime)
        for not_prime in range(prime*prime, n, prime):
            sieve[not_prime] = False 
    return primes, sieve

【问题讨论】:

  • emumerate 返回 (index, item) 的元组,所以 is_prime 只是索引 prime 处的项目值,即它是 TrueFalse 取决于它是素数还是不是。
  • "is_prime 是函数还是变量?"函数就像任何其他对象一样,并且被分配给变量,所以我不确定你的意思,但它一个变量,一个不会发生的变量引用一个函数。

标签: python python-3.x primes enumerate sieve


【解决方案1】:
def prime_sieve(n):
    sieve = [True] * n #Generates a list of 'True' of length n
    sieve[:2] = [False, False]  #  0 and 1 are not primes
    primes = []

声明函数,设置变量。 Sieve 是一个布尔值列表,用于表示给定索引的编号是否为素数。 Primes 设置为迄今为止找到的一个空的素数列表。

    for prime, is_prime in enumerate(sieve): 

遍历所有数字及其对应的布尔值的枚举列表。枚举就像遍历一个列表,但也有所有列表变量的索引。由于 enumerate 为每个列表元素提供了两个变量,因此您需要使用两个变量来解包它。 'prime' 将是一个数字,即被访问的列表元素的索引,而 'is_prime' 是该索引处的布尔值。

        if not is_prime:
            continue

如果一个数字以前被声明为“非素数”,则跳过它。

primes.append(prime)

如果没有,请将其添加到已找到的素数列表中。

        for not_prime in range(prime*prime, n, prime):
            sieve[not_prime] = False 

从素数的平方开始到最后,所有能被素数整除的数都设为False

 return primes, sieve

返回所有素数的列表,以及筛子中所有数字的布尔列表。

【讨论】:

    【解决方案2】:

    试试这个:

    sieve = [True,True,True]
    for x,y in enumerate(sieve):
       print(x,y)
    

    你现在明白了吗?

    【讨论】:

      【解决方案3】:

      如果is_prime 是一个函数,那么它就不是False,所以not is_prime 总是返回False,不管is_prime 是什么。请注意,函数和函数返回之间是有区别的;如果is_prime 是一个函数,那么is_prime() 将是is_prime() 返回的内容,可能是False,但is_prime 将是函数对象本身,而不是False。函数可以返回False,但不能返回False

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-11
        相关资源
        最近更新 更多