Hướng dẫn any vs all python - bất kỳ so với tất cả python

Làm thế nào để các chức năng ____10 và >>> any([]), all([]) (False, True) 1 của Python hoạt động?

>>> any([]), all([])
(False, True)
0 và
>>> any([]), all([])
(False, True)
1 lấy Iterables và trả lại
>>> any([]), all([])
(False, True)
4 nếu có và tất cả (tương ứng) của các yếu tố là
>>> any([]), all([])
(False, True)
4.

>>> 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

Nếu các vòng lặp trống,

>>> any([]), all([])
(False, True)
0 sẽ trả về
>>> any([]), all([])
(False, True)
7 và
>>> any([]), all([])
(False, True)
1 trả về
>>> any([]), all([])
(False, True)
4.

>>> any([]), all([])
(False, True)

Tôi đã trình diễn

>>> any([]), all([])
(False, True)
1 và
>>> any([]), all([])
(False, True)
0 cho học sinh trong lớp ngày hôm nay. Họ chủ yếu bị nhầm lẫn về các giá trị trả về cho các vòng lặp trống. Giải thích nó theo cách này đã khiến rất nhiều bóng đèn bật lên.

Hành vi tắt

Họ,

>>> any([]), all([])
(False, True)
0 và
>>> any([]), all([])
(False, True)
1, cả hai đều tìm kiếm một điều kiện cho phép họ ngừng đánh giá. Các ví dụ đầu tiên tôi đưa ra yêu cầu họ đánh giá Boolean cho từng yếu tố trong toàn bộ danh sách.

.

Đây là một triển khai Python của bất kỳ và tất cả:

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!

Tất nhiên, việc triển khai thực sự được viết bằng C và hiệu suất hơn nhiều, nhưng bạn có thể thay thế các điều trên và nhận được kết quả tương tự cho mã trong câu trả lời này (hoặc bất kỳ) câu trả lời nào khác).

>>> any([]), all([]) (False, True) 1

>>> any([]), all([])
(False, True)
1 Kiểm tra các phần tử là
>>> any([]), all([])
(False, True)
7 (vì vậy nó có thể trả về
>>> any([]), all([])
(False, True)
7), sau đó nó trả về
>>> any([]), all([])
(False, True)
4 nếu không ai trong số chúng là
>>> any([]), all([])
(False, True)
7.

>>> 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([]), all([]) (False, True) 0

Cách

>>> any([]), all([])
(False, True)
0 hoạt động là nó kiểm tra các phần tử là
>>> any([]), all([])
(False, True)
4 (vì vậy nó có thể trả về ____ 33False ________ 34True`.

>>> 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!

Tôi nghĩ rằng nếu bạn ghi nhớ hành vi cắt ngắn, bạn sẽ trực giác hiểu cách họ làm việc mà không cần phải tham khảo một bảng sự thật.

Bằng chứng về việc thu phí >>> any([]), all([]) (False, True) 1 và >>> any([]), all([]) (False, True) 0:

Đầu tiên, hãy tạo một IAISY_ITHERATOR:

def noisy_iterator(iterable):
    for i in iterable:
        print('yielding ' + repr(i))
        yield i

Và bây giờ chúng ta hãy lặp đi lặp lại trong danh sách ồn ào, sử dụng các ví dụ của chúng tô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

Chúng ta có thể thấy

>>> any([]), all([])
(False, True)
1 dừng trong kiểm tra Boolean sai đầu tiên.

>>> any([]), all([])
(False, True)
0 dừng trên kiểm tra Boolean thực sự đầu tiên:

>>> 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

Nguồn

Hãy xem xét nguồn để xác nhận những điều trên.

Đây là nguồn cho

>>> any([]), all([])
(False, True)
0:

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;
}

Và đây là nguồn cho

>>> any([]), all([])
(False, True)
1:

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;
}