← Back to course

Lists: хранение многих значений

Lists: хранение многих значений

Возвращаемся к Python.

В предыдущем уроке ты изучил loops.

Твои программы научились повторять работу с помощью:

for
while

Очень хорошо.

Теперь Python может автоматически повторять задачи.

Может считать.

Может спрашивать снова.

Может считать totals.

Может показывать menus.

Красиво.

Но теперь у нас другая проблема.

Что делать, если нужно сохранить много значений?

Например:

Список продуктов.
Список пользователей.
Список оценок.
Список городов.
Список задач.
Список паролей, которые не нужно хранить plain text.

Без lists можно написать так:

product1 = "Keyboard"
product2 = "Mouse"
product3 = "Notebook"

Это работает.

Но очень быстро становится некрасиво.

А если продуктов 100?

Ты правда будешь писать:

product100 = "Something"

Пожалуйста, нет.

Python имеет лучший способ.

Lists.

Lists позволяют хранить много значений в одной variable.

Очень полезно.

Очень распространено.

Очень Python.

Что ты изучишь

В этом уроке ты изучишь:

К концу этого урока твои программы смогут работать с collections of data.

Это очень большой шаг.

Потому что реальные программы почти никогда не работают только с одним значением.

Они работают со многими значениями.

Много пользователей.

Много продуктов.

Много задач.

Много проблем.

Очень реалистично.

Очень программирование.

Что такое list?

List — это collection of values.

Пример:

products = ["Keyboard", "Mouse", "Notebook"]

Здесь:

products

это одна variable.

Но она хранит три значения:

Keyboard
Mouse
Notebook

List использует square brackets:

[]

Items внутри list разделяются commas:

["Keyboard", "Mouse", "Notebook"]

Это намного лучше, чем писать:

product1 = "Keyboard"
product2 = "Mouse"
product3 = "Notebook"

Lists держат связанные значения вместе.

Как маленькая коробка.

Но цифровая.

И с меньшей вероятностью найти внутри случайные кабели.

Твой первый list

Создай файл:

lists.py

Напиши:

products = ["Keyboard", "Mouse", "Notebook"]

print(products)

Запусти:

python lists.py

или:

python3 lists.py

Output:

['Keyboard', 'Mouse', 'Notebook']

Python выводит весь list.

Обрати внимание, что Python показывает square brackets и quotes.

Это нормально.

Он показывает структуру list.

List — это не просто text.

Это collection.

Маленький контейнер для values.

Очень организованно.

Подозрительно организованно.

Lists могут хранить разные types

List может хранить разные types of values.

Пример:

mixed_list = ["Anna", 25, 19.99, True]

print(mixed_list)

Output:

['Anna', 25, 19.99, True]

Это работает.

Но будь осторожен.

То, что Python что-то разрешает, не означает, что это всегда хорошая идея.

Часто lists понятнее, когда хранят похожие вещи.

Хорошо:

prices = [10.99, 25.50, 5.00]
names = ["Anna", "Marco", "Sofia"]
scores = [90, 85, 72]

Менее понятно:

random_things = ["Anna", 42, True, "Pizza", 3.14]

Python даёт свободу.

Свобода красива.

Свобода также может создать хаос в square brackets.

Используй ответственно.

Доступ к items через index

Каждый item в list имеет position.

Эта position называется index.

Пример:

products = ["Keyboard", "Mouse", "Notebook"]

print(products[0])
print(products[1])
print(products[2])

Output:

Keyboard
Mouse
Notebook

Важно:

Первый item имеет index 0.

Не 1.

Python начинает считать с нуля.

Снова.

Python и ноль всё ещё очень близкие друзья.

То есть:

products[0] -> Keyboard
products[1] -> Mouse
products[2] -> Notebook

Это очень важно.

Indexes — это способ получить конкретные items из list.

Indexes начинаются с 0

Это один из самых частых сюрпризов для начинающих.

Можно ожидать, что:

products[1]

означает первый item.

Но нет.

В Python:

products[0]

означает первый item.

Пример:

cities = ["Rome", "Milan", "Naples"]

print(cities[0])

Output:

Rome

Если хочешь второй item:

print(cities[1])

Output:

Milan

Сначала это кажется странным.

Потом становится нормальным.

Потом ты начинаешь считать с нуля в голове.

В этот момент программирование уже изменило тебя.

Не обязательно в худшую сторону.

Наверное.

Получение последнего item

Можно использовать negative indexes.

Пример:

products = ["Keyboard", "Mouse", "Notebook"]

print(products[-1])

Output:

Notebook

-1 означает:

последний item

Другие примеры:

print(products[-2])
print(products[-3])

Output:

Mouse
Keyboard

Negative indexes считают с конца.

Очень полезно.

Очень Python.

Очень “я хочу последнюю вещь, но не хочу всё считать”.

Иногда Python бывает добрым.

Обновление item в list

Lists можно изменять.

Пример:

products = ["Keyboard", "Mouse", "Notebook"]

products[1] = "Gaming Mouse"

print(products)

Output:

['Keyboard', 'Gaming Mouse', 'Notebook']

Мы изменили item с index 1.

Было:

Mouse

Стало:

Gaming Mouse

Помни:

index 1 — это второй item

Python делает именно то, что ты просишь.

Даже если ты забыл, что indexes начинаются с нуля.

Python не защищает тебя от твоей собственной уверенности.

Очень учебно.

Добавление items через append()

Можно добавить item в конец list через append().

Пример:

products = ["Keyboard", "Mouse"]

products.append("Notebook")

print(products)

Output:

['Keyboard', 'Mouse', 'Notebook']

append() добавляет один item в конец.

Это очень распространено.

Пример с user input:

products = []

product = input("Product name: ")
products.append(product)

print(products)

Если пользователь введёт:

Keyboard

Output:

['Keyboard']

Empty list начинается так:

products = []

Потом можно добавлять items позже.

Очень полезно.

Очень гибко.

Очень “строим list по дороге”.

Добавление нескольких items

Можно вызывать append() много раз.

Пример:

products = []

products.append("Keyboard")
products.append("Mouse")
products.append("Notebook")

print(products)

Output:

['Keyboard', 'Mouse', 'Notebook']

Это полезно, когда values приходят один за другим.

Например:

user input
data from a file
data from a database
data from an API

Lists повсюду.

Они как сумки для data.

Но менее хаотичные.

Если только ты сам не положишь туда хаотичные data.

Тогда это уже твоя ответственность.

Наверное.

Удаление items через remove()

Можно удалить item по value через remove().

Пример:

products = ["Keyboard", "Mouse", "Notebook"]

products.remove("Mouse")

print(products)

Output:

['Keyboard', 'Notebook']

remove() удаляет первый matching item.

Важно:

products.remove("Mouse")

означает:

Найди "Mouse" и удали его.

Не означает:

Удали item с index Mouse.

Потому что это было бы абсурдно.

Python принимает много вещей.

Но не это.

remove() требует existing item

Если ты попробуешь удалить item, которого нет, Python даст error.

Пример:

products = ["Keyboard", "Mouse"]

products.remove("Notebook")

Error:

ValueError

Почему?

Потому что "Notebook" нет в list.

Позже мы научимся лучше обрабатывать errors.

Пока что можно сначала проверять:

products = ["Keyboard", "Mouse"]

if "Notebook" in products:
    products.remove("Notebook")
else:
    print("Notebook is not in the list.")

Это безопаснее.

Программа проверяет перед удалением.

Очень ответственно.

Очень взросло.

В отличие от некоторого кода, написанного в 2 ночи.

Проверка, существует ли item

Используй in, чтобы проверить, есть ли item в list.

Пример:

products = ["Keyboard", "Mouse", "Notebook"]

if "Mouse" in products:
    print("Mouse is available.")
else:
    print("Mouse is not available.")

Output:

Mouse is available.

Можно также проверить противоположное через not in:

if "Monitor" not in products:
    print("Monitor is missing.")

Output:

Monitor is missing.

Это очень полезно.

Ты часто будешь использовать in.

Lists и in — хорошие друзья.

Как Python и ноль.

Но менее подозрительные.

Длина list через len()

len() говорит, сколько items есть в list.

Пример:

products = ["Keyboard", "Mouse", "Notebook"]

print(len(products))

Output:

3

Это означает, что list имеет 3 items.

Можно использовать это в messages:

products = ["Keyboard", "Mouse", "Notebook"]

print(f"We have {len(products)} products.")

Output:

We have 3 products.

len() очень полезен.

Он работает с lists.

Он также работает со strings.

Пример:

word = "Python"

print(len(word))

Output:

6

Python любит считать вещи.

Очень helpful.

Энергия бухгалтера.

Проход по list через loop

Lists и loops очень хорошо работают вместе.

Пример:

products = ["Keyboard", "Mouse", "Notebook"]

for product in products:
    print(product)

Output:

Keyboard
Mouse
Notebook

Это означает:

Для каждого product в products list, выведи product.

Это один из самых важных patterns в Python.

List хранит много values.

Loop обрабатывает их один за другим.

Очень мощно.

Очень распространено.

Очень “теперь мы действительно программируем”.

Лучший output с lists

Можно объединять loops и f-strings.

Пример:

products = ["Keyboard", "Mouse", "Notebook"]

for product in products:
    print(f"Product: {product}")

Output:

Product: Keyboard
Product: Mouse
Product: Notebook

Так выглядит чище.

Можно также добавить numbering:

products = ["Keyboard", "Mouse", "Notebook"]

number = 1

for product in products:
    print(f"{number}. {product}")
    number += 1

Output:

1. Keyboard
2. Mouse
3. Notebook

Это работает.

Но Python имеет ещё лучший tool для numbering.

Мы изучим его скоро.

Не сейчас.

Один дракон за раз.

Проход по prices

Lists могут хранить numbers.

Пример:

prices = [10.99, 25.50, 5.00]

for price in prices:
    print(f"Price: {price:.2f}")

Output:

Price: 10.99
Price: 25.50
Price: 5.00

Можно посчитать total:

prices = [10.99, 25.50, 5.00]

total = 0

for price in prices:
    total += price

print(f"Total: {total:.2f}")

Output:

Total: 41.49

Это очень распространённый pattern:

list of numbers
loop through numbers
calculate total

Просто.

Полезно.

Очень реально.

Много invoices начинаются именно так.

Потом приходят taxes.

И музыка становится темнее.

Поиск самого большого number

Можно использовать loop, чтобы найти самое большое number.

Пример:

scores = [75, 90, 62, 88]

highest_score = scores[0]

for score in scores:
    if score > highest_score:
        highest_score = score

print(f"Highest score: {highest_score}")

Output:

Highest score: 90

Что происходит?

Сначала предполагаем, что первый score самый большой.
Проверяем каждый score.
Если score больше, обновляем highest_score.
Выводим финальный result.

Это классический programming pattern.

Взять starting value.

Loop.

Compare.

Update.

Очень полезно.

Очень algorithmic.

Звучит fancy.

Но это просто внимательная проверка.

Как искать самую большую картошку в мешке.

Computer science — это glamour.

Empty lists

Empty list не имеет items.

Пример:

products = []

print(products)
print(len(products))

Output:

[]
0

Empty lists полезны, когда ты хочешь добавить items позже.

Пример:

products = []

products.append("Keyboard")
products.append("Mouse")

print(products)

Output:

['Keyboard', 'Mouse']

Много программ начинаются с empty list.

Потом они её заполняют.

Это очень нормально.

Empty list не является useless.

Он просто ждёт data.

Как корзина.

Очень терпеливая корзина.

Построение list из user input

Создай файл:

product_list.py

Напиши:

products = []

product_count = int(input("How many products? "))

for number in range(1, product_count + 1):
    product = input(f"Product {number}: ")
    products.append(product)

print("Your products:")

for product in products:
    print(f"- {product}")

Пример взаимодействия:

How many products? 3
Product 1: Keyboard
Product 2: Mouse
Product 3: Notebook

Output:

Your products:
- Keyboard
- Mouse
- Notebook

Это настоящая программа, которая строит list.

Пользователь даёт values.

Python сохраняет их в list.

Потом Python проходит по list и выводит их.

Очень полезно.

Очень beginner-friendly.

Очень близко к real applications.

Lists с conditions

Можно использовать conditions во время прохода по list.

Пример:

prices = [10.99, 120.00, 5.50, 250.00]

for price in prices:
    if price >= 100:
        print(f"Expensive item: {price:.2f}")

Output:

Expensive item: 120.00
Expensive item: 250.00

Это означает:

Пройди через все prices.
Выведи только prices, которые 100 или больше.

Это filtering.

Filtering означает:

Показать только items, которые соответствуют condition.

Очень распространено.

Очень полезно.

Очень database-like.

PostgreSQL гордо смотрит из угла комнаты.

Создание нового filtered list

Можно создать новый list из selected items.

Пример:

prices = [10.99, 120.00, 5.50, 250.00]

expensive_prices = []

for price in prices:
    if price >= 100:
        expensive_prices.append(price)

print(expensive_prices)

Output:

[120.0, 250.0]

Что происходит?

Начинаем с empty list.
Проходим через все prices.
Если price expensive, добавляем его в expensive_prices.
Выводим new list.

Это ещё один очень распространённый pattern.

Loop.

Check.

Append.

Поздравляю.

Ты уже делаешь real data processing.

Small data.

Но real.

Типичная ошибка: index out of range

Это неправильно:

products = ["Keyboard", "Mouse", "Notebook"]

print(products[3])

Python даёт error:

IndexError

Почему?

Потому что list имеет 3 items.

Их indexes:

0
1
2

Index 3 не существует.

Помни:

products[0]  # first item
products[1]  # second item
products[2]  # third item

Последний index:

length - 1

Если list имеет 3 items, последний index — 2.

Python не жестокий.

Он просто снова считает с нуля.

Классический Python.

Типичная ошибка: забыть quotes

Неправильно:

products = [Keyboard, Mouse, Notebook]

Python думает, что Keyboard, Mouse и Notebook — это variable names.

Но они не defined.

Правильно:

products = ["Keyboard", "Mouse", "Notebook"]

Strings требуют quotes.

Variables — нет.

Это правило возвращается снова и снова.

Как bug, который ты думал, что уже исправил.

Но более дружелюбный.

Типичная ошибка: неправильно использовать append()

Неправильно:

products = ["Keyboard"]

products.append("Mouse", "Notebook")

Это даёт error.

Почему?

Потому что append() добавляет один item за раз.

Правильно:

products = ["Keyboard"]

products.append("Mouse")
products.append("Notebook")

Output:

['Keyboard', 'Mouse', 'Notebook']

Пока что запомни:

append() добавляет один item.

Позже ты изучишь другие способы добавлять много items.

Python имеет больше tools.

Конечно имеет.

Toolbox никогда не заканчивается.

Типичная ошибка: удаление missing items

Неправильно:

products = ["Keyboard", "Mouse"]

products.remove("Notebook")

Это вызывает:

ValueError

Потому что "Notebook" нет в list.

Безопаснее:

products = ["Keyboard", "Mouse"]

if "Notebook" in products:
    products.remove("Notebook")
else:
    print("Notebook was not found.")

Всегда будь осторожен, когда удаляешь items.

Lists не могут магически удалить то, чего там нет.

Это уже была бы философская проблема.

А Python не в настроении.

Типичная ошибка: путать index и value

Посмотри на этот list:

products = ["Keyboard", "Mouse", "Notebook"]

Indexes:

0, 1, 2

Values:

Keyboard, Mouse, Notebook

Это получает item по index:

print(products[1])

Output:

Mouse

Это удаляет по value:

products.remove("Mouse")

Важная разница:

index = position
value = actual item

Не путай их.

Index — это где вещь находится.

Value — это сама вещь.

Очень просто.

Очень легко забыть.

Очень нормально для начинающих.

Мини-программа: shopping list

Создай файл:

shopping_list.py

Напиши:

shopping_list = []

while True:
    item = input("Add item or type q to quit: ")

    if item == "q":
        break

    shopping_list.append(item)

print("Your shopping list:")

for item in shopping_list:
    print(f"- {item}")

Пример:

Add item or type q to quit: Bread
Add item or type q to quit: Milk
Add item or type q to quit: Eggs
Add item or type q to quit: q

Output:

Your shopping list:
- Bread
- Milk
- Eggs

Эта программа использует:

Много concepts вместе.

Очень сильная практика.

Очень реально.

Очень полезно, если ты потом правда вспомнишь купить eggs.

Мини-программа: average score

Создай файл:

average_score.py

Напиши:

scores = []

score_count = int(input("How many scores? "))

for number in range(1, score_count + 1):
    score = float(input(f"Score {number}: "))
    scores.append(score)

total = 0

for score in scores:
    total += score

average = total / len(scores)

print(f"Average score: {average:.2f}")

Пример:

How many scores? 3
Score 1: 80
Score 2: 90
Score 3: 70

Output:

Average score: 80.00

Эта программа использует:

Это серьёзная beginner program.

Не огромная.

Но серьёзная.

Python-суп снова становится насыщеннее.

До сих пор без USB-вкуса.

Хорошо.

Мини-программа: product prices

Создай файл:

product_prices.py

Напиши:

prices = []

product_count = int(input("How many products? "))

for number in range(1, product_count + 1):
    price = float(input(f"Price for product {number}: "))
    prices.append(price)

total = 0

for price in prices:
    total += price

print(f"Total: {total:.2f}")

if total >= 100:
    print("Big order.")
else:
    print("Small order.")

Пример:

How many products? 3
Price for product 1: 20
Price for product 2: 30
Price for product 3: 60

Output:

Total: 110.00
Big order.

Теперь мы объединяем:

lists
loops
conditions
numbers
input
formatted output

Так строятся real programs.

Concept by concept.

Line by line.

Маленький кирпич.

Маленький кирпич.

В итоге появляется дом.

Надеемся, не с призраками indentation errors.

Практика

Создай файл:

practice_lists.py

Напиши программу, которая:

Пример решения:

names = []

name_count = int(input("How many names? "))

for number in range(1, name_count + 1):
    name = input(f"Name {number}: ")
    names.append(name)

print("Names:")

for name in names:
    print(f"- {name}")

print(f"Total names: {len(names)}")

if "Anna" in names:
    print("Anna is in the list.")
else:
    print("Anna is not in the list.")

Попробуй.

Измени names.

Попробуй добавить Anna.

Попробуй не добавлять Anna.

Программа должна реагировать по-разному.

Lists плюс conditions.

Очень полезно.

Очень реально.

Мини-задание

Создай файл:

task_manager.py

Твоя программа должна:

Menu:

1. Add task
2. Show tasks
q. Quit

Пример решения:

tasks = []

while True:
    print("----- Task Manager -----")
    print("1. Add task")
    print("2. Show tasks")
    print("q. Quit")

    choice = input("Choose an option: ").lower()

    if choice == "1":
        task = input("Task: ")
        tasks.append(task)
        print("Task added.")
    elif choice == "2":
        print("Tasks:")

        if len(tasks) == 0:
            print("No tasks yet.")
        else:
            for task in tasks:
                print(f"- {task}")
    elif choice == "q":
        print("Goodbye.")
        break
    else:
        print("Unknown option.")

Это настоящая mini application.

Она использует:

Маленький project.

Большой progress.

Так начинаются command-line tools.

Перед тем, как стать web apps.

Перед тем, как стать dashboards.

Перед тем, как кто-то скажет:

Can we add login?

И adventure становится длиннее.

Extra challenge: remove tasks

Улучши task_manager.py.

Добавь ещё одну menu option:

3. Remove task

Потом разреши пользователю ввести task name и удалить его.

Пример идеи:

elif choice == "3":
    task = input("Task to remove: ")

    if task in tasks:
        tasks.remove(task)
        print("Task removed.")
    else:
        print("Task not found.")

Это добавляет:

Теперь твой task manager может добавлять, показывать и удалять tasks.

Всё ещё маленький.

Но очень полезный.

Маленькая productivity app.

Попробуй не потратить три часа на её улучшение.

Или потрать.

Так тоже рождаются programmers.

Checklist для начинающих

Когда твоя list-программа не работает, проверь:

Я использовал square brackets для list?
Я разделил items commas?
Я поставил strings в quotes?
Я помню, что indexes начинаются с 0?
Я не пытаюсь получить index, которого не существует?
Я использовал append() с одним item?
Я проверил, существует ли item перед remove()?
Я правильно сделал indentation в loop body?
Я использовал len(), когда нужен был number of items?
Я не перепутал index и value?

Lists сначала простые.

Потом становятся очень мощными.

Большинство beginner list errors приходят от indexes.

Indexes начинаются с нуля.

Первый item — index 0.

Последний item часто:

list_name[-1]

Запомни это.

Твой будущий debugging time скажет тебе спасибо.

Наверное молча.

Итог

Сегодня ты изучил:

Это огромный шаг.

Теперь твои программы могут хранить много values.

Они могут process collections of data.

Могут строить shopping lists.

Могут считать totals.

Могут manage tasks.

Могут работать с many inputs.

Это намного ближе к real programming.

One value is nice.

Many values are reality.

Следующий урок

В следующем уроке мы изучим dictionaries.

Dictionaries позволяют хранить data через keys и values.

Вместо того чтобы хранить только:

["Anna", 25, "Rome"]

ты сможешь писать:

user = {
    "name": "Anna",
    "age": 25,
    "city": "Rome"
}

Это очень важно.

Lists хороши для many values.

Dictionaries хороши для structured data.

А structured data повсюду.

Users.

Products.

Orders.

Profiles.

APIs.

Очень полезно.

Очень Python.