None

আচ্ছা আমরা তো জানি কোন ভ্যারিয়েবলে ডাটা ষ্টোর করা যায়। অথবা সেখানে ফাকা ভ্যালু রাখা যায় যেমন ফাকা স্ট্রিং। কিন্তু যদি এমন কোন ভ্যারিয়েবল নেই যার আসলে কোন ভ্যালুই নাই সেটা কিভাবে ইনিসিয়ালাইজ করা যেতে পারে? 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

উপরের প্রোগ্রামে উক্ত ফাংশনকে একবার আর্গুমেন্ট পাস করা ছাড়াই কল করা হয়েছে আরেকবার একটি আর্গুমেন্ট পাঠিয়েও কল করা হয়েছে। দুইবারই সঠিকভাবে কাজ করছে।