Я слышал, что диапазон был генератором, потом я понял, что это не через этот полезный пост . Хотя этот пост подробно объясняет, как метод __contains__
работает в постоянное время, я не смог найти никаких ссылок на исходный код о том, как создается ленивая последовательность. Я пытался расшифровать исходный код сам, но, имея только базовые c знания в C, я изо всех сил. Я полагаю, что приведенный ниже фрагмент кода показывает, как __iter__
работает в диапазоне (исправьте меня, если я ошибаюсь) - не могли бы вы пролить свет на то, как здесь реализована ленивая последовательность? Отличается ли это от ленивой последовательности генератора?
range_iter(PyObject *seq)
{
rangeobject *r = (rangeobject *)seq;
longrangeiterobject *it;
long lstart, lstop, lstep;
PyObject *int_it;
long_range:
it = PyObject_New(longrangeiterobject, &PyLongRangeIter_Type);
if (it == NULL)
return NULL;
it->start = r->start;
it->step = r->step;
it->len = r->length;
it->index = _PyLong_Zero;
Py_INCREF(it->start);
Py_INCREF(it->step);
Py_INCREF(it->len);
Py_INCREF(it->index);
return (PyObject *)it;
}