পাইথন x x যদি না হয়- বা not না হয় x নয় `


745

আমি সবসময় if not x is Noneসংস্করণটি আরও পরিষ্কার হতে ভেবেছি তবে গুগলের স্টাইল গাইড এবং পিইপি -8 উভয়ই ব্যবহার করে if x is not None। কোনও সামান্য পারফরম্যান্স পার্থক্য আছে (আমি ধরে নিচ্ছি না), এবং এমন কোনও ঘটনা রয়েছে যেখানে সত্যই ফিট হয় না (অন্যটি আমার সম্মেলনের জন্য একটি স্পষ্ট বিজয়ী করে তোলে)? *

* আমি ন্যায়সঙ্গত না হয়ে যে কোনও সিঙ্গলটনের কথা উল্লেখ করছি None

... কারও মত সিঙ্গলটনের তুলনা করতে ব্যবহার হয় বা হয় না।


8
is notএটি নিজের অধিকারে অপারেটর। লাইক !=। যদি আপনি চান not x is Noneতাহলে আপনার কাছে ব্যবহার করা উচিৎ not a == bউপর a != b
টমসজ গ্যান্ডোর

@ টমাসজান্দোর সম্পর্কে আমার আর এই মতামত নেই not x is None(এখানে উত্তরগুলি আমাকে বুঝিয়ে দিয়েছে) - তবে এটি not a == bতুলনামূলক তুলনায় পাইথনের পছন্দের স্টাইলটি লক্ষ্য করার মতো a != b
অরোকসাকি

4
@ অরোকসাকি not a == bআসলেই পছন্দসই স্টাইল? আমি সেভাবে এটি কখনও দেখিনি এবং সর্বত্র আমি লোককে সমস্ত ব্যবহৃত দেখায় !=
মাইক - এসএমটি

2
@orokusaki সালে পাইথন পাঠযোগ্যতা গন্য তাই এটি একটি পছন্দের শৈলী এক অপারেটর ব্যবহার করা !=দুই অপারেটরের পরিবর্তে not, ==
জিয়েকোমন

উত্তর:


994

পারফরম্যান্সের কোনও পার্থক্য নেই, কারণ তারা একই বাইকোডে সংকলন করে:

Python 2.6.2 (r262:71600, Apr 15 2009, 07:20:39)
>>> import dis
>>> def f(x):
...    return x is not None
...
>>> dis.dis(f)
  2           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE
>>> def g(x):
...   return not x is None
...
>>> dis.dis(g)
  2           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE

স্টাইলিস্টিকভাবে, আমি এড়াতে চেষ্টা করি not x is y। যদিও সংকলকটি সর্বদা এটিরূপে বিবেচিত হবে not (x is y), একজন মানব পাঠক নির্মানটিকে ভুল হিসাবে বুঝতে পারে (not x) is y। আমি যদি লিখি x is not yতবে কোনও দ্বিধা নেই।


103
যদি না একই মানব পাঠক তা ভেবে থাকেন x is (not y)। তবে আমি আপনার অন্যান্য যুক্তির জন্য আপনার সাথে একমত হতে চাই।
এটাইয়েন

24
অতিরিক্ত হিসাবে "এই নয়" এই প্রসঙ্গে কম দুষ্প্রাপ্য "যদি এ কেউ হয় না এবং খ কোন হয় না:" বনাম "যদি না হয় কেউই নয় এবং খ কোনও নয়:"
গর্ডন রাইগলে

45
অপারেটরটি "আইট" হতে হবে
মটরশুটি

216

গুগল এবং পাইথনের উভয়ের স্টাইল গাইডই সেরা অনুশীলন:

if x is not None:
    # Do something about x

ব্যবহারের not xফলে অযাচিত ফলাফল হতে পারে।

নিচে দেখ:

>>> x = 1
>>> not x
False
>>> x = [1]
>>> not x
False
>>> x = 0
>>> not x
True
>>> x = [0]         # You don't want to fall in this one.
>>> not x
False

পাইথনে Trueবা এর Falseমধ্যে আক্ষরিক মূল্যায়ন হয় তা দেখতে আপনি আগ্রহী হতে পারেন :


নীচের মন্তব্যের জন্য সম্পাদনা করুন:

আমি আরও কিছু পরীক্ষা করেছি। প্রথমে not x is Noneতুচ্ছ করে না xএবং তারপরে তুলনা করি None। আসলে, মনে হয় isঅপারেটরের সেইরকম ব্যবহার করার সময় এর চেয়ে বেশি অগ্রাধিকার রয়েছে:

>>> x
[0]
>>> not x is None
True
>>> not (x is None)
True
>>> (not x) is None
False

অতএব, not x is Noneন্যায়বান, আমার সৎ মতামতে, সেরা এড়ানো।


আরও সম্পাদনা:

আমি সবেমাত্র আরও পরীক্ষা করেছি এবং নিশ্চিত করতে পারি যে বুকজারের মন্তব্যটি সঠিক। (কমপক্ষে, আমি অন্যথায় এটি প্রমাণ করতে সক্ষম হইনি))

এর অর্থ if x is not Noneসঠিক ফলাফল হিসাবে রয়েছে if not x is None। আমি সংশোধন করেছি. ধন্যবাদ বুকজোর

তবে, আমার উত্তর এখনও দাঁড়িয়ে আছে: প্রচলিত ব্যবহার করুনif x is not None:]


130

কোডটি প্রথমে প্রোগ্রামারকে বোধগম্য হওয়ার জন্য লিখতে হবে এবং সংকলক বা দোভাষী দ্বিতীয়। "নন" কনস্ট্রাক্টটি "না হয়" এর চেয়ে আরও বেশি নিকটবর্তী ইংরেজের সাথে সাদৃশ্যপূর্ণ।


33

পাইথন if x is not Noneনাকি if not x is None?

টিএলডিআর: বাইটকোড সংকলক তাদের উভয়কে পার্স করে x is not None- তাই পাঠ্যতার জন্য, ব্যবহারের জন্য if x is not None

সুপাঠ্যতা

আমরা পাইথন ব্যবহার করি কারণ আমরা মানব পাঠযোগ্যতা, ব্যবহারযোগ্যতা এবং কর্মক্ষমতা দ্বারা প্রোগ্রামিংয়ের বিভিন্ন দৃষ্টান্তের নির্ভুলতার মতো বিষয়গুলিকে গুরুত্ব দিয়ে থাকি।

পাইথন পাঠযোগ্যতার জন্য বিশেষত এই প্রসঙ্গে উপযুক্ত করে।

বাইটকোড পার্সিং এবং সংকলন

not বেঁধে আরও স্বাস্থ্যহীন চেয়ে is, তাই এখানে কোন যৌক্তিক পার্থক্য নেই। ডকুমেন্টেশন দেখুন :

অবজেক্ট আইডেন্টিটির জন্য অপারেটর isএবং is notপরীক্ষা: x is yসত্য যদি x এবং y একই বস্তু হয় true x is not yবিপরীত সত্যের মান দেয়।

is notবিশেষভাবে পাইথন এ জন্য প্রদান করা হয় ব্যাকরণ ভাষার জন্য একটি পাঠযোগ্যতা উন্নতি হিসাবে:

comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'

এবং তাই এটি পাশাপাশি ব্যাকরণের একক উপাদান।

অবশ্যই, এটি একই পার্স করা হয় না:

>>> import ast
>>> ast.dump(ast.parse('x is not None').body[0].value)
"Compare(left=Name(id='x', ctx=Load()), ops=[IsNot()], comparators=[Name(id='None', ctx=Load())])"
>>> ast.dump(ast.parse('not x is None').body[0].value)
"UnaryOp(op=Not(), operand=Compare(left=Name(id='x', ctx=Load()), ops=[Is()], comparators=[Name(id='None', ctx=Load())]))"

কিন্তু তারপর বাইট কম্পাইলার আসলে অনুবাদ করবে not ... isকরার is not:

>>> import dis
>>> dis.dis(lambda x, y: x is not y)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                1 (y)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE
>>> dis.dis(lambda x, y: not x is y)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                1 (y)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE

সুতরাং পাঠযোগ্যতার স্বার্থে এবং ভাষাটি যেমন ইচ্ছা তেমনভাবে ব্যবহার করার জন্য দয়া করে ব্যবহার করুন is not

এটি ব্যবহার না করা বুদ্ধিমানের কাজ নয়।


" notবাঁধাগুলি আরও দুর্বলভাবে বাঁধায় is, সুতরাং এখানে কোনও যৌক্তিক পার্থক্য নেই" - পাইথনকে ধরে রাখার জন্য যৌক্তিক এবং বীজগণিত পরিচয় প্রয়োগ করতে হবে না ( (1 + 2)*3একই মূল্যায়নের জন্য কোনও অভ্যন্তরীণ কারণ নেই 1*3 + 2*3)। এখানে দৃশ্যত পাইথন প্রতারণা করছে এবং অপ্টিমাইজ করছে UNARY_NOT
আলেক্সি

30

লোকেরা এটির তুলনায় উত্তরটি সহজ।

কোনওভাবেই কোনও প্রযুক্তিগত সুবিধা নেই, এবং "x নয় y" হ'ল অন্য প্রত্যেকে যা ব্যবহার করে , এটি এটিকে পরিষ্কার বিজয়ী করে তোলে। এটি "আরও বেশি ইংরাজির মতো দেখায়" বা তা নয়; প্রত্যেকে এটি ব্যবহার করে যার অর্থ পাইথনের প্রতিটি ব্যবহারকারীর - এমনকি চীনা ব্যবহারকারীরা, যাদের ভাষা পাইথন দেখতে কিছুই দেখায় না - এটি এক নজরে বুঝতে পারবেন, যেখানে সামান্য কম সাধারণ বাক্য গঠন বিশ্লেষণ করতে বেশ কয়েকটি অতিরিক্ত মস্তিষ্কের চক্র লাগবে।

কমপক্ষে এই ক্ষেত্রে কেবল আলাদা হওয়ার স্বার্থে আলাদা হবেন না।


11

is notঅপারেটরের ফলাফল অস্বীকার ওভার পছন্দ করা হয় isরচনাশৈলীসংক্রান্ত কারণে। " if x is not None:" ঠিক ইংরেজির মতোই পড়ে, তবে " if not x is None:" অপারেটরের অগ্রাধিকার বোঝার প্রয়োজন হয় এবং ইংরেজির মতো পড়েন না।

যদি পারফরম্যান্সের পার্থক্য থাকে তবে আমার অর্থ চালু আছে is not, তবে এটি অবশ্যই কৌশলটিকে অগ্রাধিকার দেওয়ার সিদ্ধান্তের অনুপ্রেরণা নয়। এটি অবশ্যই বাস্তবায়ন নির্ভর হবে। যেহেতু isওভাররেডযোগ্য নয়, তাই কোনওরকম পার্থক্য অপ্টিমাইজ করা সহজ হওয়া উচিত।


9

ব্যক্তিগতভাবে, আমি ব্যবহার করি

if not (x is None):

যা প্রতিটি প্রোগ্রামার দ্বারা অস্পষ্টতার সাথে সাথেই বোঝা যায়, এমনকি পাইথন সিনট্যাক্সে বিশেষজ্ঞ নয়।


5
আমি একটি নিখুঁত যুক্তি যার সাথে আমি একমত, কিন্তু আমি বিশ্বাস করি আইডিয়োমেটিক স্টাইলটি অনুসরণ করার যুক্তি আরও শক্তিশালী।
ক্লেক

2

if not x is Noneঅন্যান্য প্রোগ্রামিং ভাষাগুলির সাথে আরও সমান, তবে if x is not Noneস্পষ্টতই আমার কাছে আরও স্পষ্ট মনে হয় (এবং ইংরেজিতে আরও ব্যাকরণগতভাবে সঠিক)।

এটি বলেছিল মনে হচ্ছে এটি আমার কাছে পছন্দের জিনিস of


0

আমি আরও x is not y বেশি পঠনযোগ্য কোড উত্পাদন করার জন্য অপারেটরদের কোড হ্যান্ডলিং অগ্রাধিকারটি কীভাবে লিখব তা ভাবার চেয়ে আমি আরও পঠনযোগ্য ফর্মটি পছন্দ করব।

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