# None আচ্ছা আমরা তো জানি কোন ভ্যারিয়েবলে ডাটা ষ্টোর করা যায়। অথবা সেখানে ফাকা ভ্যালু রাখা যায় যেমন ফাকা স্ট্রিং। কিন্তু যদি এমন কোন ভ্যারিয়েবল নেই যার আসলে কোন ভ্যালুই নাই সেটা কিভাবে ইনিসিয়ালাইজ করা যেতে পারে? `None` হচ্ছে `NoneType` এর একটি অবজেক্ট যা দিয়ে আসলে ভ্যালুর অনুপস্থিতি নির্ধারণ করে দেয়া যায়। যদি নিচের লাইনের আউটপুট দেখি - ```python type(None) ``` তাহলে আসবে, ```python ``` অন্যান্য ডাটা টাইপের যেমন একাধিক ভ্যালু থাকে পারে যেমন - bool টাইপের দুটো ভ্যালু হতে পারে; True অথবা False. `NoneType` এর একটাই ভ্যালু আর সেটা হল এই `None`. `None` মানে `False` না। আবার এর মানে `0`, `""`, `[]` এসবও না। নিচের তুলনা এবং আউটপুট গুলো দেখি - ```python >>> None == False False >>> None == "" False >>> None == [] False >>> None == 0 False >>> None == None True >>> a = None >>> a == None True >>> print(a) None ``` যখন কোন ফাংশন নির্দিষ্ট করে কোন কিছু রিটার্ন করে না তখন বস্তুত সে `None` রিটার্ন করে। এরকম একটা ফাংশনের রিটার্ন চেক করে দেখা যেতে পারে - ```python def my_func(): print("Printing Hello") what_i_got = my_func() print(what_i_got) ``` আউটপুট, ```python Printing Hello None ``` `None` এর আরেকটা সুন্দর ব্যবহার আমরা দেখতে পারি ফাংশনের ডিফল্ট আর্গুমেন্টের ডিফল্ট ভ্যালু হিসেবে ডিফাইন করার সময়। নিচের উদাহরণটি দেখি - ```python def my_func(x): if x: return x * x else: return 0 print(my_func()) ``` আউটপুট, ```python Traceback (most recent call last): File "/Users/nuhil/Desktop/Test.py", line 7, in print(my_func()) TypeError: my_func() takes exactly 1 argument (0 given) ``` উপরে `my_func` ডিফাইন করার সময় এর একটি প্যারামিটারও ডিফাইন করা হয়েছে। আবার লজিকের মাধ্যমে আমরা চেকও করেছি যে - যদি `x` এর ভ্যালু থাকে তাহলে সেটার স্কয়ার করে রিটার্ন করবে আর না থাকলে শূন্য রিটার্ন করবে। তাই যখন এই ফাংশনকে কল করা হচ্ছে তখন আমরা এরর পাচ্ছি যেখানে বলা আছে যে - উক্ত ফাংশনটি একটি আর্গুমেন্ট নেয় কিন্তু আমরা তাকে কিছুই পাঠাই নাই। এই ফাংশনকে একটু মডিফাই করে আমরা এর ডিফল্ট আর্গুমেন্টের ভ্যালু হিসেবে `None` সিলেক্ট করতে পারি। এতে করে এই ফাংশনকে কল করার সময় যখন ভ্যালিড আর্গুমেন্ট পাঠানো হবে তখন ফাংশনটি সেই ভ্যালিড ভ্যালু নিয়ে কাজ করবে আর না পাঠালেও সমস্যা নাই - তখন শূন্য পাঠাবে। ```python def my_func(x = None): if x: return x * x else: return 0 print(my_func()) print(my_func(5)) ``` আউটপুট, ```python 0 25 ``` উপরের প্রোগ্রামে উক্ত ফাংশনকে একবার আর্গুমেন্ট পাস করা ছাড়াই কল করা হয়েছে আরেকবার একটি আর্গুমেন্ট পাঠিয়েও কল করা হয়েছে। দুইবারই সঠিকভাবে কাজ করছে।