2011-11-08 10 views
0

最終的なリストを印刷するにはprintステートメントを置くことができますが、この関数を改善する方法はありますか?私は、関数を書いたが、その相対的な品質素数を生成するループ内の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() 

答えて

1

へとあなたはそれを返す前に、すぐにリストをprintできわかりませんよ。

アルゴリズムの有効性については、sieve of erathostenesと考えてください。

+0

書くのが簡単なのは、数字が低い、すでに見つかった素数のいずれかで割り切れるかどうかをチェックすることだけかもしれません。そうでなければ、それは素数です。 (例えば、3は2で割り切れない - >素数、15は3で割り切れる、ストップ; 17は2,3,5,7,11,13で割り切れない - >素数)。おそらく私たちがテストしている数の半分以上は無視することができますが、それがスピードに何をもたらすのかは分かりません。 – rplnt

+2

もっと正確に:除数を探すときは、テストする数字の_root_で止めることができます。数字の半分ではありません。なぜあなたは私の答えではなく、元の質問ではなく、btwでコメントしていますか? :) –

+0

彼はプリントについて尋ねていました。実装についてではなく、私はそれをanswerdとして投稿したくありませんでした。そして、平方根の良い呼び出し。実装と結果:https://gist.github.com/1347474 – rplnt

2

これは、関数の結果を印刷するには、かなりストレートフォワードです:

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

また
print buildPrimeList() 

私はあなたがintに(文字列です)raw_inputの結果を変換していないことに気付きました

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 
01:

pythonで同じことを行う別の方法は、次のようになります

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

0

をあなただけのすべての第二の数を取り、それで割ることによって、大幅に機能を向上させることができます。 まず、1は素数ではありません。そのように使用しないでください。この理由は、9 = 3 * 3のように、すべての数値に固有の素因数分解です。プライムプールに1を加えると、9 = 3 * 3,9 = 3 * 3 * 1、9 = 3 * 3 * 1 * 1となり、すべてが有効な素因数分解ですが、それはもはやユニークではありませんすべての番号。 第2に、自然数で番号を確認する必要はありません。自然数について考えると、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() 

これは期待どおりに動作するはずです。

関連する問題