2012-06-09 18 views
8

ja niedawno następujący przykład dla pyton dla ... else:"Istnieje" słowo kluczowe w Pythonie?

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

Kolega uczeń powiedział mi, że to zadanie może być wykonane z Scala tak:

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

Która zostaje leniwo oceniony.

Czy w języku Python występuje coś podobnego do istniejącego słowa kluczowego? A może jest to PEP?

+3

! Ty prawdopodobnie chcę sprawdzić, czy 'element == 2' przed' elementem% 2 == 0'; ta ostatnia jest zawsze prawdziwa, gdy pierwsza jest prawdziwa. – icktoofay

+0

Dzięki, poprawiłem to. Jest to jednak tylko przykład do stworzenia scenariusza, w którym można by go wykorzystać. –

Odpowiedz

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

Nie zdałem sobie sprawy z "żadnych" i "wszystkich" zwartych! Wspaniały. – weronika

+0

Tak, zachowanie zwarciowe jest dużą zaletą w stosunku do używania 'zmniejszenia()' z logicznym operatorem AND lub logicznym OR. – steveha

+1

Należy zauważyć, że podczas obu zwarć lenistwo w wyrażeniu jest dostarczane za pomocą wyrażenia generatora. –

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

-1 To nie jest leniwe oceny. – jamylak

+2

To tylko zrozumienie listy, a nie zachowanie zwarcia – shihongzhi

Powiązane problemy