Перейти к содержанию

432 уроков, 26 библиотек и челлендж «Что выведет код?» — бесплатно, код прямо в браузере

Начать обучение
Урок 17 из 20 Начальный 15 мин 100 XP

Методы списков Python: полный обзор и шпаргалка

К середине курса накопился весь арсенал: append, remove, pop, sort — и три метода ещё впереди. index, count, reverse, clear и copy плюс правило None — карта всех методов списка.

Редакция Питоники

К этому уроку список уже знаком почти целиком: append и insert из уроков про добавление, remove и pop из урока про удаление, sort из урока про сортировку. Осталась горстка методов — index, count, reverse, clear, copy — и одно правило, которое объединяет их всех и экономит часы отладки: мутаторы возвращают None. Соберём карту целиком, чтобы любой метод из чужого кода узнавался с первого взгляда.

МетодЧто делаетВозвращает
append(x)Добавляет x в конецNone
insert(i, x)Вставляет x по индексу iNone
extend(it)Приклеивает элементы перебираемогоNone
remove(x)Удаляет первое вхождение значения xNone
pop(i)Снимает элемент по индексу и отдаёт егоСнятый элемент
clear()Опустошает списокNone
index(x)Позиция первого вхождения значенияИндекс или ValueError
count(x)Число вхождений значенияЦелое число
sort()Сортирует на местеNone
reverse()Разворачивает на местеNone
copy()Новый список с теми же элементамиНовый список

index: где лежит значение

Индексы из урока про индексы достают элемент по позиции, а index решает обратную задачу: по значению находит позицию первого вхождения:

index находит позицию значения
shelf = ['молоко', 'хлеб', 'сыр']

pos = shelf.index('хлеб')
print(pos, shelf[pos])
Вывод
1 хлеб

Значения в списке нет — метод не возвращает безопасный минус один, а бросает ValueError. Поэтому index страхуют оператором in из урока про проверку in или try-except, когда отсутствие значения — нормальная ситуация:

index без значения падает, in страхует
shelf = ['молоко', 'хлеб', 'сыр']

print('сыр' in shelf)
try:
    shelf.index('кофе')
except ValueError as e:
    print('Ошибка:', e)
Вывод
True
Ошибка: 'кофе' is not in list

Пара работает в обе стороны: индекс по позиции — shelf[pos], позиция по значению — shelf.index('хлеб'). Сообщение об ошибке называет отсутствующее значение прямо — искать кофейный индекс без проверки in рискованно: программа упадёт в самый неожиданный момент отчёта.

count: сколько раз встречается

count отвечает на вопрос, сколько раз значение встретилось в списке, и не падает никогда — отсутствующее значение даёт честный ноль:

count по журналу заказов
orders = ['молоко', 'хлеб', 'молоко', 'сыр', 'молоко']

print('молоко:', orders.count('молоко'))
print('хлеб:', orders.count('хлеб'))
print('кофе:', orders.count('кофе'))
print('всего позиций:', len(orders))
Вывод
молоко: 3
хлеб: 1
кофе: 0
всего позиций: 5

count и len — разные вопросы: count считает вхождения одного значения, len — размер списка целиком. Если нужен счёт по всем значениям сразу, это работа для словаря-счётчика из курса про словари; count закрывает только точечный вопрос.

reverse: разворот на месте

reverse переворачивает список на месте — последний элемент становится первым. Срез [::-1] из урока про срезы делает тот же переворот, но по-другому: он строит новый список, не трогая оригинал. Разница видна в паре:

reverse на месте против среза
route = ['старт', 'мост', 'финал']

route.reverse()
print(route)
print(route[::-1])

back = route[::-1]
print(route)
print(back)
Вывод
['финал', 'мост', 'старт']
['старт', 'мост', 'финал']
['финал', 'мост', 'старт']
['старт', 'мост', 'финал']

reverse() изменил route навсегда, а срез каждый раз возвращает свежий список, оставляя оригинал на месте. Выбор по задаче: порядок списка больше не нужен — reverse(), оригинал нужен в прямом порядке — срез. Отдельного метода для нового перевёрнутого списка нет — именно срез его заменяет.

clear: опустошить список

clear удаляет все элементы, но сохраняет сам объект списка — и это отличает его от присваивания пустого списка. Разница становится видна, когда на список смотрят два имени — история ссылок из урока про копирование:

clear против нового пустого списка
a = ['молоко', 'хлеб']
b = a

a.clear()
print('после clear:  ', a, '-', b)

a = ['молоко', 'хлеб']
b = a
a = []
print('после a = []: ', a, '-', b)
Вывод
после clear:   [] - []
после a = []:  [] - ['молоко', 'хлеб']

clear опустошил общий объект — b опустел вместе с a. Присваивание a = [] привязало имя a к новому пустому списку, а b остался со старым наполненным. Приём clear() возвращает None, потому что это чистый мутатор: ничего забрать из него нельзя.

Правило None: мутаторы ничего не отдают

Самая дорогая ошибка темы — склеить мутацию с присваиванием. Методы append, sort, reverse, clear меняют список на месте и возвращают None, поэтому присваивание их результата затирает список пустотой:

строка, которая убивает список
nums = [3, 1, 2]

nums.sort()
print(nums)

nums = nums.sort()
print(nums)
Вывод
[1, 2, 3]
None

Первая строка работает как задумано: sort упорядочил список на месте, и печать показывает порядок. Вторая привязала имя nums к возвращённому None — список потерян, и каждая следующая операция с nums падает. Правило: метод-мутатор вызывают отдельной строкой и ничего из него не присваивают; значение отдают только pop и немутаторы index, count, copy.

copy и полная карта

Последний метод из таблицы — copy: встроенный аналог среза a[:] из урока про копирование. Он возвращает новый список с теми же элементами, и правки копии не трогают оригинал:

copy(): новый список тем же методом
cart = ['молоко', 'хлеб']
backup = cart.copy()

backup.append('сыр')
print(cart)
print(backup)
print(cart is backup)
Вывод
['молоко', 'хлеб']
['молоко', 'хлеб', 'сыр']
False

copy, срез a[:] и list(a) дают одинаковый результат — выбор дело вкуса; у метода есть плюс читаемости: cart.copy() по-русски звучит как то, что делает. Полный список методов любой структуры показывает функция dir — здесь он приведён для справки:

dir(list) — встроенная справка
print([m for m in dir(list) if not m.startswith('_')])
Список имён методов зависит от версии Python и длинный: в уроке он не запускается, чтобы не завязываться на вывод конкретной версии. Запустите сами и сверьте с таблицей выше.
  • добавление: append в конец, insert по индексу, extend пачкой — все на месте;
  • удаление: remove по значению, pop с возвратом, del по индексу, clear всё;
  • поиск: index даёт позицию и падает без значения, count считает вхождения;
  • порядок: sort и reverse меняют на месте, sorted и срез [::-1] строят новые;
  • копия: copy(), a[:] и list(a) — поверхностные, deepcopy — полная;
  • правило None: мутаторы ничего не возвращают — присваивать их результат нельзя.

Карта собрана — теперь каждый метод списка узнаётся в чужом коде, а правило None избавляет от самой коварной строки курса. Осталось применить арсенал: следующий урок собирает типовые задачи — дедупликация, второй максимум, чередование — и решает их тем, что уже есть в таблице.

Что выведет код?

Сначала предскажи ответ в голове — это главный навык программиста.

shelf = ['молоко', 'хлеб', 'сыр']
print(shelf.index('сыр'))
route = ['а', 'б', 'в']
route.reverse()
print(route)
nums = [5, 2, 8]
result = nums.append(0)
print(result, len(nums))
Проверь себя
0 / 6

1. Что вернёт shelf.index('хлеб'), если хлеба в списке нет?

2. Что вернёт orders.count('кофе'), если кофе в списке не встречается?

3. Чем reverse() отличается от среза [::-1]?

4. a = ['x', 'y']; b = a; a.clear(). Что в b?

5. Почему строка nums = nums.sort() — ошибка?

6. Какой метод возвращает снятый элемент, а не None?

Карточки терминов
Запомнено: 0 / 8
Практика

Дан список shelf = ['молоко', 'хлеб', 'молоко', 'сыр']. Напечатайте позицию первого хлеба, сколько раз встречается молоко, и переверните список на месте, после чего напечатайте его.

practice.py
Вопросы и ответы по уроку

Какие методы есть у списка в Python?

Одиннадцать: append, insert и extend добавляют; remove, pop, del и clear удаляют; index и count ищут; sort и reverse упорядочивают; copy копирует. Все методы-мутаторы возвращают None и меняют список на месте; значения возвращают только pop, index, count и copy.

Урок 17: полный обзор методов

Что делает метод index и чем он опасен?

index(значение) возвращает позицию первого вхождения, а при отсутствии значения бросает ValueError. Перед вызовом проверяйте наличие оператором in или ловите исключение try-except, если отсутствие — нормальная ситуация.

Чем reverse отличается от reversed и среза [::-1]?

reverse() — метод списка: переворачивает на месте и возвращает None. Срез [::-1] возвращает новый перевёрнутый список, оставляя оригинал прямым. Встроенная функция reversed отдаёт итератор в обратном порядке — удобно в цикле for, когда список переворачивать не нужно.

Почему нельзя писать lst = lst.sort()?

Метод sort сортирует список на месте и возвращает None: присваивание затирает имя, и список теряется без ошибки до первого обращения. Все мутаторы — append, reverse, clear и остальные — работают по этому правилу: вызов отдельной строкой, без присваивания.

Урок 10: sort и sorted

Как посмотреть все методы объекта в Python?

Функцией dir: dir(list) покажет имена всех методов и атрибутов списка, имена с подчёркиванием — служебные, их отбрасывают. Для списания в шпаргалку удобнее отфильтровать comprehension: [m for m in dir(list) if not m.startswith('_')].

Понравился урок? Сошлитесь на него

«Мутаторы sort, reverse, append, extend, insert, remove, clear возвращают None: присваивание их результата заменяет список пустотой.»

Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.

TelegramVK

Что дальше

Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.

Похожие уроки по темам

Подобраны автоматически по пересечению тем и ключевых слов.