2011-11-08 103 views
0

我可以在哪裏放置打印語句來打印最終列表,但仍然保留返回值,並且有任何方法可以改進此功能。我寫了函數,但不確定其相對質量Python循環中打印語句,生成素數

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() 

回答

1

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

至於算法的效率,請考慮sieve of erathostenes

+0

寫起來更容易,可能只是檢查一個數字是否可以被任何較低的已經找到的素數整除。如果不是,這是一個主要原因。 (例如:3不能被2整除 - >是素數,15可以被3整除,停止; 17不能被2,3,5,7,11,13 - >整除)。我們可能會忽略那些高於我們測試數量的一半,但我不確定這會對速度產生什麼影響。 – rplnt

+2

更確切地說:在尋找除數時,我們可以停止在我們測試的數字的根部,而不是數字的一半。爲什麼你評論我的答案,而不是原來的問題,順便說一句? :) –

+0

他問的是印刷品,而不是實施,所以我不想將它作爲答覆發佈。和平方根好的呼叫。實施和結果:https://gist.github.com/1347474 – rplnt

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 

許多蟒成語和語言功能的使用:

  • 發生器函數和迭代器[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.正如jellybean和rpInt在他們的回答和評論中指出的,有很多方法可以加快速度。但很可能你不應該那樣做(除非你絕對必須),因爲「簡單勝於複雜」[5]。

[5] PEP 20: The Zen of Python

0

你可以只是把每2號和它劃分大大提高了功能。 首先,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() 

這應該按預期工作。