पायथन 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, दोनों एक ऐसी स्थिति की तलाश करते हैं जो उन्हें मूल्यांकन बंद करने की अनुमति देती है। पहले उदाहरण मैंने उन्हें पूरी सूची में प्रत्येक तत्व के लिए बूलियन का मूल्यांकन करने के लिए आवश्यक दिया।
(ध्यान दें कि सूची शाब्दिक रूप से स्वयं आलसी का मूल्यांकन नहीं किया जाता है - आप इसे एक Iterator के साथ प्राप्त कर सकते हैं - लेकिन यह सिर्फ उदाहरण के लिए है।)
यहाँ किसी और सभी का पायथन कार्यान्वयन है:
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 wereट्रू` लौटा सकता है ।
>>> 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और anyशॉर्टकट:
सबसे पहले, एक नॉइज़_ राइटर बनाएं:
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;
}