পাইথনে “ইন” এর সহযোগিতা?


107

আমি পাইথন পার্সার তৈরি করছি এবং এটি আমাকে সত্যিই বিভ্রান্ত করছে:

>>>  1 in  []  in 'a'
False

>>> (1 in  []) in 'a'
TypeError: 'in <string>' requires string as left operand, not bool

>>>  1 in ([] in 'a')
TypeError: 'in <string>' requires string as left operand, not list

সাহসীতা ইত্যাদির ক্ষেত্রে পাইথনে "ইন" ঠিক কীভাবে কাজ করে?

কেন এইরকম দুটি ভাব প্রকাশ একইরকম হয় না?


6
আপনি সম্ভবত এখানে বর্ণিত আচরণটি মারছেন : docs.python.org/references/expressions.html#not-in , এক যে আপনাকে লিখতে if a < b < c:এবং স্বজ্ঞাতভাবে এটি কাজ করতে দেয়
মিলিমুজ

3
@ মিলিমুজ: হ্যাঁ, inআমি অনুমান করি যে "তুলনা" অপারেটর হিসাবে আমি কখনই ভাবিনি । : \
user541686

উত্তর:


123

1 in [] in 'a'হিসাবে মূল্যায়ন করা হয় (1 in []) and ([] in 'a')

যেহেতু প্রথম শর্তটি ( 1 in []) False, তাই পুরো শর্তটি হিসাবে মূল্যায়ন করা হয় False; ([] in 'a')আসলে কখনই মূল্যায়ন হয় না, সুতরাং কোনও ত্রুটি উত্থাপিত হয় না।

বিবৃতি সংজ্ঞা এখানে:

In [121]: def func():
   .....:     return 1 in [] in 'a'
   .....: 

In [122]: dis.dis(func)
  2           0 LOAD_CONST               1 (1)
              3 BUILD_LIST               0
              6 DUP_TOP             
              7 ROT_THREE           
              8 COMPARE_OP               6 (in)
             11 JUMP_IF_FALSE            8 (to 22)  #if first comparison is wrong 
                                                    #then jump to 22, 
             14 POP_TOP             
             15 LOAD_CONST               2 ('a')
             18 COMPARE_OP               6 (in)     #this is never executed, so no Error
             21 RETURN_VALUE         
        >>   22 ROT_TWO             
             23 POP_TOP             
             24 RETURN_VALUE        

In [150]: def func1():
   .....:     return (1 in  []) in 'a'
   .....: 

In [151]: dis.dis(func1)
  2           0 LOAD_CONST               1 (1)
              3 LOAD_CONST               3 (())
              6 COMPARE_OP               6 (in)   # perform 1 in []
              9 LOAD_CONST               2 ('a')  # now load 'a'
             12 COMPARE_OP               6 (in)   # compare result of (1 in []) with 'a'
                                                  # throws Error coz (False in 'a') is
                                                  # TypeError
             15 RETURN_VALUE   



In [153]: def func2():
   .....:     return 1 in ([] in 'a')
   .....: 

In [154]: dis.dis(func2)
  2           0 LOAD_CONST               1 (1)
              3 BUILD_LIST               0
              6 LOAD_CONST               2 ('a') 
              9 COMPARE_OP               6 (in)  # perform ([] in 'a'), which is 
                                                 # Incorrect, so it throws TypeError
             12 COMPARE_OP               6 (in)  # if no Error then 
                                                 # compare 1 with the result of ([] in 'a')
             15 RETURN_VALUE        

দাঁড়ান !! +1 এটি আশ্চর্যজনক, অনেক অনেক ধন্যবাদ! এটি দেখতে খুব সহজ লাগে, কেবল যদি আমি এটি সম্পর্কে জানতাম! ডকুমেন্টেশনে এটি কোথায় রয়েছে তা আপনি জানতে পেরেছেন? আমি দেখেছি কিন্তু এমন কিছু খুঁজে পেল না যা প্রস্তাবিত!
ব্যবহারকারী541686

1
দ্রষ্টব্য: []মিথ্যা, তবে উদাহরণ []নয় False, [] and anythingরিটার্ন [](নয় False)।
jfs

6
@ মেহরদাদ এই আউটপুটটি তৈরি করতে আইপ্যাথনের সাথে ব্যবহৃত পাইথন ডিসেসেম্বারার পরীক্ষা করে দেখুন ।
জেফ ফেরল্যান্ড

ডান্নো পাইথনের কোন সংস্করণ এটি তৈরি করেছে তবে পাইথন ৩.২-তে সম্ভবত একটি নতুন বাইকোড রয়েছে: JUMP_IF_FALSE_OR_POP, যা ১৩ থেকে ১২ অবধি এক নির্দেশের মাধ্যমে ক্রমটি সংক্ষিপ্ত করে রেখেছে - দুর্দান্ত উত্তর - ধন্যবাদ !!
ডেভ

@ ডেভ ইটস পাইথন ২.6..6 (আইপথন)
অশ্বিনী

22

পাইথন শৃঙ্খলিত তুলনা সহ বিশেষ কিছু করে।

নিম্নলিখিতগুলি আলাদাভাবে মূল্যায়ন করা হয়:

x > y > z   # in this case, if x > y evaluates to true, then
            # the value of y is being used to compare, again,
            # to z

(x > y) > z # the parenth form, on the other hand, will first
            # evaluate x > y. And, compare the evaluated result
            # with z, which can be "True > z" or "False > z"

যদিও উভয় ক্ষেত্রেই প্রথম তুলনা হয় False , বাকী বাক্যটির দিকে নজর দেওয়া হবে না।

আপনার বিশেষ ক্ষেত্রে জন্য,

1 in [] in 'a'   # this is false because 1 is not in []

(1 in []) in a   # this gives an error because we are
                 # essentially doing this: False in 'a'

1 in ([] in 'a') # this fails because you cannot do
                 # [] in 'a'

উপরের প্রথম বিধিটি প্রদর্শন করার জন্য, এগুলি বিবৃতি যা সত্যকে মূল্যায়ন করে।

1 in [1,2] in [4,[1,2]] # But "1 in [4,[1,2]]" is False

2 < 4 > 1               # and note "2 < 1" is also not true

পাইথন অপারেটরদের নজির: http://docs.python.org/references/expressions.html#summary


11

ডকুমেন্টেশন থেকে:

তুলনাগুলি নির্বিচারে বেঁধে রাখা যেতে পারে, উদাহরণস্বরূপ, x <y <= z এর সমতুল্য x <y এবং y <= z এর সমতুল্য, ব্যতীত কেবল y একবারই মূল্যায়ন করা হয় (তবে উভয় ক্ষেত্রেই x <y পাওয়া গেলে Z এর মোটেও মূল্যায়ন করা হয় না to be false)।

এর অর্থ কী, এতে কোনও সাহস নেই x in y in z!

নিম্নলিখিত সমতুল্য:

1 in  []  in 'a'
# <=>
middle = []
#            False          not evaluated
result = (1 in middle) and (middle in 'a')


(1 in  []) in 'a'
# <=>
lhs = (1 in []) # False
result = lhs in 'a' # False in 'a' - TypeError


1 in  ([] in 'a')
# <=>
rhs = ([] in 'a') # TypeError
result = 1 in rhs

3

সংক্ষিপ্ত উত্তর, যেহেতু দীর্ঘটি ইতিমধ্যে বেশ কয়েকবার এখানে এবং সর্বোত্তম উপায়ে দেওয়া হয়েছে, এটি হ'ল বুলিয়ান অভিব্যক্তিটি সংক্ষিপ্ত-প্রচারিত হয় , যখন মিথ্যা বা তদ্বিপরীত সত্যের পরিবর্তনটি আরও মূল্যায়নের মাধ্যমে ঘটতে না পারে তখন মূল্যায়ন বন্ধ হয়ে যায়।

( http://en.wikedia.org/wiki/Short-circuit_e মূল্যায়ন দেখুন )

এটি উত্তর হিসাবে কিছুটা সংক্ষিপ্ত হতে পারে (কোনও পাং উদ্দেশ্য নয়), তবে যেমনটি উল্লেখ করা হয়েছে, অন্যান্য সমস্ত ব্যাখ্যা এখানে খুব ভালভাবে সম্পন্ন হয়েছে, তবে আমি মনে করি এই শব্দটি উল্লেখ করার যোগ্য।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.