Перейти к содержимому
TelegramGitHub

Цикл for и срезы

Цикл for повторяет действие для каждого элемента. Срез берёт часть списка. Это основа любой обработки данных.

amounts = [49.9, 15.0, 120.0, 35.5]
for a in amounts:
print(a)
total = 0
for a in amounts:
total += a
print(total)

Ответ:

49.9
15.0
120.0
35.5
220.4
  • После for ...: идёт блок с отступом в 4 пробела. Отступ обязателен. Без него будет IndentationError: expected an indented block.
  • total += a значит total = total + a.
  • for работает со списками, строками, файлами и всем, что можно перебрать.

range даёт последовательность чисел.

print(list(range(5)), list(range(2, 6)), list(range(0, 10, 3)))
for i in range(3):
print("step", i)

Ответ:

[0, 1, 2, 3, 4] [2, 3, 4, 5] [0, 3, 6, 9]
step 0
step 1
step 2
  • range(n) — от 0 до n-1.
  • range(a, b) — от a до b-1. Правая граница не входит.
  • range(a, b, step) — с шагом.

enumerate даёт номер и значение. zip идёт по двум спискам сразу.

users = ["anna", "bob", "carl"]
for i, u in enumerate(users, start=1):
print(i, u)
for u, a in zip(users, amounts):
print(u, a)

Ответ:

1 anna
2 bob
3 carl
anna 49.9
bob 15.0
carl 120.0

Не пишите range(len(users)) и индексы вручную. enumerate читается лучше.

Срез: x[start:stop:step]. Правая граница не входит. Любую часть можно пропустить.

n = [10, 20, 30, 40, 50]
print(n[:2], n[2:], n[1:4], n[-2:], n[::2], n[::-1])
print("hello"[1:3])

Ответ:

[10, 20] [30, 40, 50] [20, 30, 40] [40, 50] [10, 30, 50] [50, 40, 30, 20, 10]
el
СрезЧто даёт
n[:2]Первые 2 элемента
n[-2:]Последние 2 элемента
n[1:4]Элементы с индексами 1, 2, 3
n[::2]Каждый второй
n[::-1]Список задом наперёд

Срез всегда создаёт новый список. Для строк работает так же.

Короткая запись цикла, который строит список.

print([a * 2 for a in [1, 2, 3]])
print([a for a in amounts if a > 30])
print([u.upper() for u in users])

Ответ:

[2, 4, 6]
[49.9, 120.0, 35.5]
['ANNA', 'BOB', 'CARL']

Форма: [что_сделать for x in список if условие]. Часть if необязательна. Она оставляет только подходящие элементы.

tuple похож на список, но его нельзя менять. Пишут в круглых скобках. Удобен для строки данных с постоянным набором полей.

row = ("anna", 49.9)
user, amount = row
print(row[0], user, amount)
row[1] = 50

Ответ:

anna anna 49.9
TypeError: 'tuple' object does not support item assignment
  • Доступ по индексу как у списка: row[0].
  • user, amount = row раскладывает кортеж по переменным. Так же работает for i, u in enumerate(...).
  • Изменить элемент нельзя. Можно только создать новый кортеж.

sorted(x, key=..., reverse=...). Параметр key — функция, которая даёт значение для сравнения.

rows = [("anna", 49.9), ("bob", 15.0), ("carl", 120.0)]
print(sorted(rows, key=lambda r: r[1], reverse=True))
print(sorted(["b", "A", "c"]))
print(sorted(["b", "A", "c"], key=str.lower))
print(sorted(users, key=len))

Ответ:

[('carl', 120.0), ('anna', 49.9), ('bob', 15.0)]
['A', 'b', 'c']
['A', 'b', 'c']
['bob', 'anna', 'carl']
  • lambda r: r[1] — маленькая функция «возьми второй элемент».
  • Большие буквы идут раньше маленьких. Чтобы игнорировать регистр, используйте key=str.lower.
  • Сортировка стабильная: равные элементы сохраняют порядок.
  • Перебор строк файла и записей из API.
  • Очистка колонки: [x.strip().lower() for x in col].
  • Срезы: первые строки для проверки, последние N записей лога.
  • sorted(..., key=...) — топ-N по сумме, последние события.

Выведите каждую сумму из [49.9, 15.0, 120.0, 35.5] с двумя знаками после точки, по одной в строке.

Проверка:

49.90
15.00
120.00
35.50
Решение
amounts = [49.9, 15.0, 120.0, 35.5]
for a in amounts:
print(f"{a:.2f}")

Посчитайте, сколько заказов больше 30. Используйте list comprehension с if и len.

Проверка: 3

Решение
print(len([a for a in amounts if a > 30]))

Добавьте к каждой сумме НДС 20% и округлите до 2 знаков. Результат — новый список.

Проверка: [59.88, 18.0, 144.0, 42.6]

Решение
print([round(a * 1.2, 2) for a in amounts])

Выведите первые две и последние две суммы.

Проверка: [49.9, 15.0] [120.0, 35.5]

Решение
print(amounts[:2], amounts[-2:])

Выведите пользователей anna, bob, carl с номерами, начиная с 1, в формате 1. anna.

Проверка:

1. anna
2. bob
3. carl
Решение
users = ["anna", "bob", "carl"]
for i, u in enumerate(users, start=1):
print(f"{i}. {u}")

Есть список пар rows = [("anna", 49.9), ("bob", 15.0), ("carl", 120.0)]. Найдите заказ с минимальной суммой через sorted.

Проверка: ('bob', 15.0)

Решение
rows = [("anna", 49.9), ("bob", 15.0), ("carl", 120.0)]
print(sorted(rows, key=lambda r: r[1])[0])
  • for x in items: — блок с отступом выполняется для каждого элемента.
  • enumerate даёт номер, zip соединяет два списка.
  • Срез x[a:b:s]: правая граница не входит, [-n:] — последние n.
  • List comprehension: [f(x) for x in items if cond].
  • sorted(items, key=...) сортирует по любому полю.

Дальше: Python Crash Course, глава 4.

Следующий урок: Условия if.