myList = [4, 4, 9, 12]
if not any(isPrime(x) for x in myList):
print("The list did not contain a prime")
Pythonにはall()
、任意のシーケンスをクランクしてTrue
、すべての要素がtrueと評価された場合に返されるものもあります。
any()
両方ともall()
短絡評価any()
があります。trueと評価される要素が見つかった場合、それは停止して戻りますTrue
。all()
また、 falseと評価される要素が見つかった場合は、停止してを返しますFalse
。
どちらも、Pythonの反復を使用して一度に1つずつ値をプルするという点で、「怠惰」です。例えば:
import random
def rand_sequence(n_max):
while True:
next_random = random.randint(0, n_max)
print(next_random)
yield next_random
all(isPrime(x) for x in rand_sequence(20))
これは、素数以外の番号が見つかるまで繰り返され、その後、を返しFalse
ます。それはあなたがそれが働くのを見ることができるように副作用として数字を印刷します。私はこれを試してみました:
17
3
0
PS私はPythonカンファレンスで講演に行きました、そしてスピーカーは彼any()
がループをするための非常に効率的な方法として一般的に使用していると言いました。ループは、for
ループごとにループ変数を再バインドしますが、それany()
は行いません。値をチェックし続けるだけです。したがってany()
、常にまたはfalse値を返す関数を使用するとNone
、シーケンスの最後まで反復処理されます。その人によると、Pythonでこれを実行するのが最速の方法です。(そして、関数がNone
falseでない値を返す場合all()
は、同じトリックに使用できます。関数がtrue値を返す場合と、false値を返す場合があります。これが機能しない場合のみです。ただし、常に機能するように強制することはできます。
any(my_function(x) and False for x in sequence)
all()
PPSを使って書き直しましょうisPrime()
!is_prime()
PEP 8に準拠するように 名前を変更します。http://www.python.org/dev/peps/pep-0008/
def is_prime(element):
""" just a helper function! don't get religious about it! """
if element == 2:
return True
elif element <= 1 or element % 2 == 0:
return False
else:
return all(element % i for i in xrange(3, element, 2))