10-минутный экспресс-курс Python

Изучение Python по 10 минут в день #7

Самый универсальный тип данных в Python: список

Это серия коротких 10-минутных статей о Python, которые помогут вам расширить свои знания о Python. Я стараюсь публиковать статьи каждый день (никаких обещаний), начиная с самых основ и заканчивая более сложными идиомами. Не стесняйтесь обращаться ко мне в LinkedIn с вопросами или запросами по конкретным темам Python, о которых вы хотите узнать.

Сегодня мы рассмотрим списки, которые, возможно, являются рабочей лошадкой Python с точки зрения типов данных. Список можно рассматривать как своего рода контейнер, который может хранить все виды информации. Это могут быть числа, строки, функции или любой другой объект (помните, что в Python все представлено как объект?). Список Python чрезвычайно универсален, и вы можете смешивать и сочетать любой объект, который вам нравится. При желании вы можете поместить в свой список пару чисел, три строки и даже другие списки.

Да, списки можно вкладывать друг в друга, чтобы создать собственное «списковое представление».

Списки создаются с помощью встроенного класса list() или с использованием более короткой скобки. Важно помнить, что списки упорядочены. Это означает, что порядок добавления элементов в список сохраняется. Когда мы добавляем элементы в список, как следует из названия, элементы добавляются в конец. Используя метод pop(), мы можем удалить/получить последний элемент из списка. Pop также может удалить определенный элемент по индексу. Вот несколько примеров.

Список — это один из немногих изменяемых типов данных в Python. Float, int и даже String неизменяемы, и каждая операция создает новый экземпляр. Однако списки могут быть изменены. Например, вы можете добавлять элементы в список, фактически изменяя объект. Мы можем доказать это, используя встроенную функцию id(). Функция id возвращает адрес объекта в памяти и является уникальным идентификатором объекта. Давайте исследуем эти идентификаторы для int и списка:

Мы только что увидели, что можем вытолкнуть () последний элемент из списка. Чтобы получить элементы, не удаляя их, мы можем использовать метод индексации с использованием записи в скобках. Python начинает индексирование с нуля, поэтому первый элемент списка — my_list[0], второй элемент — my_list[1] и так далее. Как и при нарезке строк, индекс должен существовать, иначе вы получите ошибку «индекс вне диапазона». При выборе диапазонов вы получите новый экземпляр списка с подсписком. Как и в случае со строками, мы также можем индексировать назад, используя отрицательные значения, и указывать шаг. Возможно, вы не поняли этого со строками, но с отрицательным шагом вы можете перевернуть строку или список: my_list[::-1] или my_string[::-1]. Основная арифметика списков работает так, как и ожидалось: добавление двух списков выполняется с помощью +, а умножение выполняется с помощью *. Оба возвращают новый экземпляр списка. Чтобы создать копию списка, недостаточно просто написать мой_новый_список = мой_старый_список. Это просто копирует ссылку, а не сам список. Чтобы создать настоящий новый список, вам нужно явно создать его с помощью класса списка: my_new_list = list(my_old_list). Нарезка также возвращает новый экземпляр списка, поэтому вы также можете создать копию, просто нарезав «все»: my_new_list = my_old_list[:]. Однако этот последний трюк с нарезкой не работает со строками. Строки неизменяемы и поэтому не изменяются. Python достаточно умен, чтобы проверить, присутствует ли уже в памяти неизменяемый объект с требуемыми характеристиками, и вернуть указатель на этот объект. Следовательно, my_string[:] вернет ссылку на тот же объект, но внутри.

Существует множество встроенных методов для списков. Например, чтобы проверить длину списка, то есть количество элементов в списке, мы можем использовать метод len(). Это снова очень похоже на строки, в которых len() возвращает длину последовательности (количество символов). Причина, по которой у обоих так много общего, заключается в том, что оба типа созданы из класса iterable. Другими встроенными методами являются, например, min(), max(), sum(), count(), find(), reversed(), remove(),иsort(). . Не стесняйтесь проверять DocStrings этих методов, если вы хотите их использовать, или проверьте полный список методов с завершением табуляции.

В предыдущей статье мы узнали о ключевом слове in, которое можно использовать для поиска подстроки в строке. Это также работает с поиском элементов в списке. Список представляет собой упорядоченный контейнер ссылок, и он проверяет, есть ли ссылка на элемент в списке. Если это так, он вернет True, а в противном случае — False. Pythonic способ проверить, пуст ли список, состоит не в том, чтобы проверять, имеет ли список длину 0. Хотя это работает, список имеет свойство быть False, когда он пуст, и True, если он содержит хотя бы один элемент. Это делает пустой чек очень удобным.

Мы уже упоминали распаковку кортежей. Это метод систематического получения значений из итерируемого объекта, такого как список или кортеж. Он называется так, потому что обычно используется с кортежами, но точно так же работает со списками. Самый явный способ — указать имена переменных перед знаком равенства, разделенными запятыми, и итерацию справа: a, b = [1, 2]. Python также имеет оператор распаковки для списков, который представляет собой оператор *, помещенный перед списком. Интерпретатор распаковывает список следующим образом: [1, 2, 3] -> 1, 2, 3. Это полезно, если вы хотите передать функции отдельные параметры списка. Это также работает и наоборот:a, b, *c, d = [1, 2, 3, 4, 5]. В этой настройке первые два значения списка будут распакованы в переменные a и b, а последнее значение будет распаковано в d. Все промежуточные значения распаковываются в c. Чаще всего это наблюдается в функциях, которые могут принимать произвольное количество параметров с терминами *args и **kwargs. Здесь оператор ** — это распаковка отображения (словаря). Что именно это означает, в другой раз.

Практика на сегодня:

а. В новом блокноте создайте пустой список и добавьте пару значений (числовое, строковое и список). Можете ли вы также добавить значение в список внутри списка? подсказка: индексирование + добавление()

б. Со следующим списком:

my_list = ['This', 'is', 'a', 'list', 'of', 'words', '!']

Присоединитесь к списку, чтобы создать строку. подсказка: строка имеет метод join(), исключающий списки.

c. Со следующим списком:

coffee_drinkers = [“Alfred”, “Dennis”, “Rob”, “Coen”, “Coen”, “Alfred”, “Jeroen”, “Hendri”, “Alfred”, “Coen”, “Rob”, “Dennis”, “Rob”, “Dennis”, “Rob”, “Coen”, “Rob”, “Alfred”, “Jeroen”, “Hendri”, “Alfred”, “Coen”, “Rob”, “Dennis”, “Coen”, “Dennis”, “Rob”, “Jeroen”, “Jeroen”, “Alfred”, “Jeroen”, “Hendri”, “Alfred”, “Coen”, “Rob”, “Dennis”]

а) сколько кофе было подано?
б) кто выпил больше всего кофе?
в) отсортируйте список в обратном порядке.

Если у вас есть какие-либо вопросы, не стесняйтесь обращаться ко мне через LinkedIn.