পাইথন anyএবং allফাংশনগুলি কীভাবে কাজ করে?
anyএবং allপুনরাবৃত্তি গ্রহণ করুন এবং Trueযদি উপাদানগুলির কোনও এবং সমস্ত (যথাক্রমে) থাকে তবে ফিরে আসুন True।
>>> any([0, 0.0, False, (), '0']), all([1, 0.0001, True, (False,)])
(True, True) # ^^^-- truthy non-empty string
>>> any([0, 0.0, False, (), '']), all([1, 0.0001, True, (False,), {}])
(False, False) # ^^-- falsey
যদি পুনরাবৃত্তি খালি থাকে তবে anyফিরে আসে Falseএবং allফিরে আসে True।
>>> any([]), all([])
(False, True)
আমি প্রদর্শক ছিল allএবং anyআজ ক্লাসে ছাত্রদের জন্য। তারা বেশিরভাগ ফাঁকা পুনরাবৃত্তির জন্য ফেরতের মানগুলি সম্পর্কে বিভ্রান্ত ছিল। এটি এভাবে ব্যাখ্যা করার ফলে প্রচুর লাইটব্লাব চালু হয়েছিল।
শর্টকাটটিং আচরণ
তারা anyএবং allউভয়ই এমন এক অবস্থার সন্ধান করে যা তাদের মূল্যায়ন বন্ধ করতে দেয়। আমি যে প্রথম উদাহরণগুলি দিয়েছি তাদের পুরো তালিকার প্রতিটি উপাদানগুলির জন্য বুলিয়ান মূল্যায়ন করা প্রয়োজন to
(দ্রষ্টব্য যে তালিকার আক্ষরিকটি নিজেই অলসভাবে মূল্যায়ন করা হয় না - আপনি এটি কোনও আইট্রেটারের সাথে পেতে পারেন - তবে এটি কেবল চিত্রিত উদ্দেশ্যে))
এখানে যেকোন এবং সমস্তটির একটি পাইথন বাস্তবায়ন:
def any(iterable):
for i in iterable:
if i:
return True
return False # for an empty iterable, any returns False!
def all(iterable):
for i in iterable:
if not i:
return False
return True # for an empty iterable, all returns True!
অবশ্যই, বাস্তব বাস্তবায়ন সি-তে লিখিত এবং আরও পারফরম্যান্সযুক্ত, তবে আপনি উপরেরটিকে বিকল্প হিসাবে চিহ্নিত করতে এবং এই (বা অন্য কোনও) উত্তরে কোডের জন্য একই ফলাফল পেতে পারেন।
all
allউপাদানগুলির জন্য চেক করে False(যাতে এটি ফিরে আসতে পারে False), তবে Trueসেগুলির কোনওটি না থাকলে এটি ফিরে আসে False।
>>> all([1, 2, 3, 4]) # has to test to the end!
True
>>> all([0, 1, 2, 3, 4]) # 0 is False in a boolean context!
False # ^--stops here!
>>> all([])
True # gets to end, so True!
any
পথ anyকাজ এটি উপাদানের জন্য চেক হতে হয় True(তাই এটা আসতে পারেন True), then it returnsমিথ্যা if none of them wereTRUE`।
>>> any([0, 0.0, '', (), [], {}]) # has to test to the end!
False
>>> any([1, 0, 0.0, '', (), [], {}]) # 1 is True in a boolean context!
True # ^--stops here!
>>> any([])
False # gets to end, so False!
আমি মনে করি আপনি যদি স্বল্প-বিস্তৃত আচরণের বিষয়টি মাথায় রাখেন তবে আপনি স্বজ্ঞাতভাবে বুঝতে পারবেন যে তারা কোনও সত্য সারণীর উল্লেখ না করে কীভাবে কাজ করে।
প্রমাণ allএবং anyshortcutting:
প্রথমে একটি শোরগোলের_সামগ্রী তৈরি করুন:
def noisy_iterator(iterable):
for i in iterable:
print('yielding ' + repr(i))
yield i
এবং এখন আসুন কেবল আমাদের উদাহরণগুলি ব্যবহার করে তালিকাগুলি শোরগোলের মাধ্যমে পুনরাবৃত্তি করুন:
>>> all(noisy_iterator([1, 2, 3, 4]))
yielding 1
yielding 2
yielding 3
yielding 4
True
>>> all(noisy_iterator([0, 1, 2, 3, 4]))
yielding 0
False
আমরা allপ্রথম ফলস বুলিয়ান চেকের স্টপগুলি দেখতে পারি ।
এবং anyপ্রথম সত্য বুলিয়ান চেক বন্ধ করে দেয়:
>>> any(noisy_iterator([0, 0.0, '', (), [], {}]))
yielding 0
yielding 0.0
yielding ''
yielding ()
yielding []
yielding {}
False
>>> any(noisy_iterator([1, 0, 0.0, '', (), [], {}]))
yielding 1
True
উৎস
উপরেরটি নিশ্চিত করার জন্য উত্সটি দেখুন।
এর উত্সany এখানে :
static PyObject *
builtin_any(PyObject *module, PyObject *iterable)
{
PyObject *it, *item;
PyObject *(*iternext)(PyObject *);
int cmp;
it = PyObject_GetIter(iterable);
if (it == NULL)
return NULL;
iternext = *Py_TYPE(it)->tp_iternext;
for (;;) {
item = iternext(it);
if (item == NULL)
break;
cmp = PyObject_IsTrue(item);
Py_DECREF(item);
if (cmp < 0) {
Py_DECREF(it);
return NULL;
}
if (cmp > 0) {
Py_DECREF(it);
Py_RETURN_TRUE;
}
}
Py_DECREF(it);
if (PyErr_Occurred()) {
if (PyErr_ExceptionMatches(PyExc_StopIteration))
PyErr_Clear();
else
return NULL;
}
Py_RETURN_FALSE;
}
এবং এর উত্সall এখানে :
static PyObject *
builtin_all(PyObject *module, PyObject *iterable)
{
PyObject *it, *item;
PyObject *(*iternext)(PyObject *);
int cmp;
it = PyObject_GetIter(iterable);
if (it == NULL)
return NULL;
iternext = *Py_TYPE(it)->tp_iternext;
for (;;) {
item = iternext(it);
if (item == NULL)
break;
cmp = PyObject_IsTrue(item);
Py_DECREF(item);
if (cmp < 0) {
Py_DECREF(it);
return NULL;
}
if (cmp == 0) {
Py_DECREF(it);
Py_RETURN_FALSE;
}
}
Py_DECREF(it);
if (PyErr_Occurred()) {
if (PyErr_ExceptionMatches(PyExc_StopIteration))
PyErr_Clear();
else
return NULL;
}
Py_RETURN_TRUE;
}