Глава 10 из 27

Бесплатно

3: Строим первые программы

⏱️ 50-65 минут
📊 intermediate

Глава 10: "Массивы и списки: коллекции сокровищ"

На выходных Профессор Бит предложил Алисе помочь разобрать свою знаменитую коллекцию марок. Они разложили на огромном столе несколько альбомов с марками разных стран, эпох и тематик.

— Знаешь, Алиса, — начал Профессор, бережно перелистывая страницы альбома, — коллекции в реальной жизни очень похожи на то, что в программировании называется массивами и списками.

— А что такое массивы и списки? — спросила Алиса, рассматривая красочную марку с изображением космического корабля.

— Представь, что у тебя есть много связанных между собой предметов, которые ты хочешь хранить вместе, — объяснил Профессор. — Например, все эти марки в альбоме. В программировании мы можем создать список, который будет содержать много элементов, и работать с ними как с единым целым.

Байт подкатился поближе и вывел на свой экран пример:

python
марки = ["космос", "животные", "спорт", "искусство", "транспорт"]

— Это список из пяти строчек, — пояснил Профессор. — Каждая строка — это отдельный элемент списка, а вместе они образуют целую коллекцию.

Коллекция марок: список и индексы от 0 до 4

— Так просто? — удивилась Алиса.

— Да, создать список очень просто, — кивнул Профессор. — А вот работать с ним можно по-разному. Например, мы можем узнать, сколько всего элементов в нашем списке с помощью команды len (от английского length — длина):

python
количество_марок = len(марки) # Результат: 5

— Или мы можем обратиться к конкретному элементу по его позиции, которая называется индексом:

python
первая_марка = марки[0] # Результат: "космос"
вторая_марка = марки[1] # Результат: "животные"

— Подожди, — нахмурилась Алиса, — почему первый элемент имеет индекс 0, а не 1?

— Отличный вопрос! — улыбнулся Профессор. — В большинстве языков программирования счёт начинается с нуля. Это связано с тем, как компьютер исторически хранит данные в своей памяти. Так что первый элемент всегда имеет индекс 0, второй — 1, и так далее.

Алиса задумалась, глядя на аккуратно разложенные марки:
— Профессор, а это похоже на то, как мама раскладывает вещи по ящикам и коробкам, подписывая, где что лежит?

— Идеальное сравнение! — восхитился Профессор. — Организация данных в программировании — это то же самое, что наведение порядка в комнате.

Он на секунду отвлёкся от марок и с улыбкой продекламировал:

Массив — это длинный сверкающий поезд,
Где выстроен в линию каждый вагон.
С нуля начинает отсчёт эта повесть,
И строго по правилам движется он.

Ты можешь достать из шестого посылку,
А можешь вагон прицепить в самый хвост.
Массивы и списки — не просто копилка,
А к собранным данным проложенный мост!

Массив — поезд: вагоны с индексами 0, 1, 2, 3 и элементами в каждом

— Видишь, — продолжил он, — когда мы организуем данные в списки, мы раскладываем информацию по "коробкам", чтобы потом программе было легко найти то, что нужно.

Логик, которая помогала раскладывать марки по категориям, добавила:
— Списки в программировании очень гибкие. Мы можем добавлять новые элементы, удалять существующие, изменять их, сортировать и делать многое другое.

Профессор тут же показал новые примеры:

python

Добавление нового элемента в конец списка


марки.append("архитектура")
print(марки)

Результат: ["космос", "животные", "спорт", "искусство", "транспорт", "архитектура"]

Удаление элемента


марки.remove("спорт")
print(марки)

Результат: ["космос", "животные", "искусство", "транспорт", "архитектура"]

Изменение элемента


марки[1] = "дикая природа"
print(марки)

Результат: ["космос", "дикая природа", "искусство", "транспорт", "архитектура"]

Сортировка списка по алфавиту


марки.sort()
print(марки)

Результат: ["архитектура", "дикая природа", "искусство", "космос", "транспорт"]


— А что, если я хочу проверить, есть ли определённая марка в моей огромной коллекции, не перебирая её всю? — спросила Алиса.

— Для этого можно использовать волшебное слово in (в), — объяснил Профессор:

python
if "космос" in марки:
print("Ура! У тебя есть марки на тему космоса!")
else:
print("Увы, марок на тему космоса нет.")

Байт мигнул экраном и показал ещё один пример:

python

Перебор всех элементов списка с помощью цикла


for тема in марки:
print("В альбоме есть марка на тему:", тема)

— С помощью цикла for мы можем выполнить какое-то действие для каждого элемента списка по очереди, — пояснил Профессор. — Это очень удобно, когда нужно обработать сразу всю коллекцию.

— А можно создавать списки с разными типами данных внутри? — поинтересовалась Алиса.

— Конечно! — кивнул Профессор. — В один список можно поместить числа, текст, булевы значения (True/False) и даже другие списки!

python
разное = [42, "привет", True, [1, 2, 3]]

— Вложенные списки (списки внутри списков) особенно полезны для создания таблиц, сеток или игровых полей, — добавил Профессор. — Например, вот так можно представить поле для игры в крестики-нолики:

python
поле = [
[" ", " ", " "],
[" ", "X", " "],
[" ", " ", "O"]
]

— В этом примере у нас есть один большой список, внутри которого лежат три маленьких. Каждый маленький список — это один ряд игрового поля, — объяснил он. — Чтобы обратиться к конкретной клетке, нужно указать сразу два индекса: номер ряда и номер колонки.

python
центральная_клетка = поле[1][1] # Результат: "X"

— А есть ещё какие-то виды коллекций кроме списков? — спросила Алиса, пытаясь уложить всё в голове.

— Да, в языке Python есть несколько удобных типов коллекций для разных задач:

1. Списки (list) — упорядоченные коллекции, которые мы только что обсудили.
2. Кортежи (tuple) — это братья списков, но их нельзя изменять после создания. Они как запаянные коробки.
3. Словари (dict) — коллекции пар "ключ-значение", как настоящие бумажные словари.
4. Множества (set) — коллекции уникальных элементов, где нет повторений.

— Давай рассмотрим словари подробнее, — предложил Профессор. — Они незаменимы, когда нужно накрепко связать одни данные с другими.

python

Словарь, связывающий страны (ключ) с их столицами (значение)


столицы = {
"Россия": "Москва",
"Франция": "Париж",
"Япония": "Токио"
}

Получение значения по ключу


столица_франции = столицы["Франция"] # Результат: "Париж"

Добавление новой пары


столицы["Италия"] = "Рим"

Перебор всех пар в словаре


for страна, столица in столицы.items():
print("Столица государства", страна, "— это", столица)

— Заметь, в словаре мы обращаемся к элементам не по скучному индексу-цифре, а по понятному слову-ключу, — объяснил Профессор. — Это делает код гораздо читаемее.

— А множества? — спросила Алиса. — Для чего они нужны?

— Множества полезны, когда нам важно только наличие или отсутствие элемента, а порядок вообще не имеет значения, — ответила Логик. — Кроме того, множества автоматически уничтожают клонов! В них не бывает дубликатов.

python

Создание множества


цвета = {"красный", "синий", "зелёный", "синий"}
print(цвета)

Результат: {"красный", "синий", "зелёный"} — лишний "синий" был удалён!

Проверка наличия элемента


if "жёлтый" in цвета:
print("Жёлтый цвет есть во множестве")
else:
print("Жёлтого цвета нет во множестве")

Математические операции с множествами


цвета2 = {"жёлтый", "синий", "оранжевый"}

общие_цвета = цвета & цвета2

Пересечение (что есть и там, и там): {"синий"}

все_цвета = цвета | цвета2

Объединение (собрать всё вместе без дубликатов):


{"красный", "синий", "зелёный", "жёлтый", "оранжевый"}


— В программировании коллекции используются ежесекундно, — подытожил Профессор, аккуратно закрывая альбом с марками. — Они позволяют работать с огромными группами данных, что критически важно для любой программы.

— Это как в реальной жизни, — заметила Алиса. — Мы ведь постоянно имеем дело с коллекциями: набор цветных карандашей, книги на полке, продукты в холодильнике...

— Именно! — улыбнулся Профессор. — Программирование не выдумывает ничего нового. Оно просто отражает структуры из нашего реального мира, делая их более организованными и послушными!


Задание

Представь, что ты создаёшь программу для учёта своей коллекции (книг, игрушек, наклеек — чего угодно). Напиши пример списка или словаря для хранения информации о твоей коллекции. Затем напиши несколько строк кода, демонстрирующих, как можно работать с этой коллекцией (добавление новых элементов, поиск, сортировка и т.д.).