2013-01-10 31 views
16

Tôi có một danh sách các đối tượng và tôi muốn tìm đối tượng đầu tiên mà phương thức đã cho trả về true cho một số giá trị đầu vào. Đây là tương đối dễ dàng để làm bằng Python:Giá trị mặc định cho phần tử tiếp theo trong trình lặp Python nếu trình vòng lặp trống?

pattern = next(p for p in pattern_list if p.method(input)) 

Tuy nhiên, trong ứng dụng của tôi nó là phổ biến mà không có như vậy pp.method(input) là đúng, và vì vậy đây sẽ nâng cao một ngoại lệ StopIteration. Có một cách thành ngữ để xử lý này mà không cần viết một khối try/catch? Cụ thể, có vẻ như sẽ sạch hơn khi xử lý trường hợp đó với điều kiện là if pattern is not None có điều kiện, vì vậy tôi tự hỏi liệu có cách nào để mở rộng định nghĩa của mình là pattern để cung cấp giá trị None khi trình vòng lặp trống không - hoặc nếu có một cách Pythonic hơn để xử lý vấn đề tổng thể!

Trả lời

29

next chấp nhận giá trị mặc định:

next(...) 
    next(iterator[, default]) 

    Return the next item from the iterator. If default is given and the iterator 
    is exhausted, it is returned instead of raising StopIteration. 

và do đó

>>> print next(i for i in range(10) if i**2 == 9) 
3 
>>> print next(i for i in range(10) if i**2 == 17) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 
>>> print next((i for i in range(10) if i**2 == 17), None) 
None 

Lưu ý rằng bạn phải quấn genexp trong ngoặc thêm vì lý do cú pháp, nếu không:

>>> print next(i for i in range(10) if i**2 == 17, None) 
    File "<stdin>", line 1 
SyntaxError: Generator expression must be parenthesized if not sole argument 
+0

Tốt! Đó là chính xác những gì tôi đã hy vọng tồn tại. Cảm ơn bạn. –

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