2012-06-09 22 views
8

que he hecho recientemente el siguiente ejemplo para pitones para ... otra cosa:palabra clave "exists" en 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.") 

Un compañero de estudios me dijo, que esta tarea se puede hacer con la Scala de esta manera:

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

Qué obtiene perezoso evaluado

¿Existe algo similar a la palabra clave exists en Python? ¿O hay un PEP para eso?

+3

! Probablemente quiero comprobar que 'elemento == 2' antes' elemento% 2 == 0'; el último es siempre verdadero cuando el primero es verdadero. – icktoofay

+0

Gracias, lo he corregido. Pero eso es solo un ejemplo para hacer un escenario donde podría ser utilizado. –

Respuesta

21
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)) 
+1

¡No me di cuenta de 'any' y' all' en cortocircuito! Estupendo. – weronika

+0

Sí, el comportamiento de cortocircuito es la gran ventaja sobre el uso de 'reduce()' con un operador AND lógico u OR lógico. – steveha

+1

Tenga en cuenta que, si bien ambos cortocircuitos, la pereza en la expresión se proporciona mediante el uso de una expresión de generador. –

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

-1 Esto no se evalúa perezosamente. – jamylak

+2

Esto es solo una lista de comprensión, no un comportamiento de cortocircuito – shihongzhi