Создание бесконечного списка?
Зная, что это, скорее всего, закончится неудачей, я хочу знать, как Python будет относиться к такому сценарию, и действительно ли мой код «имеет смысл», по крайней мере, в принципе. Итак, вот моя попытка, я довольно новичок в python (несколько дней назад), поэтому я уверен, что мой код кажется смешным тем из вас, у кого больше опыта, но, пожалуйста, потерпите меня.
Это ошибка, которую я получил в моем окне DOS, пытаясь запустить выше:
5 ответов
Языки с «бесконечными» структурами данных фактически создают объекты, которые создают свои значения лениво или «по требованию». Вместо того чтобы создавать весь список заранее, они создают объект, который при запросе значения может создать его в это время.
В Python это проще всего сделать с помощью генератора.
По сути, есть две вещи, которые не позволяют печатать бесконечный список (что кажется конечной целью вашего кода):
- На компьютере не хватит памяти.
- Создание списка займет бесконечное время, то есть оно никогда не закончится и фактическая печать никогда не начнется.
Если вы представляете себе воображаемый компьютер с бесконечной памятью и бесконечной скоростью вычислений, список можно распечатать.
Однако некоторые языки поддерживают бесконечные списки, будучи «ленивыми», то есть они будут вычислять только ту часть списка, которая им нужна в данный момент. Затем вы можете определить бесконечный список и попросить его распечатать, например, первые 100 значений в нем.
В какой-то момент у вашего компьютера заканчивается память при создании списка, и именно поэтому вы видите ошибку. Невозможно иметь бесконечный список, потому что память является ограниченным ресурсом.
В качестве альтернативы вы можете использовать бесконечный итератор. Стандартная библиотека предоставляет несколько бесконечных итераторов. Исходя из вашего примера, я думаю, что наиболее подходящим для вашей ситуации является itertools.count .
Вы также можете указать пользовательскую отправную точку:
И пользовательский шаг:
Оно не может быть бесконечным в том смысле, что вы сразу получаете доступ ко всем членам вселенной. Это было бы невозможно — бесконечная длина означает бесконечную необходимую память. Как видно из полученной ошибки, у вас нет бесконечной памяти. Как отмечают другие, вы можете обменять скорость на длину:
Здесь я комбинирую обычный список с расширением на лету, если это необходимо. Мне не нужно было начинать с пустого списка, я мог бы предварительно сделать первые N элементов, если бы предпочел.
Конечно, вы можете перегружать операторы (+, — что угодно). Дело в том, что все сделано на лету. Работая таким образом, вы можете даже добавлять и вычитать бесконечные списки.
Вы могли бы даже улучшить это, используя управление памятью и удалив начало списка, если не просматривалось некоторое время, но я думаю, что это выходит за рамки. Более функциональный подход заключается в том, чтобы сохранить текущее число и способ продолжения (я добавил prev , чтобы он был похож на встроенный __next__ :
Опять же, операторы (не только представление), или прыжки больше, чем один могут быть легко реализованы.
Бесконечные структуры данных имеют смысл, но их всегда нужно лениво оценивать. Это означает, что ваша структура данных не может сразу собрать все свои элементы, а затем перемещаться сама по себе (как мы обычно делаем с list , который помещается в памяти). Вместо этого ваша структура данных должна давать вам значения по мере их запроса.
В Python у вас не может быть бесконечного list , потому что list стремится, а не ленится (как и большинство вещей в Python, по умолчанию используется eager). Чтобы было ясно, я говорю о типе list здесь w.r.t. Терминология Python, а не абстрактная концепция некоторой последовательности (которую некоторые люди могут называть списком).
Вы можете получить ленивую оценку, используя то, что называется generator . Если вы хотите сгенерировать последовательность 1,2,3,4. , вы можете сделать это с помощью следующего кода:
Очевидно, вам не нужно останавливаться на 3. Вам не нужно никуда останавливаться (за исключением случаев, когда созданный вами int фактически не помещается в память). Если вы продолжаете вызывать next , генератор будет продолжать возвращать вам значения.
По мере продвижения сборщик мусора может удалять значения из памяти, которые больше не содержат ссылок. Это совсем другая тема, но следует заметить, что, пока вы не будете хранить ссылки вечно, вашей программе также не хватит памяти при использовании генераторов.
Часто возникают ситуации, в которых вам необходимо выполнить блок кода несколько раз. Как правило, команды выполняются одна вслед за другой, но существуют способы зациклить код. Во многих языках программирования для этой цели используются инструкции циклов. В Python существуют следующют два типа цикличных выражений:
- Цикл while
- Цикл for
Цикл while в Python:
Инструкция while в Python повторяет указанный блок кода до тех пор, пока указанное в цикле условие будет оставаться истинным.
Цикл while в Python записывается следующим образом:
При этом выражением может быть как одна так и несколько инструкций. Условием может быть любое истинное или ненулевое значение. Выражение будет повторяться, пока условие будет истинным.
Когда условие становится ложным интерпретатор переводит выполнение программы на строку, следующую за циклом. Рассмотрим следующий пример цикла while в Python:
Запустив код, вы увидите следующий результат:

Бесконечный цикл:
Цикл while становится бесконечным в случае, когда условие цикла никогда не становится ложным. Примером задачи для реализации которой необходим бесконечный цикл может быть, например, создание программы «Часы», которая бесконечно будет обновлять и отображать время. Однако, часто бесконечный цикл является ошибкой начинающего программиста, который забыл добавить изменение условия цикла. Например:
Не спешите запускать данный цикл, иначе ваша программа начнет бесконечное выполнение. Чтобы остановить выполнение такого скрипта — в shell нужно нажать Ctrl+C .
Цикл for в Python:
Цикл for в Python обладает способностью переберать элементы любого комплексного типа данных (например, строки или списка). В Python цикл for обладает следующим синтаксисом:
Переменной item присваивается значение первого элемента sequence, после чего выполняется statement. Затем переменной item присваивается следующее по порядку значение и так далее до тех пор, пока не будут перебраны все элементы sequence. Например:
Запустив код выше получим:

Перебор комплексных типов данных по индексам:
Другой способ прохода циклом for по комплексным типам данных является проход по индексам. Как вы помните, любой элемент последовательности можно получить по его индексу. Для генерации списка индексов воспользуемся встроенной функцией range(). Например:
В результате программа напечатает перечень дней недели.
Команда break в Python:
Команда break в Python прекращает выполнение цикла и переводит выполнение программы на строку следующую после цикла.
Команда break работает как в цикле while та и в цикле for. Например:
Python | Как сделать бесконечное прибавление к переменной?

Оксана . , ну еще мелочь — забыли условия выключения цикла указать, получится, что он файлы бесконечно штампует. Лучше что-то, вроде этого делать:
И выглядит приятнее и логичнее.


- Вконтакте
Можно короче
! Осторожно будет генерировать, пока не остановишь
a = 1
while True:
f = open(‘text’ + str(a) + ‘.txt’, ‘w’)
f.close()
a += 1
- Вконтакте

Я бы использовал генератор
Если действительно нужна бесконечная последовательность, то заменить
while start <= max:
на
start=1
while true:
и убрать параметры у функции,
но мне кажется автор не это имел ввиду.