myList = [4, 4, 9, 12]
if not any(isPrime(x) for x in myList):
print("The list did not contain a prime")
Python también tiene all()
que bielas a través de cualquier secuencia y devuelve True
si todos los elementos evalúan verdadero.
any()
y all()
ambos tienen evaluación de cortocircuito: si any()
encuentra cualquier elemento que evalúa verdadero, se detiene y vuelve True
; y si all()
encuentra cualquier elemento que evalúa falso, se detiene y devuelve False
.
Ambos son "flojos" en el sentido de que utilizan la iteración de Python para extraer los valores de uno en uno. Por ejemplo:
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))
Esto se repetirá hasta que se encuentre un número no primo, entonces volver False
. Imprime los números como un efecto secundario para que pueda verlo funcionar. Acabo de probar esto y obtuve:
17
3
0
P.S. Fui a una charla en una conferencia de Python, y el orador mencionó que comúnmente usa any()
como una forma muy eficiente de hacer un ciclo. Un bucle for
vuelve a enlazar la variable de bucle para cada bucle, pero any()
no hace eso; solo sigue comprobando valores. Entonces, si usa any()
con una función que siempre devuelve None
o un valor falso, recorrerá todo el camino hasta el final de la secuencia, y de acuerdo con ese tipo, es la manera más rápida en Python para hacerlo. (Y si su función devuelve un valor que no es None
y no es falso, puede usar all()
para el mismo truco. El único momento en que no funciona es si a veces la función devuelve un valor verdadero y algunas veces devuelve un valor falso . Sin embargo, el valor puede obligarlo a trabajar siempre:
any(my_function(x) and False for x in sequence)
PPS Vamos a usar all()
reescribir isPrime()
voy a cambiar el nombre a is_prime()
para ajustarse a 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))
! Probablemente quiero comprobar que 'elemento == 2' antes' elemento% 2 == 0'; el último es siempre verdadero cuando el primero es verdadero. – icktoofay
Gracias, lo he corregido. Pero eso es solo un ejemplo para hacer un escenario donde podría ser utilizado. –