অনেক ক্ষেত্রে পাইথন প্রাকৃতিক ইংরাজির মতো দেখায় এবং আচরণ করে তবে এটি এমন একটি ক্ষেত্রে যেখানে বিমূর্ততা ব্যর্থ হয়। লোকেরা "জোন" এবং "ইনবার" ক্রিয়া "সমান" ক্রিয়াতে যুক্ত হওয়া বস্তুগুলি নির্ধারণের জন্য প্রসঙ্গের ক্লু ব্যবহার করতে পারে তবে পাইথন ইন্টারপ্রেটার আরও আক্ষরিক মনের অধিকারী।
if name == "Kevin" or "Jon" or "Inbar":
যৌক্তিকভাবে এর সমতুল্য:
if (name == "Kevin") or ("Jon") or ("Inbar"):
যা ব্যবহারকারী বব এর জন্য সমান:
if (False) or ("Jon") or ("Inbar"):
or
অপারেটর একটি ইতিবাচক প্রথম যুক্তি বেছে সত্য মান :
if ("Jon"):
এবং যেহেতু "জন" এর ইতিবাচক সত্য মান রয়েছে তাই if
ব্লকটি কার্যকর করে। এ কারণেই প্রদত্ত নাম নির্বিশেষে "অ্যাক্সেস মঞ্জুরিপ্রাপ্ত" মুদ্রিত হয়।
এই সমস্ত যুক্তি প্রকাশের ক্ষেত্রেও প্রযোজ্য if "Kevin" or "Jon" or "Inbar" == name
। প্রথম মান,, "Kevin"
সত্য, তাই if
ব্লকটি কার্যকর করে।
এই শর্তসাপেক্ষে সঠিকভাবে নির্মাণের দুটি সাধারণ উপায় রয়েছে are
==
একেকটি অপারেটরকে প্রতিটি মানের সাথে সুস্পষ্টভাবে পরীক্ষা করতে ব্যবহার করুন :
if name == "Kevin" or name == "Jon" or name == "Inbar":
বৈধ মানগুলির ক্রম রচনা করুন, এবং in
সদস্যতার জন্য পরীক্ষার জন্য অপারেটরটি ব্যবহার করুন :
if name in {"Kevin", "Jon", "Inbar"}:
দু'জনের মধ্যে সাধারণত দ্বিতীয়টি পছন্দ করা উচিত কারণ এটি পড়া সহজ এবং দ্রুতও:
>>> import timeit
>>> timeit.timeit('name == "Kevin" or name == "Jon" or name == "Inbar"', setup="name='Inbar'")
0.4247764749999945
>>> timeit.timeit('name in {"Kevin", "Jon", "Inbar"}', setup="name='Inbar'")
0.18493307199999265
যারা প্রমাণ পেতে পারেন তাদের পক্ষে if a == b or c or d or e: ...
এটি অবশ্যই এইভাবে বিশ্লেষণ করা হয়েছে। অন্তর্নির্মিত ast
মডিউল একটি উত্তর সরবরাহ করে:
>>> import ast
>>> ast.parse("if a == b or c or d or e: ...")
<_ast.Module object at 0x1031ae6a0>
>>> ast.dump(_)
"Module(body=[If(test=BoolOp(op=Or(), values=[Compare(left=Name(id='a', ctx=Load()), ops=[Eq()], comparators=[Name(id='b', ctx=Load())]), Name(id='c', ctx=Load()), Name(id='d', ctx=Load()), Name(id='e', ctx=Load())]), body=[Expr(value=Ellipsis())], orelse=[])])"
>>>
সুতরাং test
এর if
ভালো বিবৃতি দেখায়:
BoolOp(
op=Or(),
values=[
Compare(
left=Name(id='a', ctx=Load()),
ops=[Eq()],
comparators=[Name(id='b', ctx=Load())]
),
Name(id='c', ctx=Load()),
Name(id='d', ctx=Load()),
Name(id='e', ctx=Load())
]
)
এক দেখতে পারেন, এটা বুলিয়ান অপারেটর এর or
একাধিক প্রয়োগ values
, যথা, a == b
এবং c
, d
এবং e
।