あなたはほとんどあなたの現在のコードに固執するが、詳細を向上させたい場合は:
- 使用
for i in range(3, ...
あなたはプライムペアが1または2で始めることはできませんことを知っているので、次に、あなたがその意志のでif i <= 2...
を削除することができます決して起きない。
is_prime_pair
関数は2つの数値の素数を同時にテストすることを難しくします。むしろ、is_prime
関数を使用して単一の数値をテストし、is_prime(i) and is_prime(i+2)
を呼び出します。
x
がmax_div
よりも大きくない場合は、i
とi2
より小さくなるので、or x == i or x == i2
を削除することは明らかです。ところで、if (x > max_div or x == i or x == i2):
には余分な括弧は必要ありません:if x > max_div or x == i or x == i2:
が有効です。
x == max_div
の場合は、max_div
がx
の平方根より大きいため、break
が既に存在します。
**
は+
よりも優先されますので、max_div = i2 ** 0.5 + 1
に簡略化してください。
だから今我々が持っている:
def is_prime(i):
max_div = i ** 0.5 + 1
for x in k:
if x >= max_div:
break
...
をこれは物事の愚かな方法です:ちょうどmax_div
が上限である範囲を反復処理!範囲機能で使用できるようにmax_div
をint
に変換するだけです。 i
が完璧な広場であるかどうか、そしてオフ・バイ・ワン・エラーがないかどうか、これが正しいことを自分自身に説得してください。その後、我々は持っている:
def is_prime(i):
max_div = int(i ** 0.5 + 1)
return not any(i % x == 0 for x in range(3, max_div, 2))
(私はあなたがそれに慣れていない場合にはgenerator expressionを使用しました)
:
def is_prime(i):
max_div = int(i ** 0.5 + 1)
for x in range(3, max_div, 2):
if i % x == 0:
return False
return True
これはPythonで便利なリファクタリングすることができます一般的なパターンです
2つのトリックで、より簡潔にすることはできますが、読みにくくなる可能性があります。最初のインラインmax_div
は1度しか使用されていないためです。代わりにany
のその後、あなたはall
を使用して、ブール値としてint型を扱うことができます。
def is_prime(i):
return all(i % x for x in range(3, int(i ** 0.5 + 1), 2))
ここでは、したがって、(すべてのx
ためx
で割ったときに、それはいくつかの非ゼロの残りを離れた場合の数が素数であることを言っていますall
関数)をチェックする価値があります。これは、Python 0
がFalse
のようなもので、他のすべての数字がTrue
のようになっているために機能します。
私の他の答えで述べたように、手動でペアをフォーマットする必要はありません。
print
をステートメントとして使用していたので、あなたのタグの言うとおり、3ではなくPython 2を使用する必要があります。この場合、range
のすべてのインスタンスを効率のためにxrange
に置き換えてください。
だから最後にそれだけだ:
n = 100 # upper limit number
def is_prime(i):
return all(i % x for x in xrange(3, int(i ** 0.5 + 1), 2))
for i in xrange(3, n + 1, 2):
if is_prime(i) and is_prime(i + 2):
print (i, i + 2)
私は、これはおそらくちょうどn = 100
のために表示されませんが、私の他の答えは、より高速であることを確信していますが。最も目障りな問題は、i
が素数である場合は、is_prime(i + 2)
が呼び出され、ループの次の反復でis_prime(i)
がちょうど計算されたように冗長になることです。これを改善するには、is_prime
をセットでメモしてください。
**と**はどちらも短くなっていますか?それは短くても、遅くすることはできますか?より速くても長くてもかまいませんか? –
変数 'k'は一度しか使われないので、' for'ループで定義された範囲だけで置き換えることができます。また、 'break'は' return true'や 'return 1'に完全に置き換えられます。最適化のために – StardustGogeta
を使用すると、http://codereview.stackexchange.comで運が良い(または少なくともdownvotesが少なくなる)でしょう。 –