@ হুগ বোথওয়েল, @ মরতেহু এবং @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)
পাইথন 2.7 ব্যবহার করে ম্যাক আই 7 @ 2.7Ghz এ ফলাফল z
>>> %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 ম নন-নাল মানটি খুঁজে পেতে চান তবে @ মর্তেহুর প্রতিক্রিয়া হ'ল উপায়। তবে এটি ওপির চেয়ে আলাদা সমস্যার সমাধান , যদিও এটি কেসটি আংশিকভাবে পরিচালনা করতে পারে। এটি পুনরাবৃত্তযোগ্য এবং একটি ডিফল্ট মান নিতে পারে না। শেষ আর্গুমেন্টটি ডিফল্ট মান হিসাবে প্রত্যাবর্তিত হবে, তবে তারপরে আপনি সেই ক্ষেত্রে কোনও পুনরাবৃত্তির সাথে পাশ করবেন না পাশাপাশি এটি স্পষ্ট নয় যে শেষ যুক্তিটি মানের জন্য একটি ডিফল্ট।
তারপরে আপনি নীচে করতে পারেন তবে আমি এখনও not_null
একক মান ব্যবহারের ক্ষেত্রে ব্যবহার করব।
def coalesce(*args, **kwargs):
default = kwargs.get('default')
return next((a for a in arg if a is not None), default)
??
অপারেটর হিসাবে প্রস্তাব করা হয় PEP 505 ।