2012-06-09 22 views
8

Recentemente ho fatto il seguente esempio per Pythons per ... altro:"esiste" parola chiave 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.") 

Uno studente mi ha detto, che questo compito può essere fatto con Scala in questo modo:

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

Quale diventa pigro valutato.

Esiste qualcosa simile alla parola chiave exist in Python? O c'è un PEP per questo?

+3

! Tu probabilmente voglio controllare che 'elemento == 2' prima di' elemento% 2 == 0'; il secondo è sempre vero quando il primo è vero. – icktoofay

+0

Grazie, l'ho corretto. Ma questo è solo un esempio per creare uno scenario in cui potrebbe essere utilizzato. –

risposta

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

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

Python ha anche all() cui manovelle attraverso qualsiasi sequenza e restituisce True se tutti gli elementi valutano vero.

any() e all() entrambi hanno circuit la valutazione: se any() trova alcun elemento che viene valutata vera, si ferma e restituisce True; e se all() trova un elemento che valuta false, si arresta e restituisce False.

Entrambi sono "pigri" in quanto utilizzano l'iterazione di Python per tirare valori uno alla volta. Per esempio:

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

Ciò scorrere finché non viene trovato un numero non-prime, per poi tornare False. Stampa i numeri come un effetto collaterale in modo che tu possa vederlo funzionare. Ho appena provato questo e ottenuto:

17 
3 
0 

P.S. Sono andato a parlare a una conferenza Python, e l'oratore ha detto che usa comunemente any() come un modo molto efficiente per fare un ciclo. Un ciclo for re-associa la variabile di ciclo per ogni ciclo, ma non lo fa any(); continua a controllare i valori. Quindi se usi any() con una funzione che restituisce sempre None o un valore falso, itererà fino alla fine della sequenza, e secondo quel tipo, è il modo più veloce in Python per farlo. (E se la tua funzione restituisce un valore che non è None e non è falso, puoi usare lo all() per lo stesso trucco. L'unica volta che non funziona è se a volte la funzione restituisce un valore vero ea volte restituisce un falso . valore Ma si può costringerlo a lavorare sempre:

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

PPS Usiamo all() di riscrivere isPrime() cambierò il nome al is_prime() di conformarsi alle 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

Non mi sono reso conto che 'any' e' all' sono stati cortocircuitati! Grande. – weronika

+0

Sì, il comportamento di cortocircuito è il grande vantaggio rispetto all'uso di 'reduce()' con un operatore logico AND o logico OR. – steveha

+1

Si noti che mentre entrambi i cortocircuiti, la pigrizia nell'espressione è fornita utilizzando un'espressione generatore. –

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

-1 Non è una valutazione lenta. – jamylak

+2

Questa è solo una lista di comprensione, non un comportamento di corto circuito – shihongzhi