উত্তর:
হ্যাঁ, উভয়ই and
এবং or
অপারেটরগুলি শর্ট সার্কিট - ডক্স দেখুন ।
and
, or
:কিছু কার্যকর হয়েছে কি না তা নির্ধারণ করতে প্রথমে একটি কার্যকর ফাংশন সংজ্ঞায়িত করা যাক। একটি সাধারণ ফাংশন যা আর্গুমেন্ট গ্রহণ করে, একটি বার্তা মুদ্রণ করে এবং ইনপুটটি অপরিবর্তিত করে দেয়।
>>> def fun(i):
... print "executed"
... return i
...
এক মান্য করতে পারেন পাইথন এর শর্ট-সার্কিট আচরণ এর and
, or
যা নিম্নলিখিত উদাহরণে অপারেটরদের:
>>> fun(1)
executed
1
>>> 1 or fun(1) # due to short-circuiting "executed" not printed
1
>>> 1 and fun(1) # fun(1) called and "executed" printed
executed
1
>>> 0 and fun(1) # due to short-circuiting "executed" not printed
0
দ্রষ্টব্য: নীচের মানগুলি দোভাষী দ্বারা মিথ্যা বোঝার জন্য বিবেচনা করা হয়েছে:
False None 0 "" () [] {}
any()
, all()
:পাইথন any()
এবং all()
ফাংশনগুলিও শর্ট সার্কিটকে সমর্থন করে। ডক্সে প্রদর্শিত হিসাবে; তারা ক্রমের প্রতিটি উপাদানকে ক্রমানুসারে মূল্যায়ন করে, কোনও ফলাফল না পাওয়া পর্যন্ত যা মূল্যায়ণে প্রাথমিক প্রস্থানকে মঞ্জুরি দেয়। উভয় বুঝতে নীচের উদাহরণ বিবেচনা করুন।
any()
কোনও উপাদান সত্য কিনা তা ফাংশনটি পরীক্ষা করে। এটি সত্যের মুখোমুখি হওয়ার সাথে সাথে সম্পাদন বন্ধ করে দেয় এবং সত্যকে ফেরত দেয়।
>>> any(fun(i) for i in [1, 2, 3, 4]) # bool(1) = True
executed
True
>>> any(fun(i) for i in [0, 2, 3, 4])
executed # bool(0) = False
executed # bool(2) = True
True
>>> any(fun(i) for i in [0, 0, 3, 4])
executed
executed
executed
True
ফাংশনটি all()
সমস্ত উপাদান সত্য বলে পরীক্ষা করে এবং কোনও মিথ্যা দেখা দেওয়ার সাথে সাথে সম্পাদন বন্ধ করে দেয়:
>>> all(fun(i) for i in [0, 0, 3, 4])
executed
False
>>> all(fun(i) for i in [1, 0, 3, 4])
executed
executed
False
অতিরিক্ত হিসাবে, পাইথনে
তুলনাগুলি নির্বিচারে বেঁধে রাখা যেতে পারে ; উদাহরণস্বরূপ,
x < y <= z
এটির সমানx < y and y <= z
,y
কেবলমাত্র একবারে মূল্যায়ন করা হয় (তবে উভয় ক্ষেত্রেইz
যখনx < y
মিথ্যা বলে প্রমাণিত হয় তখন মোটেও মূল্যায়ন করা হয় না )।
>>> 5 > 6 > fun(3) # same as: 5 > 6 and 6 > fun(3)
False # 5 > 6 is False so fun() not called and "executed" NOT printed
>>> 5 < 6 > fun(3) # 5 < 6 is True
executed # fun(3) called and "executed" printed
True
>>> 4 <= 6 > fun(7) # 4 <= 6 is True
executed # fun(3) called and "executed" printed
False
>>> 5 < fun(6) < 3 # only prints "executed" once
executed
False
>>> 5 < fun(6) and fun(6) < 3 # prints "executed" twice, because the second part executes it again
executed
executed
False
সম্পাদনা:
আরও একটি আকর্ষণীয় বিষয় লক্ষণীয় : - যৌক্তিক and
,or
পাইথনের অপারেটররা বুলিয়ান ( বা ) এর পরিবর্তে অপারেন্ডের মান প্রদান করে । উদাহরণ স্বরূপ:True
False
অপারেশন
x and y
ফলাফল দেয়if x is false, then x, else y
অন্যান্য ভাষার মতো নয় &&
, ||
সি-তে অপারেটররা 0 বা 1 প্রদান করে।
উদাহরণ:
>>> 3 and 5 # Second operand evaluated and returned
5
>>> 3 and ()
()
>>> () and 5 # Second operand NOT evaluated as first operand () is false
() # so first operand returned
একইভাবে or
অপারেটর বাম সর্বাধিক মান ফিরে আসে যার জন্য bool(value)
== True
ডানদিকে সবচেয়ে বেশি ভুয়া মান (সংক্ষিপ্ত-সার্কিট আচরণ অনুসারে), উদাহরণ:
>>> 2 or 5 # left most operand bool(2) == True
2
>>> 0 or 5 # bool(0) == False and bool(5) == True
5
>>> 0 or ()
()
সুতরাং, এটি কিভাবে দরকারী? প্রাক্টিক্যাল পাইথন -এ ম্যাগনাস লাই হেটল্যান্ডের একটি উদাহরণ ব্যবহার করা হয়েছে : ধরা
যাক যে কোনও ব্যবহারকারীর নিজের নাম প্রবেশ করানো উচিত, তবে কোনও কিছুই প্রবেশ করতে পারবেন না, সেই ক্ষেত্রে আপনি ডিফল্ট মানটি ব্যবহার করতে চান '<unknown>'
। আপনি যদি একটি বিবৃতি ব্যবহার করতে পারেন তবে আপনি খুব সংক্ষেপে জিনিসও বলতে পারেন:
In [171]: name = raw_input('Enter Name: ') or '<Unkown>'
Enter Name:
In [172]: name
Out[172]: '<Unkown>'
অন্য কথায়, যদি কাঁচা-ইনপুট থেকে ফেরতের মানটি সত্য হয় (খালি স্ট্রিং নয়), এটি নাম (কোনও পরিবর্তন হয় না) হিসাবে বরাদ্দ করা হয়; অন্যথায়, ডিফল্ট '<unknown>'
নির্ধারিত হয় name
।
0
falsy (তাই এটা শুধু না হয় 0
, এটা 0.0
, 0j
, decimal.Decimal(0)
, fractions.Fraction(0)
, ইত্যাদি), হিসাবে সব সংগ্রহের দৈর্ঘ্য সঙ্গে আছে 0
(তাই কি আপনি তালিকাভুক্ত উপরে, b''
[Py3], u''
[Py2] এবং set()
/ frozenset()
হয় সমস্ত বিল্ট-ইন যা মিথ্যা হিসাবে মূল্যায়ন করে), তবে ব্যবহারকারী-সংজ্ঞায়িত / তৃতীয় পক্ষের প্রকারগুলি তাদের নিজস্ব __bool__
[[পাই 3] / __nonzero__
[পাই 2] এর সাথে সরাসরি বা অপ্রত্যক্ষভাবে সংজ্ঞা দিয়ে __len__
) সংজ্ঞায়িত করতে পারে ।