HTML Diff
2 added 2 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Генерация строк в циклах - задача, часто возникающая на практике. Типичный пример - функция, помогающая генерировать HTML-списки. Она принимает на вход коллекцию элементов и возвращает HTML-список из них:</p>
1 <p>Генерация строк в циклах - задача, часто возникающая на практике. Типичный пример - функция, помогающая генерировать HTML-списки. Она принимает на вход коллекцию элементов и возвращает HTML-список из них:</p>
2 <p>Как можно решить эту задачу в лоб:</p>
2 <p>Как можно решить эту задачу в лоб:</p>
3 <ol><li>Создать переменную result и записать в нее &lt;ul&gt;.</li>
3 <ol><li>Создать переменную result и записать в нее &lt;ul&gt;.</li>
4 <li>Пройтись циклом по элементам коллекции и дописать в результирующую строку очередной элемент &lt;li&gt;.</li>
4 <li>Пройтись циклом по элементам коллекции и дописать в результирующую строку очередной элемент &lt;li&gt;.</li>
5 <li>Добавить в конце &lt;/ul&gt; и вернуть result из функции.</li>
5 <li>Добавить в конце &lt;/ul&gt; и вернуть result из функции.</li>
6 </ol><p>Такой способ вполне рабочий, но для большинства языков программирования максимально неэффективный. Дело в том, что конкатенация и интерполяция порождают новую строчку вместо старой. Подобная ситуация повторяется на каждой итерации. Причем строка становится все больше и больше. Копирование строк приводит к серьезному расходу памяти и может влиять на производительность. Конечно, для большинства приложений данная проблема неактуальна из-за малого объема прогоняемых данных, но более эффективный подход не сложнее в реализации и обладает рядом плюсов. Поэтому стоит сразу приучить себя работать правильно.</p>
6 </ol><p>Такой способ вполне рабочий, но для большинства языков программирования максимально неэффективный. Дело в том, что конкатенация и интерполяция порождают новую строчку вместо старой. Подобная ситуация повторяется на каждой итерации. Причем строка становится все больше и больше. Копирование строк приводит к серьезному расходу памяти и может влиять на производительность. Конечно, для большинства приложений данная проблема неактуальна из-за малого объема прогоняемых данных, но более эффективный подход не сложнее в реализации и обладает рядом плюсов. Поэтому стоит сразу приучить себя работать правильно.</p>
7 <p>Правильно, в случае с динамическими языками - формировать список, который затем с помощью метода join() можно превратить в строку:</p>
7 <p>Правильно, в случае с динамическими языками - формировать список, который затем с помощью метода join() можно превратить в строку:</p>
8 - <p>Размер кода практически не изменился, но способ формирования результата стал другим. Вместо строки, сначала собирается список, который затем превращается в строку с помощью метода .join(). У такого подхода есть и дополнтельные плюсы:</p>
8 + <p>Размер кода практически не изменился, но способ формирования результата стал другим. Вместо строки, сначала собирается список, который затем превращается в строку с помощью метода .join(). У такого подхода есть и дополнительные плюсы:</p>
9 <ul><li>Такой код проще отлаживать. Данные, представленные списком, легче вычленять визуально и программно.</li>
9 <ul><li>Такой код проще отлаживать. Данные, представленные списком, легче вычленять визуально и программно.</li>
10 - <li>Список - это структура, с ним можно производить дополнительные манипуляции. С готовой строкой уже ничего особо не сделать.</li>
10 + <li>Список - это структура, с ним можно производить дополнительные манипуляции. С готовой строкой уже ничего особ не сделать.</li>
11 </ul><p>Регулируя разделитель, строки можно объединять разными способами. Например, через запятую с пробелом:</p>
11 </ul><p>Регулируя разделитель, строки можно объединять разными способами. Например, через запятую с пробелом:</p>
12 <p>Если каждое слово надо вывести на новой строчке, то в качестве разделителя используем символ перевода строки '\n':</p>
12 <p>Если каждое слово надо вывести на новой строчке, то в качестве разделителя используем символ перевода строки '\n':</p>
13 <p>Последний пример особенно важен. Новички часто допускают ошибку и добавляют перевод строки в момент формирования списка, а не в join(). Посмотрите на пример с нашей функцией build_HTML_list().</p>
13 <p>Последний пример особенно важен. Новички часто допускают ошибку и добавляют перевод строки в момент формирования списка, а не в join(). Посмотрите на пример с нашей функцией build_HTML_list().</p>
14 <p>Правильно:</p>
14 <p>Правильно:</p>
15 <p>Неправильно:</p>
15 <p>Неправильно:</p>
16  
16