В Python работа с последовательностями данных часто строится на двух ключевых понятиях: итераторы и генераторы. Они позволяют эффективно обрабатывать большие объемы данных, избегая необходимости хранить всю последовательность в памяти.
Мы уже не единожды работали с итераторами, например, когда перебирали элементы коллекций в цикле for. Он неявно превращает итерируемый объект в итератор, обеспечивающий последовательный доступ к его элементам. Но также мы можем вручную преобразовать итерируемый объект в итератор и последовательно получить каждый его элемент с помощью функций iter() и next().
Функция iter() принимает итерируемый объект (например, список, кортеж или строку) и возвращает его итератор. Он не является копией переданной коллекции, а просто указывает на то, где в данный момент находится процесс итерации.
Функция next() принимает итератор и возвращает следующий элемент из его последовательности.
Строки, списки и кортежи являются упорядоченными коллекциями, то есть их элементы имеют фиксированный порядок и свои собственные порядковые номера, называемые индексами. С их помощью можно как получать отдельные элементы коллекции, так и извлекать целые последовательности элементов.
По индексу можно получить отдельные элементы строк, списков и кортежей. Например, у нас есть следующие переменные:
message_str = "Как дела?" # Строка
shopping_list = ["Еда 1", "Еда 2", "Еда 3", "Еда 4", "Еда 5"] # Список
friends_tuple = ("Друг 1", "Друг 2", "Друг 3") # Кортеж
Первый символ "К" строки "Как дела?" находится по индексу 0, второй символ "а" – по индексу 1, и так далее.
Списки и кортежи подходят для хранения последовательности элементов, но что, если нам удобнее обращаться к элементам по какому-то имени, а не по порядковому номеру? Для этого в Python предназначены словари. Вместо того чтобы хранить элементы по порядку, словари хранят пары «ключ-значение». Они похожи на настоящие словари, где у каждого слова (ключа) есть свое определение (значение).
Ключи словаря должны быть уникальными и представлены неизменяемым типом данных, например, числом, строкой, кортежем или даже замороженным множеством. На значения словаря никакие ограничения не накладываются.
В самом простом случае словарь создаётся с помощью фигурных скобок, внутри которых через запятую перечисляются пары ключ: значение:
phone_book = {
"Мастер": "+79315555555",
"Маргарита": "+79637777777"
}
Списки и кортежи – это упорядоченные коллекции, которые могут хранить элементы различных типов данных. Их ключевое различие заключается в изменяемости: списки являются изменяемыми объектами, в то время как кортежи – неизменяемыми. Это означает, что после создания кортежа вы не можете добавить, удалить или изменить его элементы, в отличие от списка, который поддерживает эти операции.
Списки, благодаря своей гибкости, являются одним из наиболее часто используемых типов данных в Python. Кортежи в свою очередь идеально подходят для хранения набора фиксированных значений, обеспечивая целостность данных, занимая (в некоторых случаях) меньше памяти и демонстрируя более высокую производительность при переборе элементов.
Выбор между списком и кортежем обычно диктуется требованиями конкретной задачи, в частности необходимостью изменения хранимых данных.
Списки в Python обладают множеством встроенных методов, которые значительно упрощают работу с ними. При этом списки изменяемы, поэтому большая часть методов изменяет исходный список и возвращает None. Это отличает их от строк, для которых методы возвращают их преобразованную копию.
Метод list.append() добавляет элемент в конец списка. Например, добавим в конец списка с одеждой новый элемент:
clothes = ["Туника", "Тога"]
clothes.append("Мантия")
print(clothes)
# Вывод: ['Туника', 'Тога', 'Мантия']
Ошибки в программировании неизбежны, однако важно научиться распознавать и грамотно реагировать на них. При одних ошибках код вовсе не запустится, а при других аварийно завершится при выполнении строки с ошибкой. Однако Python – очень дружелюбный язык, и всегда старается подсказать, в чем проблема.
Самый частый гость у начинающих программистов – это синтаксические ошибки, например, опечатки или пропущенные символы. Python в этом плане очень строгий и требует, чтобы код был написан по определенным правилам. Если вы допустите такую ошибку, Python даже не запустит вашу программу, а сразу сообщит, что именно ему не понравилось.
Например, выведем сообщение на экран, но пропустим закрывающую скобку при вызове функции print():
print("Эта инструкция написана не очень правильно"
Запустив этот код, вы увидите примерно такое сообщение о синтаксической ошибке:
Traceback (most recent call last):
File "/home/irina/projects/task.py", line 2
print("Эта инструкция написана не очень правильно"
^
SyntaxError: '(' was never closed
Наследование и полиморфизм – это ещё два основных принципа ООП, которые часто используются вместе. Наследование позволяет дочернему классу перенимать свойства и поведение родительского класса. А полиморфизм позволяет работать с объектами разных классов через единый интерфейс.
Наследование – это механизм, который позволяет создавать новый класс на основе уже существующего. Это как в жизни: вы наследуете черты от своих родителей, но при этом имеете и свои собственные, уникальные качества. В программировании это означает, что дочерний класс (потомок) получает все атрибуты и методы родительского класса (предка), а затем может добавлять новые или переопределять существующие.
Это ключевой принцип, позволяющий повторно использовать код. Вместо того чтобы писать один и тот же код для похожих классов, вы создаете базовый класс с общими характеристиками, а затем наследуете его.
Ветвление – это фундаментальный механизм в программировании, позволяющий выполнять различные действия в зависимости от условия. Это похоже на принятие решений в реальной жизни: «Если я наберу 100 очков, то перейду на следующий уровень. Иначе мне придётся сыграть ещё раз».
В Python ветвление реализуется с помощью условных операторов if (с англ. – если), elif (от англ. else if – иначе если) и else (с англ. – иначе):
if условие_1:
блок_кода_1
elif условие_2:
блок_кода_2
else:
блок_кода_3
Каждое условие – это логическое выражение, результат которого может быть либо истинным (True), либо ложным (False). Если первое условие в if истинно, то выполняется соответствующий блок кода, иначе – проверяется следующее условие в elif и так далее. Если все условия оказались ложными, то выполняется блок кода else.
Принадлежность кода к блоку if, elif или else определяется обязательным отступом (обычно 4 пробела). Отсутствие или неправильный отступ приведет к ошибке IndentationError.
Все встроенные коллекции в Python, такие как списки, кортежи, строки, множества и словари, объединяет то, что они являются итерируемыми объектами (англ. iterable object), то есть такими объектами, которые поддерживают возможность последовательного прохода по своим элементам. Это означает, что мы можем перебрать каждый элемент таких коллекций в цикле for:
for элемент in коллекция:
действия_с_элементом
Основное преимущество итерируемых объектов заключается в том, что цикл for берет на себя работу по перебору элементов. Вместо того чтобы вручную обращаться к каждому элементу, мы можем последовательно перебрать каждый элемент такого объекта.