প্রোগ্রামিংয়ে নতুনদের জন্য একটি সাধারণ ভুল হল বুলিয়ান অপারেটরের কাজ করার পদ্ধতি ভুল বুঝতে, যা পাইথন ইন্টারপ্রিটার এক্সপ্রেশন পড়ার পদ্ধতির কারণে হয়। উদাহরণস্বরূপ, "and" ও "or" স্টেটমেন্ট শিখার পর কেউ মনে করতে পারে X = ('x' or 'y') এক্সপ্রেশন চেক করবে যে X ভেরিয়েবল 'a' বা 'b' স্ট্রিং-এর সমান কিনা। কিন্তু এটার না। বুঝতে হলে ইন্টারেক্টিভ সেশন শুরু করে নিচের এক্সপ্রেশনগুলো ইনপুট দিন:
>>> 'x' == ('x' or 'y')
True
>>> 'y' == ('x' or 'y')
False
>>> 'x' == ('x' and 'y')
False
>>> 'y' == ('x' and 'y')
True
এই মুহূর্তে and ও or অপারেটর টুটে যাওয়ার মতো মনে হয়। প্রথম দুটি এক্সপ্রেশনে 'x', 'x' or 'y'-এর সমান কিন্তু 'y' সমান নয়, এটি বুঝতে পারা কঠিন। আবার 'y', 'x' and 'y'-এর সমান হয় কেন, সেটাও অস্পষ্ট। কিন্তু বুলিয়ান অপারেটরের সাথে ইন্টারপ্রিটার যা করে, সেটা নিখুঁতভাবে আপনার জিজ্ঞাসা অনুযায়ী কাজ করে, শুধু আপনি যা চিন্তা করছেন সেটা নয়।
or এক্সপ্রেশনের ক্ষেত্রে, পাইথন ইন্টারপ্রিটার প্রথমে প্রথম স্টেটমেন্ট নেয় এবং চেক করে সেটি true কিনা। প্রথম স্টেটমেন্ট true হলে, পাইথন সেকেন্ড আর্গুমেন্টে না যেনই সেই অবজেক্টের মান রিটার্ন করে। কারণ or এক্সপ্রেশনে একটি মান true হলে পুরো এক্সপ্রেশন true হয়; প্রোগ্রাম সেকেন্ড স্টেটমেন্ট চেক করে না। কিন্তু প্রথম অবজেক্টের মান false হলে, পাইথন সেকেন্ড স্টেটমেন্ট চেক করে এবং সেটির মান রিটার্ন করে। সেকেন্ড হälfte এক্সপ্রেশনের সত্যতা নির্ধারণ করে কারণ প্রথম হälfte false ছিল। ইন্টারপ্রিটারের এই "অলসতা" কে "শর্ট-সার্কিটিং" (short-circuiting) বলা হয় এবং বহু প্রোগ্রামিং ল্যাঙ্গুয়েজে বুলিয়ান এক্সপ্রেশন ইভ্যালুয়েশনের সাধারণ পদ্ধতি।
and এক্সপ্রেশনের ক্ষেত্রেও পাইথন শর্ট সার্কিট টেকনিক ব্যবহার করে সত্যতা দ্রুত ইভ্যালুয়েট করে। প্রথম স্টেটমেন্ট false হলে পুরো জিনিস false হয়ে যায় এবং সেটি রিটার্ন করে (false) অন্যথায়, যদি প্রথম মান true হয় তবে সেকেন্ড চেক করে এবং সেটির মান রিটার্ন করে।
প্রথম কেস
'x' == ('x' or 'y')
# প্রথমে প্যarethেসিস দেখে, তাই "('x' or 'y')" ইভ্যালুয়েট
# 'x' নন-এম্পটি স্ট্রিং, তাই প্রথম মান True
>>> 'x' == 'x'
# স্ট্রিং 'x', স্ট্রিং 'x'-এর সমান, তাই এক্সপ্রেশন True
True
দ্বিতীয় কেস
'y' == ('x' or 'y')
# প্যarethেসিস প্রথমে, "('x' or 'y')" ইভ্যালুয়েট
# 'x' নন-এম্পটি স্ট্রিং, তাই প্রথম মান True
# সেই প্রথম মান রিটার্ন: 'x'
'y' == 'x'
# স্ট্রিং 'y', স্ট্রিং 'x'-এর সমান নয়, তাই এক্সপ্রেশন False
তৃতীয় কেস
>>> 'x' == ('x' and 'y')
# প্যarethেসিস প্রথমে, "('x' and 'y')" ইভ্যালুয়েট
# 'x' নন-এম্পটি স্ট্রিং, তাই প্রথম মান True, সেকেন্ড মান চেক
# 'y' নন-এম্পটি স্ট্রিং, তাই সেকেন্ড মান True
# পুরো এক্সপ্রেশনের ফলাফল হিসেবে সেকেন্ড মান রিটার্ন: 'y'
>>> 'x' == 'y'
# স্ট্রিং 'x', স্ট্রিং 'y'-এর সমান নয়, তাই এক্সপ্রেশন False
False
চতুর্থ কেস
>>> 'y' == ('x' and 'y')
# প্যarethেসিস প্রথমে, "('x' and 'y')" ইভ্যালুয়েট
True
# 'x' নন-এম্পটি স্ট্রিং, তাই প্রথম মান True, সেকেন্ড মান চেক
# 'y' নন-এম্পটি স্ট্রিং, তাই সেকেন্ড মান True
# পুরো এক্সপ্রেশনের ফলাফল হিসেবে সেকেন্ড মান রিটার্ন: 'y'
>>> 'y' == 'y'
# স্ট্রিং 'y', স্ট্রিং 'y'-এর সমান, তাই এক্সপ্রেশন True
True
শর্ট-সার্কিট ইভ্যালুয়েশন মানে বুলিয়ান এক্সপ্রেশন (AND ও OR) ইভ্যালুয়েট করার সময় আপনি থামতে পারেন যতক্ষণ না প্রথম কন্ডিশন পাওয়া যায় যা এক্সপ্রেশনকে স্যাটিসফাই বা নেগেট করে।
অফিসিয়াল ডকুমেন্টেশন থেকে শর্ট সার্কিট ব্যাখ্যা:
| Operation | Result | Description |
|---|---|---|
| x or y | If x is false, then y else x | শুধু সেকেন্ড আর্গুমেন্ট (y) ইভ্যালুয়েট করে যদি প্রথমটি false হয় |
| x and y | If x is false, then x else y | শুধু সেকেন্ড আর্গুমেন্ট (y) ইভ্যালুয়েট করে যদি প্রথমটি (x) True হয় |
| not x | If x is false, then True, else False | not-এর প্রায়োরিটি নন-বুলিয়ান অপারেটর থেকে কম |