myList = [4, 4, 9, 12]
if not any(isPrime(x) for x in myList):
print("The list did not contain a prime")
Python posiada również all()
który korby za pomocą dowolnej sekwencji i zwraca True
jeśli wszystkie elementy ocenić prawdziwe.
any()
i all()
mają zarówno ocenę zwarciem: jeśli any()
znajdzie żadnego elementu, który ocenia prawdziwe, to zatrzymuje się i wraca True
; i jeśli all()
znajdzie dowolny element, który ocenia fałsz, zatrzymuje się i zwraca False
.
Obie są "leniwe", ponieważ używają iteracji Pythona do ciągnięcia wartości po jednej na raz. Np
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))
Będzie iteracji, aż zostanie znaleziony numer niż pierwsza, a następnie powrót False
. Drukuje liczby jako efekt uboczny, dzięki czemu można oglądać, jak działa. Właśnie próbowałem tego i dostałem:
17
3
0
P.S. Poszedłem na wykład na konferencji w Pythonie, a mówca wspomniał, że często używa any()
jako bardzo skutecznego sposobu na zrobienie pętli. Pętla for
ponownie wiąże pętlę zmiennej dla każdej pętli, ale nie robi tego; po prostu sprawdza wartości. Więc jeśli użyjesz any()
z funkcją, która zawsze zwraca None
lub fałszywą wartość, iteruje ona swoją drogę do końca sekwencji, i zgodnie z tym facetem, jest to najszybszy sposób w Pythonie, aby to zrobić. (A jeśli twoja funkcja zwraca wartość, która nie jest None
i nie jest fałszywa, możesz użyć all()
dla tej samej sztuczki.) Jedynym czasem, w którym to nie działa, jest to, że czasami funkcja zwraca wartość true, a czasami zwraca wartość false . wartość Ale można go zmusić, aby zawsze działa:
any(my_function(x) and False for x in sequence)
PPS Użyjmy all()
przepisać isPrime()
będę zmienić nazwę na is_prime()
celu dostosowania do 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))
! Ty prawdopodobnie chcę sprawdzić, czy 'element == 2' przed' elementem% 2 == 0'; ta ostatnia jest zawsze prawdziwa, gdy pierwsza jest prawdziwa. – icktoofay
Dzięki, poprawiłem to. Jest to jednak tylko przykład do stworzenia scenariusza, w którym można by go wykorzystać. –