Về câu trả lời của @Hugh Bothwell, @mortehu và @glglgl.
Cài đặt bộ dữ liệu để thử nghiệm
import random
dataset = [random.randint(0,15) if random.random() > .6 else None for i in range(1000)]
Xác định việc thực hiện
def not_none(x, y=None):
if x is None:
return y
return x
def coalesce1(*arg):
return reduce(lambda x, y: x if x is not None else y, arg)
def coalesce2(*args):
return next((i for i in args if i is not None), None)
Thực hiện chức năng kiểm tra
def test_func(dataset, func):
default = 1
for i in dataset:
func(i, default)
Kết quả trên mac i7 @ 2.7Ghz bằng python 2.7
>>> %timeit test_func(dataset, not_none)
1000 loops, best of 3: 224 µs per loop
>>> %timeit test_func(dataset, coalesce1)
1000 loops, best of 3: 471 µs per loop
>>> %timeit test_func(dataset, coalesce2)
1000 loops, best of 3: 782 µs per loop
Rõ ràng not_none
chức năng trả lời chính xác câu hỏi của OP và xử lý vấn đề "giả mạo". Nó cũng là nhanh nhất và dễ đọc nhất. Nếu áp dụng logic ở nhiều nơi, rõ ràng đó là cách tốt nhất để đi.
Nếu bạn gặp vấn đề trong đó bạn muốn tìm giá trị không null đầu tiên trong một lần lặp, thì phản hồi của @ mortehu là cách tốt nhất. Nhưng nó là một giải pháp cho một vấn đề khác với OP, mặc dù nó có thể xử lý một phần trường hợp đó. Nó không thể lấy một giá trị lặp và VÀ mặc định. Đối số cuối cùng sẽ là giá trị mặc định được trả về, nhưng sau đó bạn sẽ không chuyển qua một lần lặp trong trường hợp đó cũng như không rõ ràng rằng đối số cuối cùng là giá trị mặc định.
Sau đó, bạn có thể làm bên dưới, nhưng tôi vẫn sử dụng not_null
cho trường hợp sử dụng giá trị đơn.
def coalesce(*args, **kwargs):
default = kwargs.get('default')
return next((a for a in arg if a is not None), default)
??
nhà điều hành được đề xuất như PEP 505 .