循环中的Python Print语句,生成素数

时间:2011-11-08 09:54:54

标签: python

在哪里可以打印一个print语句来打印最终列表但仍保留返回,有什么方法可以考虑改进这个功能。我写了这个函数,但我不确定它的相对质量

def buildPrimeList ():

    primeList = [1, 2]
    possiblePrime = 3
    print "To display all prime values less than or equal a number..."
    x = raw_input("Enter a number higher then 3   ")
    while (possiblePrime <= x):  
        divisor = 2
        isPrime = True

    while (divisor < possiblePrime and isPrime):
        if (possiblePrime % divisor == 0):
            isPrime = False
        divisor = divisor + 1

    if (isPrime):
        primeList.append(possiblePrime)

    possiblePrime = possiblePrime + 2

  return primeList


buildPrimeList() 

3 个答案:

答案 0 :(得分:2)

打印函数的结果非常简单:

print buildPrimeList()

另外我注意到你没有将raw_input的结果(字符串)转换为int:

x = int(raw_input("Enter a number higher then 3   "))

在python中执行相同操作的另一种方法可能如下:

from itertools import count

def is_prime(n):
    """Checks if given number 
    n is prime or not."""

    for i in xrange(2, n/2):
        if n % i == 0:
            return False
    else:
        return True

def prime_numbers():    
    """Generator function which lazily
    yields prime numbers one by one."""

    for i in count(1):
        if is_prime(i):
            yield i

if __name__ == '__main__':

    maxprime = int(raw_input("Enter a number:"))

    for prime in prime_numbers():
        if prime < maxprime:
            print prime
        else:
            break

使用了许多python习语和语言功能:

  • 生成器函数和迭代器[1];
  • snake_case_method_naming [2];
  • docstrings [3];
  • if __name__ == '__main__': ... [4]。

[1] http://www.ibm.com/developerworks/library/l-pycon/index.html

[2] PEP 8: Style Guide for Python Code

[3] http://www.learningpython.com/2010/01/08/introducing-docstrings/

[4] What does if __name__ == "__main__": do?


p.s。正如果冻和rpInt在他们的回答和评论中指出的那样,有很多方法可以加快速度。但很可能你不应该这样做(除非你绝对必须),因为“简单比复杂更好”[5]。

[5] PEP 20: The Zen of Python

答案 1 :(得分:1)

您可以在返回之前立即print列表。

考虑到算法的效率,请考虑sieve of erathostenes

答案 2 :(得分:0)

只需取每个第二个数字并除以它,就可以大大提高功能。 首先,1不是素数,你不应该以这种方式使用它。其原因是素数因子分解,对于每个数字都是唯一的,例如9 = 3 * 3。如果你要在素数池中加1,9 = 3 * 3,9 = 3 * 3 * 1,9 = 3 * 3 * 1 * 1,每一个都是有效的素数因子分解,但它不再是唯一的每个号码。 其次,您不必检查每个自然数的数字。如果你考虑自然数,它们中的每一个都是偶数且可以除以2.因此,如果一个数可以除以4,则每个定义可以除以2.你可以减少你必须做的计算量。如果您使用此属性,则系数为2。此外,您似乎使用了一种名为“Erastothenes的筛子”http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes的技术,它只是向池中添加素数,并检查下一个自然数是否可以被任何一个除数。你可以轻松地利用它。

def buildPrimeList ():
    #One is not really a prime, so we cut it out.
    primeList = [2]
    possiblePrime = 3
    print "To display all prime values less than or equal a number..."
    upperlimit = raw_input("Enter a number higher then 3   ")
    try:
        upperlimit = int(upperlimit)
    except:
        print "Sorry. You didn't enter a number."
        return
    while (possiblePrime <= upperlimit):  
        #lets check if the possible prime is divisable by any prime we already know.
        isPrime = True
        for prime in primeList:
            if(possiblePrime % prime == 0):
                #we can abort the check here, since we know already that this number can't be a prime
                isPrime = False
                break

        if (isPrime):
            primeList.append(possiblePrime)

        possiblePrime = possiblePrime + 2

    return primeList


print buildPrimeList() 

这应该按预期工作。