str.join(iterable)
str
- строка-разделитель,iterable
- итерируемый объект с элементами в виде строк.Метод str.join()
возвращает строку, которая является конкатенацией (объединением) всех элементов строк итерируемого объекта iterable
.
В итоговой строке элементы объединяются между собой при помощи строки-разделителя str
.
Если в последовательности iterable
есть какие-либо НЕ строковые значения, включая байтовые строки bytes
, то поднимается исключение TypeError
.
>>> x = ['возвращает', 'строку', 'которая',
'является', 'конкатенацией']
# объединение списка строк с разделителем "пробел"
>>> line = ' '.join(x)
>>> line
# 'возвращает строку которая является конкатенацией'
# в качестве разделителя символ новой строки '\n'
>>> line = '\n'.join(x)
>>> line
# 'возвращает\nстроку\nкоторая\nявляется\nконкатенацией'
>>> print(line)
# возвращает
# строку
# которая
# является
# конкатенацией
Очень часто метод str.join()
используется для формирования какого то итогового сообщения, в зависимости от условий в программе. В начале кода определяется пустой список, а по ходу программы, в результате проверок, добавляются части выходного сообщения (например при проверке корректности заполнения полей формы).
В примере будем использовать словарь из двух списков - error
(для ошибок) и message
(для итогового сообщения):
# здесь поступают какие то данные, пускай
# num - должно быть целым числом
# name - имя, которое должно быть не менее 3-х букв
content = {'message': [], 'error': []}
# далее идет код проверок например:
if num:
if type(num) is int:
content['message'].append(f' - Введено число {num}')
else:
content['error'].append(f' - {num} - это не целое число')
else:
content['error'].append(' - Вы не ввели число')
if name:
if len(name) > 3:
content['message'].append(f' - Введено имя: {name}')
else:
content['error'].append(' - Имя не должно быть короче 3-х букв')
else:
content['error'].append(' - Вы не ввели имя')
# в конце кода итоговые проверки и вывод сообщения
if content['error']:
# если есть какие-то ошибки
content['error'].insert(0, 'При вводе данных возникли ошибки:\n')
result_message = '\n'.join(content['error'])
else:
# если все хорошо.
content['message'].insert(0, 'Результаты ввода данных:\n')
result_message = '\n'.join(content['message'])
print(result_message)
Очень просто. Необходимо существующую строку добавить в начало списка методом изменяющихся последовательностей sequence.insert(i, x)
, а затем применить метод str.join()
.
# начальная строка
>>> line = 'Состав корзины покупателя:'
# список строк, которые нужно добавить
>>> lst_line = ['- картошка', '- морковь', '- лук', '- чеснок', '- свекла']
# вставляем начальную строку по индексу 0 в список
>>> lst_line.insert(0, line)
# объединяем список строк по разделителю '\n'
>>> rez = '\n'.join(lst_line)
>>> print(rez)
# Состав корзины покупателя:
# - картошка
# - морковь
# - лук
# - чеснок
# - свекла
Конечно данную операцию можно осуществить другим способом, при помощи оператора присваивания на месте +=
. Но такой код будет работать значительно дольше и потреблять больше памяти, особенно это заметно, когда строк очень много.
Это происходит потому, что строка str
- это неизменяемый тип и при конкатации (сложении строк) КАЖДЫЙ РАЗ образуется НОВАЯ строка, на что тратятся ресурсы системы:
>>> line = 'Состав корзины покупателя:'
# список строк, которые нужно добавить
>>> lst_line = ['- картошка', '- морковь', '- лук', '- чеснок', '- свекла']
>>> for add_line in lst_line:
... line += f'\n{add_line}'
...
print(line)
# Состав корзины покупателя:
# - картошка
# - морковь
# - лук
# - чеснок
# - свекла