Это пример логической ошибки. Код имеет действительный синтаксис, но он не приводит к желаемому результату, потому что проблема кроется в его логике. Если некоторое действие должно повторяться для каждого элемента в списке, но выполняется только один раз, проверьте, не нужно ли добавить отступы в строке или нескольких строках кода.
Лишние отступы
Если вы случайно поставите отступ в строке, в которой он не нужен, Python сообщит об этом:
hello_world.py
message = "Hello Python world!"
(1) . . print(message)
Отступ команды print в точке (1) не нужен, потому что эта строка не подчинена предшествующей; Python сообщает об ошибке:
. File "hello_world.py", line 2
. .print(message)
. .^
IndentationError: unexpected indent
Чтобы избежать непредвиденных ошибок с отступами, используйте их только там, где для этого существуют конкретные причины. В тех программах, которые вы пишете на этой стадии изучения Python, отступы нужны только в строках действий, повторяемых для каждого элемента в цикле for.
Лишние отступы после цикла
Если вы случайно снабдите отступом код, который должен выполняться после завершения цикла, то этот код будет выполнен для каждого элемента. Иногда Python выводит сообщение об ошибке, но часто дело ограничивается простой логической ошибкой.
Например, что произойдет, если случайно снабдить отступом строку с выводом завершающего приветствия для группы фокусников?
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")
. .
(1) . .print("Thank you everyone, that was a great magic show!")
Так как строка (1) имеет отступ, сообщение будет продублировано для каждого фокусника в списке (2):
Alice, that was a great trick!
I can't wait to see your next trick, Alice.
(2)Thank you everyone, that was a great magic show!
David, that was a great trick!
I can't wait to see your next trick, David.
(2)Thank you everyone, that was a great magic show!
Carolina, that was a great trick!
I can't wait to see your next trick, Carolina.
(2)Thank you everyone, that was a great magic show!
Это еще один пример логической ошибки, наподобие описанной в разделе «Пропущенные отступы в других строках» на с. 66. Python не знает, что вы пытаетесь сделать в своем коде, поэтому он просто выполняет весь код, не нарушающий правил синтаксиса. Если действие, которое должно выполняться один раз, выполняется многократно, проверьте, нет ли лишнего отступа в соответствующей строке кода.
Пропущенное двоеточие
Двоеточие в конце команды for сообщает Python, что следующая строка является началом цикла.
magicians = ['alice', 'david', 'carolina']
(1) for magician in magicians
. .print(magician)
Если вы случайно забудете поставить двоеточие, как в примере (1) , произойдет синтаксическая ошибка, так как полученная команда нарушает правила языка. И хотя такие ошибки легко исправляются, найти их бывает достаточно трудно. Вы не поверите, сколько времени тратят программисты на поиск подобных «односимвольных» ошибок. Поиск таких ошибок усложняется еще и тем, что человек склонен видеть то, что он ожидает увидеть.
Упражнения
4-1. Пицца: вспомните по крайней мере три ваши любимые разновидности пиццы. Сохраните их в списке и используйте цикл for для вывода всех названий.
• Измените цикл for так, чтобы вместо простого названия пиццы выводилось сообщение, включающее это название. Таким образом, для каждого элемента должна выводиться строка с простым текстом вида «I like pepperoni pizza».
• Добавьте в конец программы (после цикла for) строку с завершающим сообщением. Таким образом, вывод должен состоять из трех (и более) строк с названиями пиццы и дополнительного сообщения, скажем, «I really love pizza!».
4-2. Животные: создайте список из трех (и более) животных, обладающих общей характеристикой. Используйте цикл for для вывода названий всех животных.
• Измените программу так, чтобы вместо простого названия выводилось сообщение, включающее это название, например «A dog would make a great pet».
• Добавьте в конец программы строку с описанием общего свойства. Например, можно вывести сообщение «Any of these animals would make a great pet!».
Создание числовых списков
Необходимость хранения наборов чисел возникает в программах по многим причинам. Например, в компьютерной игре могут храниться координаты каждого персонажа на экране, таблицы рекордов и т.д. В программах визуализации данных пользователь почти всегда работает с наборами чисел: температурой, расстоянием, численностью населения, широтой/долготой и другими числовыми данными.
Списки идеально подходят для хранения наборов чисел, а Python предоставляет специальные средства для эффективной работы с числовыми списками. Достаточно один раз понять, как эффективно пользоваться этими средствами, и ваш код будет хорошо работать даже в том случае, если список содержит миллионы элементов.
Функция range()