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