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 и записать в нее <ul>.</li>
3
<ol><li>Создать переменную result и записать в нее <ul>.</li>
4
<li>Пройтись циклом по элементам коллекции и дописать в результирующую строку очередной элемент <li>.</li>
4
<li>Пройтись циклом по элементам коллекции и дописать в результирующую строку очередной элемент <li>.</li>
5
<li>Добавить в конце </ul> и вернуть result из функции.</li>
5
<li>Добавить в конце </ul> и вернуть 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