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))
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
Danke, ich habe es korrigiert. Aber das ist nur ein Beispiel, um ein Szenario zu erstellen, in dem es verwendet werden könnte. –