notঅপারেটর (লজিক্যাল অস্বীকৃতি)
সম্ভবত সবচেয়ে ভাল উপায় অপারেটর ব্যবহার করা হয় not:
>>> value = True
>>> not value
False
>>> value = False
>>> not value
True
সুতরাং আপনার কোডের পরিবর্তে:
if bool == True:
return False
else:
return True
আপনি ব্যবহার করতে পারেন:
return not bool
ফাংশন হিসাবে যৌক্তিক অবহেলা
operatorমডিউলটিতে দুটি ফাংশন রয়েছে operator.not_এবং operator.__not__অপারেটরের পরিবর্তে ফাংশন হিসাবে এটির প্রয়োজন হলে এটির উপন্যাস :
>>> import operator
>>> operator.not_(False)
True
>>> operator.not_(True)
False
আপনি যদি এমন কোনও ফাংশন ব্যবহার করতে চান যা প্রিডিটিক-ফাংশন বা কলব্যাকের প্রয়োজন হয় তবে এগুলি কার্যকর হতে পারে।
উদাহরণস্বরূপ mapবা filter:
>>> lst = [True, False, True, False]
>>> list(map(operator.not_, lst))
[False, True, False, True]
>>> lst = [True, False, True, False]
>>> list(filter(operator.not_, lst))
[False, False]
একটি সমতুল্য lambdaকার্যক্রমে অবশ্যই এটি অর্জন করা যেতে পারে :
>>> my_not_function = lambda item: not item
>>> list(map(my_not_function, lst))
[False, True, False, True]
~বুলিয়ানগুলিতে বিটওয়াইস ইনভার্ট অপারেটর ব্যবহার করবেন না
বিটওয়াইস ইনভার্ট অপারেটর ~বা সমতুল্য অপারেটর ফাংশন operator.inv(বা সেখানে অন্য 3 টির মতো একটির) ব্যবহার করার জন্য একজনকে প্ররোচিত করা যেতে পারে । তবে boolফলাফলটির একটি সাবক্লাস হ'ল intঅপ্রত্যাশিত হতে পারে কারণ এটি "বিপরীত বুলিয়ান" ফিরিয়ে দেয় না, এটি "বিপরীত পূর্ণসংখ্যা" প্রদান করে:
>>> ~True
-2
>>> ~False
-1
এটি কারণ এবং এর সাথে Trueসমান এবং বিটওয়াইজ ইনভার্সনটি ইন্টিজারগুলি এবং এর বিটওয়াইজ উপস্থাপনার উপর পরিচালিত হয় ।1False0 10
সুতরাং এগুলিকে "অগ্রাহ্য" করতে ব্যবহার করা যাবে না bool।
NumPy অ্যারে (এবং উপশ্রেণীর) সাথে আলোচনা
আপনি যদি বুলিয়ান সম্বলিত NumPy অ্যারেগুলি (বা উপক্লাসগুলির মতো pandas.Seriesবা pandas.DataFrame) এর সাথে লেনদেন করছেন তবে আপনি আসলে অ্যারেতে সমস্ত বুলিয়ানকে ~অগ্রাহ্য করতে বিটওয়াইস ইনভার্স অপারেটর ( ) ব্যবহার করতে পারেন :
>>> import numpy as np
>>> arr = np.array([True, False, True, False])
>>> ~arr
array([False, True, False, True])
বা সমতুল্য NumPy ফাংশন:
>>> np.bitwise_not(arr)
array([False, True, False, True])
আপনি NumPy অ্যারেগুলিতে notঅপারেটর বা operator.notফাংশনটি ব্যবহার করতে পারবেন না কারণ এগুলি প্রয়োজন যে এইগুলি একটি একক bool(বুলিয়ানগুলির একটি অ্যারে নয়) ফেরত দেয় , তবে NumPy এ একটি যৌক্তিক নয় ফাংশন রয়েছে যা উপাদান অনুসারে কাজ করে:
>>> np.logical_not(arr)
array([False, True, False, True])
এটি নন-বুলিয়ান অ্যারেগুলিতেও প্রয়োগ করা যেতে পারে:
>>> arr = np.array([0, 1, 2, 0])
>>> np.logical_not(arr)
array([ True, False, False, True])
আপনার নিজস্ব ক্লাস কাস্টমাইজ করা
notboolমানটির উপর কল করে এবং ফলাফলটিকে অস্বীকার করে কাজ করে । সহজতম ক্ষেত্রে সত্যের মানটি কেবলমাত্র __bool__বস্তুকে কল করবে ।
সুতরাং প্রয়োগ করে __bool__(বা __nonzero__পাইথন 2 এ) আপনি সত্যের মানটি কাস্টমাইজ করতে পারেন এবং ফলস্বরূপ not:
class Test(object):
def __init__(self, value):
self._value = value
def __bool__(self):
print('__bool__ called on {!r}'.format(self))
return bool(self._value)
__nonzero__ = __bool__
def __repr__(self):
return '{self.__class__.__name__}({self._value!r})'.format(self=self)
আমি একটি printবিবৃতি যুক্ত করেছি যাতে আপনি যাচাই করতে পারেন যে এটি সত্যই পদ্ধতিটিকে কল করে:
>>> a = Test(10)
>>> not a
__bool__ called on Test(10)
False
তেমনিভাবে আপনি __invert__প্রয়োগ করার সময় আচরণটি বাস্তবায়নের জন্য পদ্ধতিটি ~প্রয়োগ করতে পারেন:
class Test(object):
def __init__(self, value):
self._value = value
def __invert__(self):
print('__invert__ called on {!r}'.format(self))
return not self._value
def __repr__(self):
return '{self.__class__.__name__}({self._value!r})'.format(self=self)
আবার একটি printকল দিয়ে দেখুন এটি দেখতে আসলে:
>>> a = Test(True)
>>> ~a
__invert__ called on Test(True)
False
>>> a = Test(False)
>>> ~a
__invert__ called on Test(False)
True
তবে এর __invert__মতো বাস্তবায়ন বিভ্রান্তিকর হতে পারে কারণ এর আচরণটি "সাধারণ" পাইথনের আচরণের থেকে পৃথক। যদি আপনি কখনই তা স্পষ্টভাবে নথিভুক্ত করেন এবং নিশ্চিত হন যে এটির বেশ ভাল (এবং সাধারণ) ব্যবহারের ক্ষেত্রে রয়েছে।
intওboolউভয় builtin নাম (ধরনের তারা প্রতিনিধিত্ব জন্য), এবং পরিবর্তনশীল নামের হিসেবে ব্যবহার করা উচিত নয়।