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 >>> 'Я люблю программировать на Python'<p>На первый взгляд странно, что многие профессиональные Python-разработчики не пользуются этим очевидным и, казалось бы, удобным методом, а вместо него применяют .join().</p>
8
s1 = 'Я люблю ' s2 = 'программировать на Python' s1 + s2 >>> 'Я люблю программировать на 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]) >>> 'Я люблю программировать на Python'<p>Первая мысль: что здесь происходит? Зачем пустая строка? Почему строки s1 и s2 засунуты в список? Почему всё так не наглядно? А это точно Python?</p>
11
''.join([s1, s2]) >>> 'Я люблю программировать на 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)) # кортеж >>> 'Я люблю программировать на Python' ''.join({s1:'a', s2:'b'}) # словарь с s1 и s2 в качестве ключей >>> 'Я люблю программировать на Python' ''.join({'a':s1, 'b':s2}) # словарь с s1, s2 в качестве значений >>> 'ab'<p>Вроде бы с join() разобрались. Но главный вопрос остался открытым: "Зачем его использовать?"</p>
15
</ul>''.join((s1, s2)) # кортеж >>> 'Я люблю программировать на Python' ''.join({s1:'a', s2:'b'}) # словарь с s1 и s2 в качестве ключей >>> 'Я люблю программировать на Python' ''.join({'a':s1, 'b':s2}) # словарь с s1, s2 в качестве значений >>> '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) >>> 'Жизнь слишком коротка, программируй на 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) >>> 'Жизнь слишком коротка, программируй на 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) >>> 'Жизнь слишком коротка, программируй на Python'<p>Ого! Выглядит неплохо: никаких циклов и не надо беспокоиться о пробеле - функция сама обо всём позаботилась, причём в одну строчку.</p>
23
def join_strs_better(strs): return ' '.join(strs) join_strs_better(strings) >>> 'Жизнь слишком коротка, программируй на 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) >>> 1.1924651000001631 timeit.timeit( ''' strings = ['Жизнь', 'слишком', 'коротка,', 'программируй', 'на', 'Python'] def join_strs_better(strs): return ' '.join(strs) join_strs_better(strings) ''' , number=1000000) >>> 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) >>> 1.1924651000001631 timeit.timeit( ''' strings = ['Жизнь', 'слишком', 'коротка,', 'программируй', 'на', 'Python'] def join_strs_better(strs): return ' '.join(strs) join_strs_better(strings) ''' , number=1000000) >>> 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>