পাইথন শর্ট সার্কিট সমর্থন করে?


উত্তর:



192

অপারেটর মধ্যে স্বল্প-পরিক্রমার আচরণ 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 পাইথনের অপারেটররা বুলিয়ান ( বা ) এর পরিবর্তে অপারেন্ডের মান প্রদান করে । উদাহরণ স্বরূপ:TrueFalse

অপারেশন 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


1
মাইনর কুইবল: মিথ্যা মানগুলির সুস্পষ্ট তালিকাটি কিছুটা বিভ্রান্তিকর। যে কোনও ধরণের এক বা একাধিক মিথ্যা মান থাকতে পারে। নিয়ম অনুযায়ী মান সমস্ত সাংখ্যিক ধরনের 0falsy (তাই এটা শুধু না হয় 0, এটা 0.0, 0j, decimal.Decimal(0), fractions.Fraction(0), ইত্যাদি), হিসাবে সব সংগ্রহের দৈর্ঘ্য সঙ্গে আছে 0(তাই কি আপনি তালিকাভুক্ত উপরে, b''[Py3], u''[Py2] এবং set()/ frozenset()হয় সমস্ত বিল্ট-ইন যা মিথ্যা হিসাবে মূল্যায়ন করে), তবে ব্যবহারকারী-সংজ্ঞায়িত / তৃতীয় পক্ষের প্রকারগুলি তাদের নিজস্ব __bool__[[পাই 3] / __nonzero__[পাই 2] এর সাথে সরাসরি বা অপ্রত্যক্ষভাবে সংজ্ঞা দিয়ে __len__) সংজ্ঞায়িত করতে পারে ।
শ্যাডোর্যাঞ্জার

@ শ্যাডোএ্যাঞ্জার এখানে আপনার মন্তব্য আমার উত্তর সম্পূর্ণ করবে। এই নোট যোগ করার জন্য ধন্যবাদ।
গ্রিজেশ চৌহান

এছাড়াও, পাইথন শর্ট সার্কিট শর্তসাপেক্ষগুলির ডাবল-মূল্যায়ন করে, যদি পরে সেগুলি বুলিয়ান হিসাবে ব্যবহার করা হয় ... তবে যদি সেগুলি যদি বিবৃতিতে না থাকে, যা প্রিভিলেজড হয়
এরিক অ্যারোনস্টি

48

হ্যাঁ. আপনার অজগর দোভাষীর মধ্যে নিম্নলিখিতটি ব্যবহার করে দেখুন:

এবং

>>>False and 3/0
False
>>>True and 3/0
ZeroDivisionError: integer division or modulo by zero

অথবা

>>>True or 3/0
True
>>>False or 3/0
ZeroDivisionError: integer division or modulo by zero
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.