2012-06-09 31 views
8

Tôi vừa mới làm ví dụ sau đây cho Trăn cho ... else:"tồn tại" từ khóa bằng 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.") 

Một học sinh đồng bào nói với tôi, rằng nhiệm vụ này có thể được thực hiện với Scala như thế này:

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

nào được đánh giá lười biếng.

Có điều gì đó tương tự như từ khóa tồn tại tồn tại trong Python không? Hoặc là có một PEP cho điều đó?

+3

! Bạn có thể muốn kiểm tra 'element == 2' trước' element% 2 == 0'; cái sau luôn đúng khi cái cũ là đúng. – icktoofay

+0

Cảm ơn, tôi đã sửa nó. Nhưng đó chỉ là một ví dụ để tạo ra một kịch bản mà nó có thể được sử dụng. –

Trả lời

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

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

Python cũng có all() mà quây qua bất kỳ chuỗi nào và trả về True nếu tất cả các yếu tố đánh giá đúng.

any()all() cả hai đều có đánh giá ngắn mạch: nếu any() tìm thấy bất kỳ yếu tố nào đánh giá đúng, nó dừng và trả về True; và nếu all() tìm thấy bất kỳ yếu tố nào đánh giá sai, nó sẽ dừng và trả lại False.

Cả hai đều "lười" ở chỗ chúng sử dụng lặp lại Python để kéo từng giá trị một. Ví dụ:

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

Điều này sẽ lặp lại cho đến khi tìm thấy số nguyên tố, sau đó trả lại False. Nó in các con số như là một tác dụng phụ để bạn có thể xem nó hoạt động. Tôi vừa thử điều này và có:

17 
3 
0 

P.S. Tôi đã đi đến một cuộc nói chuyện tại một hội nghị Python, và người nói nói rằng ông thường sử dụng any() như một cách rất hiệu quả để làm một vòng lặp. Một vòng lặp for liên kết lại biến vòng lặp cho mỗi vòng lặp, nhưng any() không làm điều đó; nó chỉ giữ giá trị kiểm tra. Vì vậy, nếu bạn sử dụng any() với hàm luôn trả về None hoặc giá trị sai, nó sẽ lặp lại theo cách của nó đến cuối chuỗi và theo anh chàng đó, đó là cách nhanh nhất trong Python để thực hiện. (Và nếu hàm của bạn trả về một giá trị không phải là None và không sai, bạn có thể sử dụng all() cho cùng một thủ thuật. . giá trị Nhưng bạn có thể buộc nó phải luôn luôn làm việc:

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

PPS Hãy sử dụng all() để viết lại isPrime() tôi sẽ thay đổi tên để is_prime() để phù hợp với 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

Tôi đã không nhận ra 'bất kỳ' và' tất cả' được đoản mạch! Tuyệt quá. – weronika

+0

Có, hành vi ngắn mạch là lợi thế lớn khi sử dụng 'reduce()' với toán tử OR logic hoặc logic. – steveha

+1

Lưu ý rằng trong khi cả hai ngắn mạch, sự lười biếng trong biểu thức được cung cấp bằng cách sử dụng một biểu thức máy phát điện. –

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

-1 Đây không phải là đánh giá lười biếng. – jamylak

+2

Đây chỉ là danh sách hiểu, không phải là hành vi ngắn mạch – shihongzhi

Các vấn đề liên quan