ПРИМЕЧАНИЕ
Если в вашей программе произошла ошибка индексирования и вы не знаете, как с ней справиться,
попробуйте вывести список или хотя бы его длину . Возможно, ваш список выглядит совсем не так,
как вы думаете, особенно если его содержимое динамически определялось программой . Фактиче-
ское состояние списка или точное количество элементов в нем поможет вам выявить логические
ошибки такого рода .
УПРАЖНЕНИЯ
3-11 . Намеренная ошибка: если ни в одной из предшествующих программ вы еще не стал-
кивались с ошибками индексирования, попробуйте создать такую ошибку искусственно .
Измените индекс в одной из программ, чтобы вызвать ошибку индексирования . Не забудьте
исправить ошибку перед тем, как закрыть программу .
Итоги 61
Итоги
В этой главе вы узнали, что представляют собой списки и как работать с отдельны-
ми элементами в списках. Вы научились определять списки, добавлять и удалять
элементы, выполнять сортировку (постоянную или временную для отображения).
Также вы узнали, как определить длину списка и как избежать ошибок индекси-
рования при работе со списком.
В главе 4 рассматриваются приемы более эффективной работы со списками. Пере-
бор всех элементов списка всего в нескольких строках кода, даже если список со-
держит тысячи или миллионы элементов, сокращает объем программы.
4
Работа со списками
В главе 3 вы научились создавать простые списки и работать с отдельными элемен-
тами списков. В этой главе вы узнаете, как перебрать весь список всего в несколь-
ких строках кода (независимо от длины списка). Механизм перебора позволяет
выполнить одно действие или набор действий с каждым элементом в списке. С его
помощью вы сможете эффективно работать со списками любой длины, даже со-
стоящими из тысяч и миллионов элементов.
Перебор всего списка
Типичная задача из области программирования — перебрать все элементы списка
и выполнить с каждым элементом одну и ту же операцию. Например, в компью-
терной игре все экранные объекты могут смещаться на одинаковую величину,
или в списке чисел к каждому элементу может применяться одна и та же стати-
стическая операция. А может быть, вам нужно вывести все заголовки из списка
статей на сайте. В ситуациях, требующих применения одного действия к каждому
элементу списка, можно воспользоваться циклами
for
.
Допустим, имеется список с именами фокусников, и вы хотите вывести каждое
имя из списка. Конечно, можно обратиться к каждому элементу по отдельности,
но такой подход создает ряд проблем. Во-первых, для очень длинных списков все
сведется к однообразным повторениям. Во-вторых, при любом изменении длины
списка в программу придется вносить изменения. Цикл
for
решает обе проблемы:
Python будет следить за всеми техническими деталями в своей внутренней реали-
зации.
В следующем примере цикл
for
используется для вывода имен фокусников:
magicians.py
magicians = ['alice', 'david', 'carolina']
for magician in magicians:
print(magician)
Все начинается с определения списка , как и в главе 3. В точке определяется
цикл
for
. Эта строка приказывает Python взять очередное имя из списка и сохра-
нить его в переменной
magician
. В точке выводится имя, только что сохранен-
ное в переменной
magician
. Затем строки и повторяются для каждого имени
Перебор всего списка 63
в списке. Этот код можно описать так: «Для каждого фокусника в списке вывести
его имя». Результат представляет собой простой перечень имен из списка:
alice
david
carolina
Подробнее о циклах
Концепция циклов очень важна, потому что она представляет один из основных
способов автоматизации повторяющихся задач компьютером. Например, в простом
цикле, использованном в
magicians .py
, Python сначала читает первую строку цикла:
for magician in magicians:
Эта строка означает, что нужно взять первое значение из списка
magicians
и со-
хранить его в переменной
magician
. Первое значение в списке —
'alice'
. Затем
Python читает следующую строку:
print(magician)
Python выводит текущее значение
magician
, которое все еще равно
'alice'
. Так
как в списке еще остались другие значения, Python возвращается к первой строке
цикла:
for magician in magicians:
Python берет следующее значение из списка —
'david'
— и сохраняет его в
magician
.
Затем выполняется строка:
print(magician)
Python снова выводит текущее значение
magician
; теперь это строка
'david'
. Весь
цикл повторяется еще раз с последним значением в списке,
'carolina'
. Так как
других значений в списке не осталось, Python переходит к следующей строке в про-
грамме. В данном случае после цикла
for
ничего нет, поэтому программа просто
завершается.
Помните, что все действия повторяются по одному разу для каждого элемента
в списке независимо от их количества. Если список содержит миллион элементов,
Python повторит эти действия миллион раз — обычно это происходит очень быстро.
Также помните, что при написании собственных циклов
for
временной переменной
для текущего значения из списка можно присвоить любое имя. Однако на практи-
ке рекомендуется выбирать осмысленное имя, описывающее отдельный элемент
списка. Несколько примеров:
for cat in cats:
for dog in dogs:
for item in list_of_items:
Выполнение этого правила поможет вам проследить за тем, какие действия выпол-
няются с каждым элементом в цикле
for
. В зависимости от того, какое число ис-
64 Глава 4 • Работа со списками
пользуется — одиночное и множественное, вы сможете понять, работает ли данная
часть кода с отдельным элементом из списка или со всем списком.
Более сложные действия в циклах for
В цикле
for
с каждым элементом списка может выполняться практически любое
действие. Дополним предыдущий пример, чтобы программа выводила для каждого
фокусника отдельное сообщение:
magicians = ['alice', 'david', 'carolina']
for magician in magicians:
print(magician.title() + ", that was a great trick!")
Единственное отличие этого кода от предыдущего заключается в том, что в точке
для каждого фокусника строится сообщение с его именем. При первом проходе
цикла переменная
magician
содержит значение
'alice'
, поэтому Python начинает
первое сообщение с имени
'Alice'
. При втором проходе сообщение будет начи-
наться с имени
'David'
, а при третьем — с имени
'Carolina'
:
Alice, that was a great trick!
David, that was a great trick!
Carolina, that was a great trick!
Тело цикла
for
может содержать сколько угодно строк кода. Каждая строка с на-
чальным отступом после строки
for magician in magicians
считается находящейся
в цикле и выполняется по одному разу для каждого значения в списке. Таким об-
разом, с каждым значением в списке можно выполнить любые операции на ваше
усмотрение.
Включим в сообщение для каждого фокусника вторую строку:
magicians = ['alice', 'david', 'carolina']
for magician in magicians:
print(magician.title() + ", that was a great trick!")
print("I can't wait to see your next trick, " + magician.
title() + ".\n")
Так как обе команды
print
снабжены отступами, каждая строка будет выполнена
по одному разу для каждого фокусника в списке. Символ новой строки (
"\n"
)
во второй команде print вставляет пустую строку после каждого прохода цик-
ла. В результате будет создан набор сообщений, аккуратно сгруппированных для
каждого фокусника в списке:
Alice, that was a great trick!
I can't wait to see your next trick, Alice.
David, that was a great trick!
I can't wait to see your next trick, David.
Carolina, that was a great trick!
I can't wait to see your next trick, Carolina.
Перебор всего списка 65
Тело цикла
for
может содержать сколько угодно строк кода. На практике часто
требуется выполнить в цикле
for
несколько разных операций для каждого эле-
мента списка.
Выполнение действий после цикла for
Что происходит после завершения цикла
for
? Обычно программа выводит сводную
информацию или переходит к другим операциям.
Каждая строка кода после цикла
for
, не имеющая отступа, выполняется без по-
вторения. Допустим, вы хотите вывести сообщение для всей группы фокусников
и поблагодарить их за превосходное представление. Чтобы вывести общее сообще-
ние после всех отдельных сообщений, разместите его после цикла
for
без отступа:
magicians = ['alice', 'david', 'carolina']
for magician in magicians:
print(magician.title() + ", that was a great trick!")
print("I can't wait to see your next trick, " + magician.title() + ".\n")
print("Thank you, everyone. That was a great magic show!")
Первые две команды
print
повторяются по одному разу для каждого фокусника
в списке, как было показано ранее. Но поскольку строка отступа не имеет, это
сообщение выводится только один раз:
Alice, that was a great trick!
I can't wait to see your next trick, Alice.
David, that was a great trick!
I can't wait to see your next trick, David.
Carolina, that was a great trick!
I can't wait to see your next trick, Carolina.
Thank you, everyone. That was a great magic show!
При обработке данных в циклах
for
завершающее сообщение позволяет подвести
итог операции, выполненной со всем набором данных. Например, цикл
for
может
инициализировать игру, перебирая список персонажей и изображая каждого пер-
сонажа на экране. После цикла выполняется блок без отступа, который выводит
кнопку
Начать игру
после того, как все персонажи появятся на экране.
Предотвращение ошибок с отступами
В Python связь одной строки кода с предшествующей строкой обозначается от-
ступами. В приведенных примерах строки, выводившие сообщения для отдельных
фокусников, были частью цикла, потому что они были снабжены отступами. При-
менение отступов в Python сильно упрощает чтение кода. Фактически отступы
заставляют разработчика писать аккуратно отформатированный код с четкой
визуальной структурой. В более длинных программах Python могут встречаться
66 Глава 4 • Работа со списками
блоки кода с отступами нескольких разных уровней. Эти уровни способствуют
пониманию общей структуры программы.
Когда разработчики только начинают писать код, работа которого зависит
от правильности отступов, в их коде нередко встречаются распространенные
ошибки. Например, иногда они расставляют отступы в коде, в котором эти отступы
не нужны, или наоборот — забывают ставить отступы в блоках, где это необходимо.
Несколько примеров помогут вам избежать подобных ошибок в будущем и успеш-
но исправлять их, когда они встретятся в ваших программах.
Итак, рассмотрим несколько типичных ошибок при использовании отступов.
Пропущенный отступ
Строка после команды
for
в цикле всегда должна снабжаться отступом. Если вы
забудете поставить отступ, Python напомнит вам об этом:
Достарыңызбен бөлісу: |