software - python tutorial pdf




কেন এক্সপ্রেশন 0<0== 0 পাইথনে মিথ্যা ফেরত দেয়? (6)

Disassembly এ খুঁজছেন (বাইট কোড) এটা কেন 0 < 0 == 0 False

এখানে এই অভিব্যক্তি একটি বিশ্লেষণ:

>>>import dis

>>>def f():
...    0 < 0 == 0

>>>dis.dis(f)
  2      0 LOAD_CONST               1 (0)
         3 LOAD_CONST               1 (0)
         6 DUP_TOP
         7 ROT_THREE
         8 COMPARE_OP               0 (<)
        11 JUMP_IF_FALSE_OR_POP    23
        14 LOAD_CONST               1 (0)
        17 COMPARE_OP               2 (==)
        20 JUMP_FORWARD             2 (to 25)
   >>   23 ROT_TWO
        24 POP_TOP
   >>   25 POP_TOP
        26 LOAD_CONST               0 (None)
        29 RETURN_VALUE

নোটিশ লাইন 0-8: এই লাইন চেক করে 0 < 0 যা স্পষ্টভাবে পাইথন স্ট্যাক সম্মুখের দিকে False দেয়।

এখন লাইন 11 লক্ষ্য করুন: JUMP_IF_FALSE_OR_POP 23 এর অর্থ হল যদি 0 < 0 ফেরত JUMP_IF_FALSE_OR_POP 23 লাইন 23 তে একটি লাফ সঞ্চালন করে।

এখন, 0 < 0 False , তাই লাফ নেওয়া হয়, যা একটি False সঙ্গে স্ট্যাক ছেড়ে যা সমগ্র অভিব্যক্তিটির জন্য ফেরত মান 0 < 0 == 0 , যদিও == 0 অংশ এমনকি চেক করা হয় না।

সুতরাং, উপসংহারে, উত্তরটি এই প্রশ্নের অন্যান্য উত্তরগুলিতে বলা হয়েছে। 0 < 0 == 0 একটি বিশেষ অর্থ আছে। কম্পাইলারটি দুটি পদে মূল্যায়ন করে: 0 < 0 এবং 0 == 0 । তাদের সাথে and মধ্যে কোনও জটিল বুলিয়ান এক্সপ্রেশনগুলির সাথে যদি প্রথম ব্যর্থ হয় তবে দ্বিতীয়টিও চেক করা হয় না।

এই কিছু আলোকিত করে তোলে এবং আমি আশা করি যে এই অপ্রত্যাশিত আচরণ বিশ্লেষণ করার জন্য আমি যে পদ্ধতিটি ব্যবহার করেছি তা ভবিষ্যতে অন্যদেরও একইভাবে চেষ্টা করতে উত্সাহিত করবে।

পাইথন 2.6 এ quue.py তে দেখছি, আমি এই গঠনটি খুঁজে পেয়েছি যা আমি একটু অদ্ভুত পেয়েছি:

def full(self):
    """Return True if the queue is full, False otherwise
    (not reliable!)."""
    self.mutex.acquire()
    n = 0 < self.maxsize == self._qsize()
    self.mutex.release()
    return n

যদি maxsize হয় 0 সারি পূর্ণ হয় না।

আমার প্রশ্ন এটা কিভাবে এই ক্ষেত্রে কাজ করে? কিভাবে 0 < 0 == 0 মিথ্যা বলে মনে করা হয়?

>>> 0 < 0 == 0
False
>>> (0) < (0 == 0)
True
>>> (0 < 0) == 0
True
>>> 0 < (0 == 0)
True

অন্যের উল্লেখ করা x comparison_operator y comparison_operator z হল সিন্ট্যাক্টিক চিনি (x comparison_operator y) and (y comparison_operator z) বোনাস সহ যা y একবার শুধুমাত্র একবার মূল্যায়ন করা হয়।

তাই আপনার অভিব্যক্তি 0 < 0 == 0 সত্যিই (0 < 0) and (0 == 0) , যা False and True মূল্যায়ন করে যা কেবল False


আমি পাইথন এটা জাদু মধ্যে অদ্ভুত করছেন চিন্তা করছি। 1 < 2 < 3 মানে 2 একই 1 এবং 3 এর মধ্যে।

এই ক্ষেত্রে, আমি মনে করি এটি [মধ্যম 0] [বাম 0] এর চেয়ে বড় এবং [সমান 0] সমান। মধ্য 0 0 বাম 0 চেয়ে বড় নয়, তাই এটি মিথ্যা মূল্যায়ন করে।


আমি বিশ্বাস করি রেফারেন্স তুলনা সহজ করতে এক্সপ্রেস অপারেটরগুলির ক্রমগুলির জন্য পাইথন বিশেষ কেস পরিচালনা করছে। এটি 0 < x <= 5 বলতে (0 < x) and (x <= 5) বলার অপেক্ষা রাখে না অনেক বেশি নিকর।

এই শৃঙ্খলা তুলনা বলা হয়। এবং যে তাদের জন্য ডকুমেন্টেশন একটি লিঙ্ক।

অন্যান্য ক্ষেত্রে আপনি যে বিষয়ে কথা বলছেন, তার সাথে বন্ধনীটি এক সম্পর্কযুক্ত অপারেটরকে অন্যের সামনে প্রয়োগ করা হবে এবং তাই তারা আর তুলনা করা তুলনামূলক নয়। এবং যেহেতু True এবং False পূর্ণসংখ্যা হিসাবে মান আছে, তাই আপনি উত্তরগুলি আপনার বন্ধনীযুক্ত সংস্করণগুলির বাইরে পান।


কারণ

(0 < 0) and (0 == 0)

False । আপনি একসঙ্গে তুলনা অপারেটর চেইন করতে পারেন এবং তারা স্বয়ংক্রিয়ভাবে pairwise তুলনা মধ্যে প্রসারিত হয়।

সম্পাদনা করুন - পাইথনে সত্য এবং মিথ্যা সম্পর্কে ব্যাখ্যা

পাইথন True এবং False শুধু bool উদাহরণ রয়েছে, যা int একটি উপশ্রেণী। অন্য কথায়, True সত্যই 1।

এই বিন্দুটি হল যে আপনি একটি পূর্ণসংখ্যা মত একটি বুলিয়ান তুলনা ফলাফল ব্যবহার করতে পারেন। এই মত বিভ্রান্তিকর জিনিস বাড়ে

>>> (1==1)+(1==1)
2
>>> (2<1)<1
True

কিন্তু এইগুলি শুধুমাত্র তখনই ঘটবে যদি আপনি তুলনাগুলি বন্ধ করে দেন যাতে তারা প্রথম মূল্যায়ন করে। অন্যথায় পাইথন তুলনা অপারেটর প্রসারিত হবে।


সম্ভবত docs থেকে এই উদ্ধৃতি সাহায্য করতে পারেন:

এই তথাকথিত "সমৃদ্ধ তুলনা" পদ্ধতি, এবং তুলনা অপারেটরদের জন্য __cmp__() নীচের পছন্দ অনুযায়ী বলা হয়। অপারেটর প্রতীক এবং পদ্ধতি নামগুলির মধ্যে চিঠিপত্র নিম্নরূপ: x<y কলগুলি x.__lt__(y) , x<=y কল x.__le__(y) , x==y কল x.__eq__(y) , x!=y এবং x<>y কল x.__ne__(y) , x>y কল x.__gt__(y) , এবং x>=y কল x.__ge__(y)

একটি সমৃদ্ধ তুলনা পদ্ধতি NotImplemented ফেরত দিতে পারে যদি এটি একটি প্রদত্ত জোড়া আর্গুমেন্টগুলির জন্য ক্রিয়াকলাপ বাস্তবায়ন না করে। কনভেনশন দ্বারা, False এবং True একটি সফল তুলনা জন্য ফিরে। যাইহোক, এই পদ্ধতিগুলি কোনও মানটি ফেরত দিতে পারে, তাই যদি তুলনা অপারেটরটি বুলিয়ান প্রসঙ্গে ব্যবহৃত হয় (উদাহরণস্বরূপ, যদি বিবৃতির শর্তে), পাইথন bool() কে মূল্যের উপর সত্য কিনা বা মিথ্যা বলে নির্ধারণ করতে হবে ।

তুলনা অপারেটরদের মধ্যে কোন অন্তর্নিহিত সম্পর্ক নেই। x==y সত্যটি বোঝায় না x!=y মিথ্যা। তদনুসারে, __eq__() সংজ্ঞায়িত করার সময়, __ne__() সংজ্ঞায়িত করা উচিত যাতে অপারেটর প্রত্যাশিত আচরণ করবে। কিছু গুরুত্বপূর্ণ নোটের জন্য __hash__() তে অনুচ্ছেদটি দেখুন যা হ্যাসেবল বস্তুগুলি তৈরি করে যা কাস্টম তুলনা ক্রিয়াকলাপ সমর্থন করে এবং অভিধান কী হিসাবে ব্যবহারযোগ্য।

এই পদ্ধতিগুলির কোনও স্যুপড-আর্গুমেন্ট সংস্করণ নেই (বাম আর্গুমেন্ট অপারেশনটিকে সমর্থন করে না তবে সঠিক যুক্তিটি ব্যবহার করে)। বরং, __lt__() এবং __gt__() একে অপরের প্রতিফলন, __le__() এবং __ge__() একে অপরের প্রতিফলন, এবং __eq__() এবং __ne__() তাদের নিজস্ব প্রতিফলন।

সমৃদ্ধ তুলনা পদ্ধতি আর্গুমেন্ট coerced হয় না।

এই তুলনা ছিল কিন্তু আপনি তুলনা chaining হয় যেহেতু আপনি জানা উচিত যে:

তুলনাগুলি ইচ্ছাকৃতভাবে আবদ্ধ করা যেতে পারে, যেমন, x < y <= z x < y and y <= z সমতুল্য, শুধুমাত্র y একবার মূল্যায়ন করা হয় তবে (x ক্ষেত্রে উভয় ক্ষেত্রেই x মূল্যায়ন করা হয় না মিথ্যা হতে)।

আনুষ্ঠানিকভাবে, যদি a, b, c, ..., y, z এক্সপ্রেশন হয় এবং op1, op2, ..., opN তুলনা অপারেটর হয়, তারপরে op1 b op2 c ... y opN z একটি op1 b এর সমতুল্য এবং b op2 c এবং ... y opn z, ব্যতীত প্রতিটি অভিব্যক্তি সর্বাধিক একবার মূল্যায়ন করা হয়।





python