HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#База знаний</a></p>
1 <p><a>#База знаний</a></p>
2 <ul><li>30 июл 2021</li>
2 <ul><li>30 июл 2021</li>
3 <li>0</li>
3 <li>0</li>
4 </ul><p>Понятное - не всегда значит лучшее.</p>
4 </ul><p>Понятное - не всегда значит лучшее.</p>
5 <p>: официальный арт к игре "ведьмак 3" / cd projekt red</p>
5 <p>: официальный арт к игре "ведьмак 3" / cd projekt red</p>
6 <p>Кандидат философских наук, специалист по математическому моделированию. Пишет про Data Science, AI и программирование на Python.</p>
6 <p>Кандидат философских наук, специалист по математическому моделированию. Пишет про Data Science, AI и программирование на Python.</p>
7 <p>Python ценят за его интуитивную понятность. Так, строки можно объединить простым плюсом:</p>
7 <p>Python ценят за его интуитивную понятность. Так, строки можно объединить простым плюсом:</p>
8 s1 = 'Я люблю ' s2 = 'программировать на Python' s1 + s2 &gt;&gt;&gt; 'Я люблю программировать на Python'<p>На первый взгляд странно, что многие профессиональные Python-разработчики не пользуются этим очевидным и, казалось бы, удобным методом, а вместо него применяют .join().</p>
8 s1 = 'Я люблю ' s2 = 'программировать на Python' s1 + s2 &gt;&gt;&gt; 'Я люблю программировать на Python'<p>На первый взгляд странно, что многие профессиональные Python-разработчики не пользуются этим очевидным и, казалось бы, удобным методом, а вместо него применяют .join().</p>
9 <p>Почему - давайте разбираться.</p>
9 <p>Почему - давайте разбираться.</p>
10 <p>Возьмём те же строки s1 и s2 и попробуем повторить предыдущий результат с помощью .join():</p>
10 <p>Возьмём те же строки s1 и s2 и попробуем повторить предыдущий результат с помощью .join():</p>
11 ''.join([s1, s2]) &gt;&gt;&gt; 'Я люблю программировать на Python'<p>Первая мысль: что здесь происходит? Зачем пустая строка? Почему строки s1 и s2 засунуты в список? Почему всё так не наглядно? А это точно Python?</p>
11 ''.join([s1, s2]) &gt;&gt;&gt; 'Я люблю программировать на Python'<p>Первая мысль: что здесь происходит? Зачем пустая строка? Почему строки s1 и s2 засунуты в список? Почему всё так не наглядно? А это точно Python?</p>
12 <p>Итак, по порядку:</p>
12 <p>Итак, по порядку:</p>
13 <ul><li>Пустая строка ' ' - это строка-соединитель: то, что будет между строками s1 и s2. В нашем случае она пустая, но это не обязательно - там может быть, например, пробел или знак препинания.</li>
13 <ul><li>Пустая строка ' ' - это строка-соединитель: то, что будет между строками s1 и s2. В нашем случае она пустая, но это не обязательно - там может быть, например, пробел или знак препинания.</li>
14 <li>Строки s1 и s2 составлены в список [s1, s2] потому, что join() принимает только один аргумент. Как правило, это итерируемый объект - список, кортеж или словарь из строк. В случае словаря функция join() объединит его ключи.</li>
14 <li>Строки s1 и s2 составлены в список [s1, s2] потому, что join() принимает только один аргумент. Как правило, это итерируемый объект - список, кортеж или словарь из строк. В случае словаря функция join() объединит его ключи.</li>
15 </ul>''.join((s1, s2)) # кортеж &gt;&gt;&gt; 'Я люблю программировать на Python' ''.join({s1:'a', s2:'b'}) # словарь с s1 и s2 в качестве ключей &gt;&gt;&gt; 'Я люблю программировать на Python' ''.join({'a':s1, 'b':s2}) # словарь с s1, s2 в качестве значений &gt;&gt;&gt; 'ab'<p>Вроде бы с join() разобрались. Но главный вопрос остался открытым: "Зачем его использовать?"</p>
15 </ul>''.join((s1, s2)) # кортеж &gt;&gt;&gt; 'Я люблю программировать на Python' ''.join({s1:'a', s2:'b'}) # словарь с s1 и s2 в качестве ключей &gt;&gt;&gt; 'Я люблю программировать на Python' ''.join({'a':s1, 'b':s2}) # словарь с s1, s2 в качестве значений &gt;&gt;&gt; 'ab'<p>Вроде бы с join() разобрались. Но главный вопрос остался открытым: "Зачем его использовать?"</p>
16 <p>Представим, что вы получили много строк в одном списке и теперь надо объединить их в одну. Попробуем решить задачу с помощью плюса:</p>
16 <p>Представим, что вы получили много строк в одном списке и теперь надо объединить их в одну. Попробуем решить задачу с помощью плюса:</p>
17 strings = ['Жизнь', 'слишком', 'коротка,', 'программируй', 'на', 'Python'] def join_strs(strs): result = '' for s in strs: result += ' ' + s # а вот и плюс return result[1:] join_strs(strings) &gt;&gt;&gt; 'Жизнь слишком коротка, программируй на Python'<p>В теле функции join_strs() мы создаём пустую строку result. Далее с помощью цикла for бежим по полученному списку из строк и с каждой итерацией добавляем к строке result пробел и строку из списка - с помощью плюса, разумеется.</p>
17 strings = ['Жизнь', 'слишком', 'коротка,', 'программируй', 'на', 'Python'] def join_strs(strs): result = '' for s in strs: result += ' ' + s # а вот и плюс return result[1:] join_strs(strings) &gt;&gt;&gt; 'Жизнь слишком коротка, программируй на Python'<p>В теле функции join_strs() мы создаём пустую строку result. Далее с помощью цикла for бежим по полученному списку из строк и с каждой итерацией добавляем к строке result пробел и строку из списка - с помощью плюса, разумеется.</p>
18 <p>В конце return возвращает строку result без первого элемента - там стоит ненужный нам пробел, добавившийся при первой итерации.</p>
18 <p>В конце return возвращает строку result без первого элемента - там стоит ненужный нам пробел, добавившийся при первой итерации.</p>
19 <p>Итак, чтобы использовать ‘+’ для объединения строк из списка:</p>
19 <p>Итак, чтобы использовать ‘+’ для объединения строк из списка:</p>
20 <ul><li>нужен цикл for,</li>
20 <ul><li>нужен цикл for,</li>
21 <li>нужно помнить о лишнем пробеле.</li>
21 <li>нужно помнить о лишнем пробеле.</li>
22 </ul><p>Посмотрим, что может предложить join():</p>
22 </ul><p>Посмотрим, что может предложить join():</p>
23 def join_strs_better(strs): return ' '.join(strs) join_strs_better(strings) &gt;&gt;&gt; 'Жизнь слишком коротка, программируй на Python'<p>Ого! Выглядит неплохо: никаких циклов и не надо беспокоиться о пробеле - функция сама обо всём позаботилась, причём в одну строчку.</p>
23 def join_strs_better(strs): return ' '.join(strs) join_strs_better(strings) &gt;&gt;&gt; 'Жизнь слишком коротка, программируй на Python'<p>Ого! Выглядит неплохо: никаких циклов и не надо беспокоиться о пробеле - функция сама обо всём позаботилась, причём в одну строчку.</p>
24 <p>В принципе, этого уже достаточно, чтобы забыть о ‘+’ - во всяком случае, для большого количества строк. Но есть ещё одна - возможно, главная - причина.</p>
24 <p>В принципе, этого уже достаточно, чтобы забыть о ‘+’ - во всяком случае, для большого количества строк. Но есть ещё одна - возможно, главная - причина.</p>
25 <p>Встроенная Python-библиотека<a>timeit</a>предназначена для измерения времени исполнения кода небольшого размера (скриптов, или сниппетов). Как раз наш случай.</p>
25 <p>Встроенная Python-библиотека<a>timeit</a>предназначена для измерения времени исполнения кода небольшого размера (скриптов, или сниппетов). Как раз наш случай.</p>
26 <p>Передадим код из примеров выше в качестве аргумента в функцию timeit.timeit(), исполним его миллион раз для обеих наших функций и сравним время:</p>
26 <p>Передадим код из примеров выше в качестве аргумента в функцию timeit.timeit(), исполним его миллион раз для обеих наших функций и сравним время:</p>
27 import timeit timeit.timeit( ''' strings = ['Жизнь', 'слишком', 'коротка,', 'программируй', 'на', 'Python'] def join_strs(strs): result = '' for s in strs: result += ' ' + s return result[1:] join_strs(strings) ''' , number=1000000) &gt;&gt;&gt; 1.1924651000001631 timeit.timeit( ''' strings = ['Жизнь', 'слишком', 'коротка,', 'программируй', 'на', 'Python'] def join_strs_better(strs): return ' '.join(strs) join_strs_better(strings) ''' , number=1000000) &gt;&gt;&gt; 0.39118409999991854<p>Объединение шести строк в одну с помощью плюса в три раза медленнее, чем объединение этих же строк с помощью функции join().</p>
27 import timeit timeit.timeit( ''' strings = ['Жизнь', 'слишком', 'коротка,', 'программируй', 'на', 'Python'] def join_strs(strs): result = '' for s in strs: result += ' ' + s return result[1:] join_strs(strings) ''' , number=1000000) &gt;&gt;&gt; 1.1924651000001631 timeit.timeit( ''' strings = ['Жизнь', 'слишком', 'коротка,', 'программируй', 'на', 'Python'] def join_strs_better(strs): return ' '.join(strs) join_strs_better(strings) ''' , number=1000000) &gt;&gt;&gt; 0.39118409999991854<p>Объединение шести строк в одну с помощью плюса в три раза медленнее, чем объединение этих же строк с помощью функции join().</p>
28 <p>С увеличением количества объединяемых строк эта разница будет расти - попробуйте проверить это самостоятельно.</p>
28 <p>С увеличением количества объединяемых строк эта разница будет расти - попробуйте проверить это самостоятельно.</p>
29 <p>В чём причина?</p>
29 <p>В чём причина?</p>
30 <p>Приблизительная схема работы цикла for с плюсом внутри выглядит примерно так.</p>
30 <p>Приблизительная схема работы цикла for с плюсом внутри выглядит примерно так.</p>
31 Изображение:<a>Christopher Tao</a><ol><li>На каждой итерации цикла из списка вынимается строка.</li>
31 Изображение:<a>Christopher Tao</a><ol><li>На каждой итерации цикла из списка вынимается строка.</li>
32 <li>Интерпретатор выполняет команду result += ' ' + s, сначала запрашивая память для пробела ' '.</li>
32 <li>Интерпретатор выполняет команду result += ' ' + s, сначала запрашивая память для пробела ' '.</li>
33 <li>Затем он запрашивает память для строки s.</li>
33 <li>Затем он запрашивает память для строки s.</li>
34 <li>Так происходит шесть раз, и в каждой итерации есть два запроса в память - для пробела и для строки, итого 12.</li>
34 <li>Так происходит шесть раз, и в каждой итерации есть два запроса в память - для пробела и для строки, итого 12.</li>
35 </ol><p>А что происходит, когда мы объединяем эти же строки с помощью .join()?</p>
35 </ol><p>А что происходит, когда мы объединяем эти же строки с помощью .join()?</p>
36 Изображение:<a>Christopher Tao</a><ol><li>Интерпретатор подсчитывает количество строк в списке: 6.</li>
36 Изображение:<a>Christopher Tao</a><ol><li>Интерпретатор подсчитывает количество строк в списке: 6.</li>
37 <li>Подсчитывает количество нужных для объединения пробелов: 5.</li>
37 <li>Подсчитывает количество нужных для объединения пробелов: 5.</li>
38 <li>Обращается в память сразу за одиннадцатью ячейками.</li>
38 <li>Обращается в память сразу за одиннадцатью ячейками.</li>
39 <li>Формирует строку, выдаёт результат.</li>
39 <li>Формирует строку, выдаёт результат.</li>
40 </ol><p>Как видим, всё происходит гораздо компактнее. Меньшее количество обращений к памяти - основная причина более высокой скорости работы функции join() по сравнению с циклом for и +.</p>
40 </ol><p>Как видим, всё происходит гораздо компактнее. Меньшее количество обращений к памяти - основная причина более высокой скорости работы функции join() по сравнению с циклом for и +.</p>
41 <p>Дружелюбие синтаксиса Python к начинающим - это прекрасно, без всяких преувеличений. Но если программист не хочет быть начинающим всю свою жизнь, то придётся постоянно осваивать более мощные и часто менее очевидные инструменты, подходы и приёмы.</p>
41 <p>Дружелюбие синтаксиса Python к начинающим - это прекрасно, без всяких преувеличений. Но если программист не хочет быть начинающим всю свою жизнь, то придётся постоянно осваивать более мощные и часто менее очевидные инструменты, подходы и приёмы.</p>
42 <p>На курсах "<a>Профессии Python-разработчик</a>" вы не только познакомитесь именно с такими инструментами, но и выработаете привычку к постоянному их поиску и совершенствованию. В этом, возможно, и заключается суть программирования. Приходите, и да пребудут с вами Дзен и Дух Пайтона!</p>
42 <p>На курсах "<a>Профессии Python-разработчик</a>" вы не только познакомитесь именно с такими инструментами, но и выработаете привычку к постоянному их поиску и совершенствованию. В этом, возможно, и заключается суть программирования. Приходите, и да пребудут с вами Дзен и Дух Пайтона!</p>
43 <a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>
43 <a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>