@Hghgh Bothwell, @mortehu और @glglgl द्वारा जवाब के बारे में।
परीक्षण के लिए डेटासेट सेट करें
import random
dataset = [random.randint(0,15) if random.random() > .6 else None for i in range(1000)]
कार्यान्वयन को परिभाषित करें
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)
परीक्षण कार्य करें
def test_func(dataset, func):
default = 1
for i in dataset:
func(i, default)
Python 2.7 का उपयोग करके मैक i7 @ 2.7Ghz पर परिणाम
>>> %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
स्पष्ट रूप से not_none
फ़ंक्शन ओपी के प्रश्न का सही उत्तर देता है और "झूठी" समस्या को संभालता है। यह पढ़ने में सबसे तेज और आसान भी है। यदि कई स्थानों पर तर्क को लागू करते हैं, तो यह स्पष्ट रूप से जाने का सबसे अच्छा तरीका है।
यदि आपको कोई समस्या है जहाँ आप 1 गैर-अशक्त मान को एक पुनरावृत्त में ढूंढना चाहते हैं, तो @ mortehu की प्रतिक्रिया जाने का मार्ग है। लेकिन यह ओपी की तुलना में एक अलग समस्या का समाधान है , हालांकि यह आंशिक रूप से उस मामले को संभाल सकता है। यह एक iterable और एक डिफ़ॉल्ट मान नहीं ले सकता। अंतिम तर्क होगा डिफ़ॉल्ट मान लौटा, लेकिन तब आप उस स्थिति में एक पुनरावृत्ति में पास नहीं होंगे और साथ ही यह स्पष्ट नहीं होगा कि अंतिम तर्क मान के लिए डिफ़ॉल्ट है।
फिर आप नीचे कर सकते हैं, लेकिन मैं अभी भी not_null
एकल मूल्य उपयोग मामले के लिए उपयोग करूंगा ।
def coalesce(*args, **kwargs):
default = kwargs.get('default')
return next((a for a in arg if a is not None), default)
??
ऑपरेटर के रूप में प्रस्तावित किया गया है पीईपी 505 ।