@Hugh Bothwell, @mortehu ve @glglgl tarafından verilen yanıtlar.
Test için Veri Kümesini Ayarla
import random
dataset = [random.randint(0,15) if random.random() > .6 else None for i in range(1000)]
Uygulamaları tanımlayı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)
Test fonksiyonu yap
def test_func(dataset, func):
default = 1
for i in dataset:
func(i, default)
Python 2.7 kullanarak mac i7 @ 2.7Ghz sonuçları
>>> %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
Açıkçası not_none
İşlev OP'nin sorusuna doğru cevap verir ve "yanlış" sorununu çözer. Ayrıca okunması en hızlı ve en kolay olanıdır. Mantığı birçok yerde uyguluyorsanız, gitmek için en iyi yoldur.
Eğer bir yinelemesiz 1. null olmayan değeri bulmak istediğiniz bir sorun varsa, o zaman @ mortehu yanıt yoludur. Ancak bu durumu kısmen ele alabilse de, OP'den farklı bir soruna bir çözümdür . Yinelenebilir VE varsayılan bir değer alamaz. Son argüman döndürülen varsayılan değer olacaktır, ancak o zaman bu durumda bir yinelemeyi geçemezsiniz ve son argümanın varsayılan bir değer olduğu açık değildir.
Daha sonra aşağı yapabilirsin, ama yine not_null
de tek değer kullanım durumu için kullanırım.
def coalesce(*args, **kwargs):
default = kwargs.get('default')
return next((a for a in arg if a is not None), default)
??
Operatör olarak önerilmiştir PEP 505 .