8

私は最近、Pythonの次の例を作成しました... else:

def isPrime(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:
        for i in xrange(3, element, 2):
            print i
            if element % i == 0:
                return False
    return True


myList = [4, 4, 9, 12]

for element in myList:
    if isPrime(element):
        break
else:
    print("The list did not contain a prime.")

仲間の学生が私に言った、このタスクは次のようにScalaで実行できる:

List(4, 4, 9, 12) exists isPrime

これは遅延評価されます。

Pythonにはexists-keywordのようなものが存在しますか?それともそのためのPEPはありますか?

4

2 に答える 2

22
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と評価される要素が見つかった場合、それは停止して戻りますTrueall()また、 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でこれを実行するのが最速の方法です。(そして、関数がNonefalseでない値を返す場合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))
于 2012-06-09T06:17:46.810 に答える
-1
[x for x in myList if isPrime(x)]
于 2012-06-09T06:19:23.677 に答える