2012-06-09 5 views
8

Ich habe vor kurzem das folgende Beispiel für Pythons für ... else:"Existiert" Schlüsselwort in Python?

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.") 

Ein Kommilitone hat mir gesagt, dass diese Aufgabe mit Scala wie dies getan werden kann:

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

Welche wird faul bewertet.

Gibt es in Python etwas Ähnliches wie das exist-Schlüsselwort? Oder gibt es eine PEP dafür?

+3

anzupassen ändern! Du wahrscheinlich möchte überprüfen, dass 'element == 2' vor' element% 2 == 0'; Letzteres ist immer wahr, wenn das erstere wahr ist. – icktoofay

+0

Danke, ich habe es korrigiert. Aber das ist nur ein Beispiel, um ein Szenario zu erstellen, in dem es verwendet werden könnte. –

Antwort

21
myList = [4, 4, 9, 12] 

if not any(isPrime(x) for x in myList): 
    print("The list did not contain a prime") 

Python hat auch all(), die durch jede Sequenz Kurbeln und kehrt True wenn alle Elemente wahr ausgewertet.

any() und all() haben beide Kurzschlussauswertung: wenn any() jedes Element findet, true ausgewertet wird, stoppt er und gibt True; und wenn all() ein Element findet, das false auswertet, stoppt es und gibt False zurück.

Beide sind "faul", da sie die Python-Iteration verwenden, um Werte einzeln zu ziehen. Zum Beispiel:

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

Dies wird iteriert, bis ein Nicht-Primzahl gefunden wird, dann False zurück. Es druckt die Zahlen als Nebeneffekt, damit Sie sehen können, wie es funktioniert. Ich habe es gerade versucht und habe:

17 
3 
0 

P.S. Ich ging zu einem Vortrag auf einer Python-Konferenz, und der Sprecher erwähnte, dass er any() häufig als eine sehr effiziente Möglichkeit verwendet, eine Schleife zu machen. Eine for Schleife bindet die Schleifenvariable für jede Schleife neu, aber any() macht das nicht; es überprüft nur die Werte. Also, wenn Sie any() mit einer Funktion verwenden, die immer None oder einen falschen Wert zurückgibt, wird es seinen Weg alle bis zum Ende der Sequenz durchlaufen, und nach diesem Typ ist es der schnellste Weg in Python, es zu tun. (Und wenn Ihre Funktion einen Wert zurückgibt, der nicht None ist und nicht falsch ist, können Sie all() für denselben Trick verwenden. Die einzige Zeit, die es nicht funktioniert, ist, wenn die Funktion manchmal einen wahren Wert zurückgibt und manchmal ein false zurückgibt . Wert Aber man kann es zwingen, immer funktionieren:

any(my_function(x) and False for x in sequence) 

PPS ist all()isPrime() neu zu schreiben verwenden lassen werde ich den Namen is_prime() zu 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)) 
+1

Ich habe nicht bemerkt, dass 'irgendwelche' und' alle' kurzgeschlossen sind! Groß. – weronika

+0

Ja, das Kurzschlussverhalten ist der große Vorteil gegenüber der Verwendung von 'reduce()' mit einem logischen UND- oder logischen OR-Operator. – steveha

+1

Beachten Sie, dass, während beide Kurzschluss, die Faulheit im Ausdruck durch die Verwendung eines Generatorausdrucks bereitgestellt wird. –

-1
[x for x in myList if isPrime(x)] 
+5

-1 Dies ist nicht faul ausgewertet. – jamylak

+2

Dies ist nur ein Listenverständnis, kein Kurzschlussverhalten – shihongzhi

Verwandte Themen