В этой и следующей главе вы узнаете, что такое списки и как начать работать с их элементами. Списки позволяют хранить в одном месте взаимосвязанные данные, сколько бы ни было элементов — несколько или миллионы. Работа со списками — одна из самых выдающихся возможностей Python, доступных для начинающего программиста. Операции со списками связывают воедино многие важные концепции в программировании.
Список представляет собой набор элементов, следующих в определенном порядке. Вы можете создать список для хранения букв алфавита, цифр от 0 до 9 или имен всех членов вашей семьи. В список можно поместить любую информацию, причем данные в списке даже не обязаны быть как-то связаны друг с другом. Список обычно содержит более одного элемента, поэтому рекомендуется присваивать спискам имена во множественном числе: letters, digits, names и т.д.
В языке Python список обозначается квадратными скобками ([]), а отдельные его элементы разделяются запятыми. Вот простой пример списка, содержащего названия моделей велосипедов:
bicycles.py
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles)
Если вы прикажете Python вывести список, то на экране появится перечисление элементов списка в квадратных скобках:
['trek', 'cannondale', 'redline', 'specialized']
Конечно, вашим пользователям такое представление не подойдет; разберемся, как обратиться к отдельным элементам в списке.
Списки представляют собой упорядоченные наборы данных, поэтому для обращения к любому элементу списка следует сообщить Python позицию (индекс) нужного элемента. Чтобы обратиться к элементу, укажите имя списка, за которым следует индекс элемента в квадратных скобках.
Например, название первого велосипеда в списке bicycles выводится следующим образом:
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[0])
Когда мы запрашиваем один элемент из списка, Python возвращает только этот элемент без квадратных скобок или кавычек:
trek
Именно такой результат должны увидеть пользователи — чистый, отформатированный вывод.
Кроме того, можно использовать и строковые методы из главы 2 для любого элемента списка. Например, элемент 'trek' можно отформатировать с помощью метода title():
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[0].title())
Этот пример выдает такой же результат, как и предыдущий, только название 'Trek' выводится с прописной буквы.
Python считает, что первый элемент списка находится в позиции 0, а не в позиции 1. Этот принцип встречается в большинстве языков программирования и объясняется особенностями низкоуровневой реализации операций со списками. Если вы получаете неожиданные результаты, то определите, не допустили ли простую ошибку «смещения на 1».
Второму элементу списка соответствует индекс 1. В этой простой схеме вы можете получить любой элемент, вычитая единицу из его позиции в списке. Например, чтобы обратиться к четвертому элементу списка, следует запросить элемент с индексом 3.
В следующем примере выводятся названия велосипедов с индексами 1 и 3:
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[1])
print(bicycles[3])
При этом выводится второй и четвертый элементы списка:
cannondale
specialized
Кроме того, в Python существует специальный синтаксис для обращения к последнему элементу списка. Если запросить элемент с индексом –1, то Python всегда возвращает последний элемент в списке:
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
print(bicycles[-1])
Фрагмент вернет значение 'specialized'. Этот синтаксис весьма полезен, поскольку при работе со списками часто требуется обратиться к последним элементам, не зная точного количества элементов в списке. Синтаксис распространяется и на другие отрицательные значения индексов. По индексу –2 возвращается второй элемент от конца списка, по индексу –3 — третий элемент от конца и т.д.
Отдельные значения из списка используются так же, как и любые другие переменные. Например, с помощью f-строк вы можете создать сообщение, содержащее значение из списка.
Попробуем извлечь название первого велосипеда из списка и составить сообщение, используя это значение.
bicycles = ['trek', 'cannondale', 'redline', 'specialized']
message = f"My first bicycle was a {bicycles[0].title()}."
print(message)
Программа создает сообщение, содержащее значение из bicycles[0], и сохраняет его в переменной message. Так получается простое предложение с упоминанием первого велосипеда из списка:
My first bicycle was a Trek.
Упражнения
Попробуйте написать несколько коротких программ, чтобы получить предварительное представление о списках Python. Возможно, для упражнений каждой главы стоит создать отдельную папку, чтобы избежать неразберихи.
3.1. Имена. Сохраните имена нескольких своих друзей в списке names. Выведите имя каждого друга, обратившись к каждому элементу списка (по одному за раз).
3.2. Сообщения. Начните со списка, использованного в упражнении 3.1, но вместо вывода имени каждого человека выведите сообщение. Основной текст всех сообщений должен быть одинаковым, но каждое сообщение должно содержать имя адресата.
3.3. Собственный список. Выберите ваш любимый вид транспорта (например, мотоциклы или машины) и создайте список с примерами. Используйте список для вывода утверждений об элементах, например: «Я хотел бы купить мотоцикл Honda».
Чаще всего вы будете создавать динамические списки; это означает, что во время выполнения программы в таком списке будут добавляться и удаляться элементы. Например, вы можете создать игру, в которой игрок должен стрелять по кораблям космических захватчиков. Исходный набор кораблей сохраняется в списке; каждый раз, когда вы сбиваете корабль, он удаляется из списка. Каждый раз, когда на экране появляется новый враг, он добавляется в список. Длина списка кораблей будет уменьшаться и увеличиваться по ходу игры.
Синтаксис изменения элемента напоминает синтаксис обращения к элементу списка. Чтобы изменить элемент, укажите имя списка и индекс изменяемого элемента в квадратных скобках; далее задайте новое значение, которое должно быть присвоено элементу.
Допустим, имеется список мотоциклов, и первый его элемент — строка 'honda'. Мы можем изменить значение этого элемента после того, как список будет создан:
motorcycles.py
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
motorcycles[0] = 'ducati'
print(motorcycles)
В коде определяется список motorcycles, первый элемент которого содержит строку 'honda'. Значение первого элемента заменяется строкой 'ducati'. Из вывода видно, что первый элемент действительно изменился, тогда как остальные элементы списка сохранили прежние значения:
['honda', 'yamaha', 'suzuki']
['ducati', 'yamaha', 'suzuki']
Изменить можно значение любого элемента в списке, а не только первого.
Новые элементы могут добавляться в списки по разным причинам: например, для ввода новых космических кораблей в игру, новых данных в визуализацию или новых зарегистрированных пользователей созданного вами сайта. Python предоставляет несколько способов добавить новые данные в существующие списки.
Простейший способ добавления новых элементов в список — присоединение элемента в конец списка. Используя список из предыдущего примера, добавим новый элемент 'ducati' в конец списка:
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
motorcycles.append('ducati')
print(motorcycles)
Метод append() добавляет строку 'ducati' в конец списка, при этом другие элементы в нем остаются неизменными:
['honda', 'yamaha', 'suzuki']
['honda', 'yamaha', 'suzuki', 'ducati']
Метод append() упрощает динамическое создание списков. Например, вы можете начать с пустого списка и добавлять в него элементы, используя серию команд append(). В следующем примере в пустой список добавляются элементы 'honda', 'yamaha' и 'suzuki':
motorcycles = []
motorcycles.append('honda')
motorcycles.append('yamaha')
motorcycles.append('suzuki')
print(motorcycles)
Полученный список выглядит точно так же, как и списки из предыдущих примеров:
['honda', 'yamaha', 'suzuki']
Такой способ создания списков встречается очень часто, поскольку данные, которые пользователь захочет сохранить в программе, часто становятся известны только после запуска программы. Чтобы пользователь мог управлять содержимым списка, начните с определения пустого списка, а затем добавляйте в него каждое новое значение.
Метод insert() позволяет добавить новый элемент в произвольную позицию списка. Для этого следует указать индекс и значение нового элемента.
motorcycles = ['honda', 'yamaha', 'suzuki']
motorcycles.insert(0, 'ducati')
print(motorcycles)
В этом примере значение 'ducati' вставляется в начало списка. Метод insert() выделяет свободное место в позиции 0 и сохраняет в нем значение 'ducati':
['ducati', 'honda', 'yamaha', 'suzuki']
Эта операция сдвигает все остальные значения в списке на одну позицию вправо.
Нередко возникает необходимость в удалении одного или нескольких элементов из списка. Например, сбитый в игре корабль пришельца стоит удалить из списка активных врагов. Или пользователь решает удалить свою учетную запись в созданном вами веб-приложении, и тогда этого пользователя следует удалить из списка активных пользователей. Элементы удаляются из списка по позиции или по значению.
Если вам известна позиция элемента, который должен быть удален из списка, воспользуйтесь оператором del:
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
del motorcycles[0]
print(motorcycles)
Оператор del удаляет первый элемент, 'honda', из списка motorcycles:
['honda', 'yamaha', 'suzuki']
['yamaha', 'suzuki']
С помощью оператора del вы можете удалить элемент из любой позиции списка, если вам известен его индекс. Например, вот как из списка удаляется второй элемент 'yamaha':
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
del motorcycles[1]
print(motorcycles)
Второй элемент исчез из списка:
['honda', 'yamaha', 'suzuki']
['honda', 'suzuki']
В обоих примерах значение, удаленное из списка после использования оператора del, становится недоступным.
Иногда значение, удаляемое из списка, должно как-то использоваться. Допустим, вы хотите получить координаты x и y только что сбитого корабля пришельцев, чтобы изобразить взрыв в этой позиции. В веб-приложении пользователя, удаленного из списка активных участников, можно добавить в список неактивных и т.д.
Метод pop() удаляет последний элемент из списка, но позволяет работать с ним после удаления. Термин pop («выталкивание») возник из-за того, что список представляет собой стопку элементов и один элемент выталкивается из вершины стопки. В этой аналогии вершина стека соответствует концу списка.
Удалим мотоцикл из списка:
❶ motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)
❷ popped_motorcycle = motorcycles.pop()
❸ print(motorcycles)
❹ print(popped_motorcycle)
Сначала определяется и выводится содержимое списка motorcycles ❶. Затем значение извлекается из списка и сохраняется в переменной popped_motorcycle ❷. Вывод измененного списка ❸ показывает, что значение было удалено из списка. Затем мы выводим извлеченное значение ❹, демонстрируя, что удаленное из списка значение остается доступным в программе.
Из вывода видно, что значение 'suzuki', удаленное в конце списка, теперь хранится в переменной popped_motorcycle:
['honda', 'yamaha', 'suzuki']
['honda', 'yamaha']
suzuki
Для чего может понадобиться метод pop()? Представьте, что информация о мотоциклах хранится в списке в хронологическом порядке, соответствующем дате их покупки. В таком случае команда pop() может использоваться для вывода сообщения о последнем купленном мотоцикле:
motorcycles = ['honda', 'yamaha', 'suzuki']
last_owned = motorcycles.pop()
print(f"The last motorcycle I owned was a {last_owned.title()}.")
Программа выводит простое сообщение:
The last motorcycle I owned was a Suzuki.
Вызов pop() может использоваться для удаления элемента в произвольной позиции списка; для этого следует указать индекс удаляемого элемента в круглых скобках:
motorcycles = ['honda', 'yamaha', 'suzuki']
first_owned = motorcycles.pop(0)
print(f"The first motorcycle I owned was a {first_owned.title()}.")
Сначала первый элемент извлекается из списка, а затем выводится сообщение об этом мотоцикле. Программа выдает простое сообщение о мотоцикле, который был куплен первым:
The first motorcycle I owned was a Honda.
Помните, что после каждого вызова pop() элемент, с которым вы работаете, уже не находится в списке.
Если вы не уверены в том, что выбрать: оператор del или метод pop(), — вам поможет простое правило: если вы собираетесь просто удалить элемент из списка, никак не используя его после удаления, то выбирайте оператор del; в противном случае выбирайте метод pop().
Иногда позиция удаляемого элемента неизвестна. Если вы знаете только значение элемента, то используйте метод remove().
Допустим, из списка нужно удалить значение 'ducati':
motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati']
print(motorcycles)
motorcycles.remove('ducati')
print(motorcycles)
Благодаря методу remove() Python получает указание выяснить, в какой позиции списка находится значение 'ducati', и удалить этот элемент:
['honda', 'yamaha', 'suzuki', 'ducati']
['honda', 'yamaha', 'suzuki']
Кроме того, метод remove() может использоваться для работы со значением, которое удаляется из списка. Следующая программа удаляет значение 'ducati' и выводит причину удаления:
❶ motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati']
print(motorcycles)
❷ too_expensive = 'ducati'
❸ motorcycles.remove(too_expensive)
print(motorcycles)
❹ print(f"\nA {too_expensive.title()} is too expensive for me.")
После определения списка ❶ значение 'ducati' сохраняется в переменной too_expensive ❷. Затем эта переменная сообщает Python, какое значение должно быть удалено из списка ❸. Значение 'ducati' было удалено из списка ❹, но продолжает храниться в переменной too_expensive, что позволяет вывести сообщение, в котором указывается причина удаления 'ducati' из списка мотоциклов:
['honda', 'yamaha', 'suzuki', 'ducati']
['honda', 'yamaha', 'suzuki']
A Ducati is too expensive for me.
ПРИМЕЧАНИЕ
Метод remove() удаляет только первое вхождение заданного значения. Если существует вероятность того, что значение встречается в списке несколько раз, то используйте цикл, чтобы определить, были ли удалены все вхождения данного значения. О том, как это делать, рассказано в главе 7.
Упражнения
Следующие упражнения немного сложнее упражнений из главы 2, но дают возможность попрактиковаться в выполнении всех описанных операций со списками.
3.4. Список гостей. Если бы вы могли пригласить на обед кого угодно (из живых или умерших), то кто бы это был? Создайте список минимум из трех человек. Затем используйте его для вывода пригласительного сообщения каждому участнику.
3.5. Изменение списка гостей. Вы только что узнали, что один из гостей не сможет прийти, поэтому вам придется разослать новые приглашения. Отсутствующего гостя нужно заменить кем-то другим.
• Начните с программы из упражнения 3.4. Добавьте в конец кода вызов функции print() для вывода имени гостя, который не сможет прийти.
• Измените список и замените имя гостя, который прийти не сможет, именем нового приглашенного.
• Выведите новый набор сообщений с приглашениями — по одному для каждого участника, входящего в список.
3.6. Больше гостей. Вы решили купить обеденный стол большего размера. Дополнительные места позволяют пригласить на обед еще трех гостей.
• Начните с программы из упражнения 3.4 или 3.5. Добавьте в конец кода вызов функции print() для вывода сообщения о том, что вы нашли стол большего размера.
• Добавьте вызов insert() для добавления одного нового гостя в начало списка.
• Добавьте вызов insert() для добавления одного нового гостя в середину списка.
• Добавьте вызов append() для добавления одного нового гостя в конец списка.
• Выведите новый набор сообщений с приглашениями — по одному для каждого участника, входящего в список.
3.7. Сокращение списка гостей. Только что выяснилось, что новый обеденный стол привезти вовремя не успеют и места хватит только для двух гостей.
• Начните с программы из упражнения 3.6. Добавьте команду для вывода сообщения о том, что на обед приглашаются всего два гостя.
• Используйте метод pop() для последовательного удаления гостей из списка до тех пор, пока в нем не останутся только два человека. Каждый раз, когда из списка удаляется очередное имя, выведите для этого человека сообщение о том, что вы сожалеете об отмене приглашения.
• Выведите сообщение для каждого из двух человек, остающихся в списке. Оно должно подтверждать, что более раннее приглашение остается в силе.
• Используйте оператор del для удаления двух последних имен, чтобы список остался пустым. Выведите список, чтобы убедиться в том, что в конце работы программы список действительно не содержит ни одного элемента.
Нередко список создается в непредсказуемом порядке, поскольку очередность получения данных от пользователя не всегда находится под вашим контролем. И хотя во многих случаях такое положение дел неизбежно, часто требуется вывести информацию в определенном порядке. В одних случаях требуется сохранить исходный порядок элементов в списке, в других этот порядок должен быть изменен. Python предоставляет несколько разных способов упорядочения списка в зависимости от ситуации.
Метод sort() позволяет относительно легко отсортировать список. Допустим, имеется список машин, и вы хотите изменить порядок, расставив элементы по алфавиту. Чтобы упростить задачу, предположим, что все значения в списке состоят из символов нижнего регистра.
cars.py
cars = ['bmw', 'audi', 'toyota', 'subaru']
cars.sort()
print(cars)
Метод sort() изменяет порядок элементов в списке навсегда. Названия машин располагаются в алфавитном порядке, и вернуться к исходному порядку уже не удастся:
['audi', 'bmw', 'subaru', 'toyota']
Список также можно отсортировать в обратном алфавитном порядке; для этого методу sort() следует передать аргумент reverse=True:
cars = ['bmw', 'audi', 'toyota', 'subaru']
cars.sort(reverse=True)
print(cars)
И снова порядок элементов изменяется навсегда:
['toyota', 'subaru', 'bmw', 'audi']
Чтобы сохранить исходный порядок элементов списка, но временно представить их в отсортированном порядке, можно воспользоваться функцией sorted(). Она позволяет представить список в определенном порядке, но не изменяет фактический порядок элементов в списке.
Попробуем применить эту функцию к списку машин:
cars = ['bmw', 'audi', 'toyota', 'subaru']
❶ print("Here is the original list:")
print(cars)
❷ print("\nHere is the sorted list:")
print(sorted(cars))
❸ print("\nHere is the original list again:")
print(cars)
Сначала список выводится в исходном порядке ❶, а затем в алфавитном ❷. После того как список будет выведен в новом порядке, мы убеждаемся в том, что список все еще хранится в исходном порядке ❸:
Here is the original list:
['bmw', 'audi', 'toyota', 'subaru']
Here is the sorted list:
['audi', 'bmw', 'subaru', 'toyota']
❶ Here is the original list again:
['bmw', 'audi', 'toyota', 'subaru']
Обратите внимание: после вызова функции sorted() список продолжает храниться в исходном порядке ❶. Функции также можно передать аргумент reverse=True, чтобы список был представлен в порядке, обратном алфавитному.
ПРИМЕЧАНИЕ
Сортировка списка по алфавиту немного усложняется, если не все значения записаны в нижнем регистре. При определении порядка сортировки появляются разные способы интерпретации прописных букв, и точное определение порядка может оказаться более сложной задачей, чем нам хотелось бы в текущий момент. Однако большинство подходов к сортировке строятся на принципах, описанных в этом подразделе.
Чтобы переставить элементы списка в обратном порядке, используйте метод reverse(). Например, если список машин первоначально хранился в хронологическом порядке, соответствующем дате приобретения, то элементы можно переставить в обратном хронологическом порядке:
cars = ['bmw', 'audi', 'toyota', 'subaru']
print(cars)
cars.reverse()
print(cars)
Обратите внимание: метод reverse() не сортирует элементы в обратном алфавитном порядке, а просто меняет порядок списка на обратный:
['bmw', 'audi', 'toyota', 'subaru']
['subaru', 'toyota', 'audi', 'bmw']
Метод reverse() изменяет порядок элементов навсегда, но вы можете легко вернуться к исходному порядку, снова применив reverse() к обратному списку.
Быстро определить длину списка позволяет функция len(). Список в нашем примере состоит из четырех элементов, поэтому его длина равна 4:
>>> cars = ['bmw', 'audi', 'toyota', 'subaru']
>>> len(cars)
4
С помощью функции len() можно определять количество пришельцев, которых необходимо сбить в игре; устанавливать объем данных, которыми необходимо управлять в визуализации; вычислять количество зарегистрированных пользователей на сайте и т.д.
ПРИМЕЧАНИЕ
Python подсчитывает элементы списка, начиная с 1, поэтому при определении длины списка ошибок «смещения на 1» уже быть не должно.
Упражнения
3.8. Повидать мир. Вспомните хотя бы пять стран, в которых вам хотелось бы побывать.
• Сохраните названия стран в списке. Проследите за тем, чтобы он не хранился в алфавитном порядке.
• Выведите список в исходном порядке. Не беспокойтесь об оформлении, просто выведите его как обычный список Python.
• Используйте функцию sorted() для вывода списка в алфавитном порядке без изменения списка.
• Снова выведите список, чтобы показать, что он по-прежнему хранится в исходном порядке.
• Используйте функцию sorted() для вывода списка в обратном алфавитном порядке без изменения порядка исходного списка.
• Снова выведите список, чтобы показать, что исходный порядок не изменился.
• Измените порядок элементов, вызвав метод reverse(). Выведите список, чтобы показать, что элементы следуют в другом порядке.
• Измените порядок элементов, повторно вызвав reverse(). Выведите список, чтобы показать, что список вернулся к исходному порядку.
• Отсортируйте список в алфавитном порядке, вызвав sort(). Выведите список, чтобы показать, что элементы следуют в другом порядке.
• Вызовите sort(), чтобы переставить элементы списка в обратном алфавитном порядке. Выведите список, чтобы показать, что порядок элементов изменился.
3.9. Количество гостей. В одной из программ из упражнений 3.4–3.7 используйте функцию len() для вывода сообщения, в котором указано количество людей, приглашенных на обед.
3.10. Все функции. Придумайте, какую информацию вы могли бы хранить в списке. Например, создайте список гор, рек, стран, городов, языков… словом, чего угодно. Напишите программу, которая создает список элементов, а затем вызывает каждую функцию, упоминавшуюся в этой главе, хотя бы один раз.
Когда программист только начинает работать со списками, он часто допускает одну характерную ошибку. Например, имеется список с тремя элементами, и программа запрашивает четвертый:
motorcycles.py
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles[3])
В этом случае происходит ошибка индексирования:
Traceback (most recent call last):
File "motorcycles.py", line 2, in <module>
print(motorcycles[3])
~~~~~~~~~~~^^^
IndexError: list index out of range
Python пытается вернуть элемент с индексом 3. Однако при поиске по списку ни у одного элемента motorcycles нет этого индекса. Из-за смещения индексов на 1 эта ошибка весьма распространена. Люди думают, что третьим является элемент с индексом 3, поскольку начинают отсчет с 1. Но для Python третьим является элемент с индексом 2, так как индексирование начинается с 0.
Ошибка индексирования означает, что Python не может понять, какой индекс запрашивается в программе. Если в вашей программе происходит ошибка индексирования, то попробуйте уменьшить запрашиваемый индекс на 1. Затем снова запустите программу и проверьте правильность результатов.
Помните, что для обращения к последнему элементу в списке используется индекс –1. Этот способ работает всегда, даже если размер списка изменился с момента последнего обращения к нему:
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles[-1])
Индекс –1 всегда возвращает последний элемент списка, в данном случае значение 'suzuki':
'suzuki'
Этот синтаксис порождает ошибку только в одном случае — при попытке получить последний элемент пустого списка:
motorcycles = []
print(motorcycles[-1])
В списке motorcycles нет ни одного элемента, поэтому Python снова выдает ошибку индексирования:
Traceback (most recent call last):
File "motorcyles.py", line 3, in <module>
print(motorcycles[-1])
~~~~~~~~~~~^^^^
IndexError: list index out of range
ПРИМЕЧАНИЕ
Если в вашей программе произошла ошибка индексирования и вы не знаете, как ее исправить, попробуйте вывести список или хотя бы его длину. Возможно, ваш список выглядит совсем не так, как вы думаете, особенно если его содержимое динамически определялось программой. Фактическое состояние списка или точное количество элементов в нем поможет выявить логические ошибки такого рода.
Упражнения
3.11. Намеренная ошибка. Если ни в одной из предшествующих программ вы еще не сталкивались с ошибками индексирования, то попробуйте создать такую ошибку искусственно. Измените индекс в одной из программ, чтобы вызвать ошибку индексирования. Не забудьте исправить ошибку, прежде чем закрывать программу.
В этой главе вы узнали, что такое списки и как работать с их отдельными элементами. Вы научились определять списки, добавлять и удалять элементы, выполнять сортировку (постоянную или временную в целях отображения). Кроме того, вы узнали, как определить длину списка и избежать ошибок индексирования при работе с ним.
В главе 4 рассматриваются приемы более эффективной работы со списками. Перебор всех элементов списка всего в нескольких строках кода, даже если список содержит тысячи или миллионы элементов, сокращает объем работы.