Привет. Меня зовут Жебрак Александр, я работаю ведущим программистом в компании Mail.Ru Group в отделе внутренней разработки. На этой неделе мы поговорим с вами о коллекциях, о новых типах данных, а также о функциях и о функциональном программировании, как это устроено в Python, какие там особенности и так далее. Начнем с коллекций, конкретно со списков. Коллекция — это переменная-контейнер, в которой может содержаться какое-то количество объектов, эти объекты могут быть одного типа или разного. В случае списков это упорядоченные наборы элементов, которые могут быть разных типов. Собственно, списки определяются с помощью квадратных скобочек или с помощью вызова литерала list. Вы также можете создать список из одинаковых значений с помощью умножения. Чаще всего списки содержат переменные одного типа, например, строки. Однако бывает, что нужно добавлять в списки переменные разных типов. Это тоже возможно. Также списки могут содержать другие коллекции, как, например, user_data. Однако для таких данных чаще всего используются кортежи, о которых мы поговорим чуть позже. Чтобы получить длину списка, можно вызвать встроенную функцию len. И, как вы видите, для определения списка не нужно заранее знать длину списка, который вы создаете, списки изменяемые, и Python обо всем заботится о вас. Также интересно, что функция len выполняется за константное время, то есть не происходит full scan. Python делает все очень быстро. Чтобы получить доступ к какому-то конкретному элементу списка, мы обращаемся по индексу к нему, также как и в строчках. Например, чтобы получить первый элемент, мы обращаемся по нулевому индексу, так как списки нумеруются с 0, а чтобы последний — к −1. Также индексы можно использовать для того, чтобы менять какие-то элементы внутри списка, например, мы можем заменить set на frozenset, обратившись к переменной по третьему индексу. Если мы обратимся по индексу, которого не существует, Python выдаст вам ошибку, скажет, что list index out of range, значит, что такого индекса еще нет. Опять же, ошибки в Python'е очень говорящие. Читайте их, не бойтесь, они вам скажут, что именно произошло не так. Также можно проверить, существует ли конкретный объект в списке, с помощью оператора in. Например, у нас есть tuple в наших collections. Также списки поддерживают срезы так же, как и строки, работает все точно так же. Например, мы можем получить определенный набор элементов с помощью среза от первого до третьего. Последний индекс не включается, будьте внимательны, и так как элементы в списках нумеруются с 0, у нас не включается 0 здесь. Мы можем опустить второй индекс и таким образом получить все элементы, начиная с третьего индекса, или, наоборот, до пятого индекса. Также мы можем опустить оба, и начальный и конечный индекс, и, например, скакать через один, получая только четные элементы списка. Мы можем также разворачивать список, обращаясь к −1 или делать более сложные операции, которые довольно редко встречаются, но важно представлять, что именно там происходит. Также важно знать, что при получении среза у вас создается новый объект, то есть получается новый список в этот момент. Списки, как и все коллекции, поддерживают протокол итерации, значит, мы можем использовать цикл for для того, чтобы итерироваться по элементам списка. Обратите внимание, что итерации происходят именно по элементам списка, а не по индексам, как во многих языках. Например, мы можем итерироваться по нашим collections и выводить текущую коллекцию. Обратите внимание, мы используем функцию format, которую вы уже, скорее всего, знаете, для форматирования строк. Часто бывает нужно выводить не только элемент списка, а также его индекс. Для этого существует встроенная функция enumerate, которая возвращает индекс и текущий элемент. Например, мы можем вывести collection и соответствующий индекс. Так как списки являются изменяемыми структурами данных, мы можем добавлять и удалять элементы. Для добавления элемента в список существует встроенный метод списка append, который добавляет переданную переменную в конец списка. Например, мы можем добавить в наши collections OrderedDict. Если вам нужно расширить список каким-то другим списком, вы можете использовать метод extend, который добавляет переданный список в конец вашего списка. Также можно использовать перегруженный оператор +, который делает логичную вещь, он добавляет переменную в конец, так же как append или extend. Если вам нужно удалить какой-то элемент списка, можно использовать оператор del и указать индекс, который вы хотите удалить. Также существуют несколько полезных встроенных функций, которые помогут вам работать со списками, это min, max и sum. Они делают именно то, как называются, то есть, мы можем получить минимальный элемент, максимальный элемент или сумму элементов списка. Еще один полезный метод, который работает со списками и строками, это метод строки join. Он позволяет взять список и форматировать строку с помощью разделителя какого-то. Например, мы можем создать список тегов python, course и coursera и отформатировать строку таким образом. Еще одна часто встречающаяся операция со списками — это сортировка. В Python'е существует несколько методов сортировки, о которых мы сейчас с вами поговорим, а для начала создадим случайный список с помощью встроенного модуля random. Это модуль стандартной библиотеки, который вам не нужно дополнительно устанавливать. Создадим пустой список и в цикле добавим в него случайный элемент с помощью функции append, как вы видите. Обратите внимание, что в цикле for используется для итерации нижнее подчеркивание, эта переменная говорит о том, что нам не важно, что именно присваивается при итерации. Таким образом, нам важно, что происходит итерация 10 раз, 10 раз присваивается новый элемент, а переменная сама нам не важна. У нас получился какой-то список, давайте попробуем его отсортировать. Для сортировки в Python'е существует встроенная функция sorted, которая возвращает отсортированный список. Все очень просто и логично. Обратите внимание, что список возвращается именно новый, то есть старый список сохраняется неизменным. Если вам нужно изменить список, который вы имеете уже, можно использовать метод списка sort, который изменяет список inplace, сортирует его inplace. Если вам нужно отсортировать список в обратном порядке, можно передать аргумент reverse=True в функцию sorted или в функцию sort метод списка. Также существует встроенная функция reversed, которая возвращает некий reverse iterator. Мы об итераторах поговорим позднее, пока важно понимать, что это просто объект, который поддерживает протокол итерации, и можно его преобразовать в список, а получится, в принципе, то же самое. Кроме методов, которые мы обсудили в этом видео, существует также много других, о которых вы можете почитать в документации, например, метод index или insert. Собственно, в документации все про них подробно написано, не бойтесь это смотреть. А следующей структурой данных, о которой мы поговорим в этом видео, являются кортежи. Кортежи, по сути, это неизменяемые списки, то есть это какой-то упорядоченный набор объектов, который мы не можем изменить - мы не можем ни добавлять, ни удалять элементы из него. Кортежи определяются с помощью круглых скобочек или литерала tuple. Например, мы можем создать кортеж immutables, куда положим неизменяемые типы наши. Если мы попробуем в качестве нулевого элемента сделать float, у нас выведется ошибка, потому что кортежи неизменяемы. Однако будьте внимательны, несмотря на то что сами кортежи неизменяемые, объекты внутри них могут быть изменяемыми. Например, если у нас кортеж содержит список, мы можем добавлять элементы в этот список. Например, мы можем присоединить нолик. Также важная особенность кортежей — у них есть функция hash, к ним применяется функция hash, и поэтому они могут использоваться в качестве ключей в словарях, о которых мы поговорим чуть позднее. Будьте внимательней при определении кортежа из одного элемента, не забывайте писать запятую, потому что если вы забудете про нее, то Python сочтет вашу переменную типом int. Итак, в этом видео мы с вами поговорили про списки. Списки — это упорядоченный и изменяемый набор объектов. Они поддерживают итерацию, вы можете применять к ним срезы или обращаться к элементам по индексам. Также в них довольно много встроенных методов и каких-то функций, которые вы можете использовать вместе со списками. Также мы разобрали кортежи. Кортежи — это неизменяемая версия списков, и кортежи могут использоваться в качестве ключей в словарях. В следующем видео мы посмотрим с вами на задачу на изученный материал.