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))
! Tu probabilmente voglio controllare che 'elemento == 2' prima di' elemento% 2 == 0'; il secondo è sempre vero quando il primo è vero. – icktoofay
Grazie, l'ho corretto. Ma questo è solo un esempio per creare uno scenario in cui potrebbe essere utilizzato. –