[МУЗЫКА] [МУЗЫКА] Теперь вернемся к спискам. Для того чтобы работать с отдельными элементами списка, делать что-то полезное, например, считать количество или как-то изменять список особым образом, можно использовать цикл for, который будет по нему ходить, или даже цикл while, находить нужные элементы и какие-то действия с ними совершать. Во многих других языках программирования так и делается, и любую какую-то операцию нужно описывать с помощью цикла или придумывать какой-то способ, как это сделать. В Python можно делать точно так же, но для некоторых частных операций существуют уже написанные готовые методы, которые позволяют нам не только писать меньше букв, но и соответственно меньше ошибаться, но и работать будут быстрее. Из-за того, что язык Python интерпретируемый, а стандартные методы работают намного быстрее, чем что-либо, написанное руками. Давайте посмотрим, какие полезные методы есть и как об их существовании можно узнать. Например, создадим какой-нибудь константный список, достаточно длинный, потому что сейчас нам это будет нужно. У нас есть повторяющиеся элементы. Задача: посчитать количество вхождений какого-то элемента в список. Например, мы хотим посчитать, сколько двоек в нашем списке. Для этого существует метод count, который позволяет узнать количество. Параметр у него — что, какие объекты мы считаем — двойки. Запустим, вот у нас три двойки в нашем списке, и действительно их три. А троек в нашем списке – 2, а десяток в нашем списке – 0. То есть название списка, точка, count — что мы считаем. Работает это за линейное время. То есть если в вашем списке миллиард элементов, то вам придется совершить миллиард операций, пройтись по всем элементам, каждый из них сравнить и увеличить счетчик. Это практически то же самое, как если бы вы решали эту задачу вручную, то есть создали счетчик, присвоили нулю, прошлись по всем элементам, сравнили. Если элементы совпадают, увеличили счетчик на 1. Внутри оно реализовано именно так, но писать, согласитесь, гораздо проще. Посмотрим, как можно узнавать, какие полезные методы есть для списков — способ нам знакомый. Пишем список, ставим точку, и у нас всплывает в среде программирования весь список, что можно сделать со списком. Здесь есть какие-то пока для нас не очень нужные методы, начинающиеся с двух подчеркиваний, все нужные методы перечислены вначале. Их довольно много, давайте некоторые из них посмотрим, например, первый — это append метод. Print я пока уберу. Метод append позволяет добавить в конец списка какой-то новый элемент, при этом он изменяет содержимое списка. Если count не изменял ничего просто, проходил, сосчитал, то append изменит то, что там было. Например, мы приписали к нашему списку пятерку, и вот она оказалась в конце нашего списка. То есть элемент добавился. Если вам понадобилось что-то, то вы можете посмотреть, что там есть, набрав точку, и наверняка если это какая-то операция, которая часто в жизни возникает, то она существует в виде метода. Вот, например, extend. Что такое extend? extend — это добавить к содержимому списка, дописать, содержимое другого списка. Давайте создадим второй какой-нибудь список, не очень большой, чтобы проверить, что оно действительно работает. То есть мы сейчас к списку a дописываем содержимое списка b, точно так же в конец его добавляем. [БЕЗ СЛОВ] Вот он, 4 и 5 дописалось. Чем это отличается от записи? Казалось бы, зачем писать какой-то extend (меньше знаешь, крепче спишь), если мы знаем, что списки можно складывать между собой, как и многие другие объекты. То есть почему бы не вот так? Давайте посмотрим, что получается то же самое. Действительно, получается то же самое. extend можно заменить на сложение казалось бы. На самом деле, разница есть. Когда мы пишем операцию «плюс» — просто значок «плюс» для двух списков, у нас создается новый объект в памяти, в который сначала копируется первый объект, а потом копируется второй объект, даже не объект, а все содержимое в нашем случае объектов. Все элементы, которые лежали в списке a, затем все элементы, которые лежали в списке b, создается новый объект, и ссылка для переменной a начинает показывать на этот объект. А старое значение a больше никому не нужно, счетчик ссылок обнулился, и он исчезает. В большинстве случаев нет особой разницы, кроме того случая, когда вы передаете, например, функцию и хотите там сделать extend, тогда extend сделать можно, а сложение нельзя. Но есть ситуации, когда это очень сильно отличается по производительности и по потреблению памяти. Например, вам нужно постепенно слеплять и слеплять большую последовательность списков в один большой, длинный список. Если вы каждый раз будете делать операцию «плюс», то со временем у вас огромная накопившаяся первая часть будет тратить на свое копирование в начало другого списка огромное время. А если мы будем применять метод extend, то никакого копирования происходить не будет, будут просто к ней прилепляться достаточно короткие списки b. Поэтому extend имеет право на существование, и знать о том, что он есть, очень полезно. Что еще есть в списках? Теперь второй список нам не понадобится. Какие методы есть? Например, remove. Что такое remove? Удалить первое вхождение. Например, мы двойку хотим удалить, пишем: a.remove(2). Давайте посмотрим, что с нашим списком a случилось в результате этого. Пропала только первая двойка. То есть последние, которые у меня стояли с конца списка, они остались на своих местах. Похоже, в чем-то на строки, на замену строки на пустую строку, но и так понятно, что это такое. Существуют и другие методы, кроме remove — удаления первого элемента. На самом деле, он не так часто встречается, поэтому можете забыть о его существовании и вспомнить, только когда увидите его в списке методов. Что полезного еще есть? copy. copy позволяет создать копию списка и возвращает ее. Это то же самое, что если бы мы написали срез, содержащий все элементы. То есть теперь, когда мы сделали копию и поменяем что-то в списке a, то в b ничего не поменяется, мы это смотрели в начале занятия. Просто более логичный способ записи, чем взятие среза со всеми элементами. Давайте посмотрим, что b действительно не изменился. Да, b — это копия элементов. Ну и кратенько о других методах. insert. insert позволяет вставить в список какой-то элемент. Он позволяет вставить что-то куда-то. Например, 10, 2. Давайте посмотрим, что из этих параметров — что вставить, а что из этих параметров — куда вставить. Опытным путем мы получили, что список наш не изменился. Значит, видимо, первый параметр — куда вставить, а второй — что вставить. Давайте попробуем так. Да, вот теперь все правильно. Если вы забыли, в каком порядке у вас задаются параметры метода insert, можно экспериментально это установить. На вторую позицию — первый параметр у нас двойка, вставляется число 10. Вот оно вставилось. На самом деле можно было, немножко подумав, разобраться. Вот у нас подсветка в среде программирования показывает два параметра — i и x. i обычно — целое число, позиция, куда нужно вставлять. А под x понимается что угодно. Но это могло, если бы мы подумали, а не ставили эксперименты, могло нас навести на мысль, что целое число — это индекс, а что вставляется — в принципе, что угодно. И так мы могли получить подсказку о том, в каком порядке задаются параметры этой функции. Обратите внимание, что insert работает опять же за длину списка, то есть вам нужно раздвинуть этот список, покопировать все элементы, которые там лежали, освободить место и вставить. То есть операция достаточно сложная, и злоупотреблять insert куда-то в середину длинного списка не стоит. Это будет работать очень медленно. Может быть, стоит как-то придумать более эффективный алгоритм, когда у вас добавляться будет только в конец с помощью append. Это работает очень быстро. И наконец, еще один достаточно часто метод встречающийся, это pop. pop без параметров удаляет последний элемент списка. Это делается очень быстро, опять же всего за одну операцию. Можно сделать pop с парметром, с какой позиции удалить элемент. Например, с третьей позиции, у нас там стояла четверка. Вот она пропала, удалилась. Операция pop с параметром — это достаточно медленная операция, опять же все элементы явно копируются, переставляются на один, и после этого последний удаляется. То есть, опять же, pop надо по возможности избегать и придумать какой-то алгоритм, который удаляет только последние элементы, или сделать более хитрую конструкцию, которую мы изучим в следующем видео. [МУЗЫКА] [МУЗЫКА]