Терминология программирования
В первой части этого курса мы не уделяли много внимания терминологии, поэтому давайте рассмотрим несколько центральных понятий программирования.
Инструкция
Инструкция - это часть программы, которая что-то выполняет. Часто, но не всегда, это одна команда.
Например, print("Hi!") - это инструкция, которая выводит строку текста. Точно так же number = 2 - это инструкция, которая присваивает значение переменной.
Инструкция может быть и сложнее. Например, она может содержать другие инструкции. Следующая инструкция занимает три строки:
if name == "Anna":
print("Hi!")
number = 2В приведенном выше случае внутри условного оператора находятся две инструкции (инструкция вывода и инструкция присваивания).
Блок
Блок - это группа последовательных инструкций, которые находятся на одном уровне в ст руктуре программы. Например, блок условного оператора содержит те инструкции, которые выполняются только если условие истинно.
if age > 17:
# beginning of the conditional block
print("You are of age!")
age = age + 1
print("You are now one year older...")
# end of the conditional block
print("This here belongs to another block")В Python блоки выражаются с помощью одинакового отступа для всего кода внутри блока.
Примечание: основной блок программы Python всегда должен находиться у самого левого края файла, без отступа:
# this program will not work because it is not written at the leftmost egde of the file
print("hello world")
print("this program is not very good...")Выражение
Выражение - это фрагмент кода, который дает значение определенного типа данных. При выполнении программы выражение вычисляется, получает значение, и затем это значение можно использовать в программе.
Вот несколько примеров выражений:
| Выражение | Значение | Тип | Тип данных Python |
|---|---|---|---|
2 + 4 + 3 | 9 | целое число | int |
"abc" + "de" | "abcde" | строка | str |
11 / 2 | 5.5 | число с плавающей точкой | float |
2 * 5 > 9 | True | булево значение | bool |
Поскольку у всех выражений есть тип, их можно присваивать переменным:
# the variable x is assigned the value of the expression 1 + 2
x = 1 + 2Простые выражения можно объединять в более сложные, например с помощью арифметических операций:
# the variable y is assigned the value of the expression '3 times x plus x squared'
y = 3 * x + x**2Функция
Функция выполняет некоторую функциональность. Функции также могут принимать один или несколько аргументов, то есть данные, которые можно передать функции для обработки. Аргументы иногда также называют параметрами. Между аргументом и параметром есть техническое различие, но эти слова часто используются взаимозаменяемо. Пока достаточно запомнить, что оба термина относятся к идее данных, передаваемых функции.
Функция выполняется, когда ее вызывают. То есть когда функция (и ее аргументы, если они есть) упоминается в коде. Следующая инструкция вызывает функцию print с аргументом "this is an argument":
print("this is an argument")Другая функция, которую вы уже часто использовали, - это функция input, которая запрашивает ввод у пользователя. Аргумент этой функции - сообщение, которое показывается пользователю:
name = input("Please type in your name: ")В этом случае функция также возвращает значение. После выполнения функции участок кода, где она была вызвана, заменяется значением, которое она возвращает; это еще одно выражение, которое теперь вычислено. Функция input возвращает строковое значение, содержащее все, что пользователь ввел в приглашении. Значение, возвращенное функцией, часто сохраняется в переменной, чтобы его можно было использовать в программе позже.
Тип данных
Тип данных означает характеристики любого значения, присутствующего в программе. В следующем фрагменте кода тип данных переменной name - строка, или str, а тип данных переменной result - целое число, или int:
name = "Anna"
result = 100Вы можете использовать функцию type, чтобы узнать тип данных любого выражения. Пример ее использования:
print(type("Anna"))
print(type(100))<class 'str'> <class 'int'>
Синтаксис
Как и в естественных языках, синтаксис языка программирования определяет, как должен быть написан код программы. У каждого языка программирования есть свой особый синтаксис.
Синтаксис Python, среди прочего, указывает, что первая строка оператора if должна заканчиваться двоеточием, а блок оператора должен иметь отступ:
if name == "Anna":
print("Hi!")Если синтаксические правила языка программирования не соблюдаются, возникает ошибка:
if name == "Anna"
print("Hi!") File "test.py", line 1
if name == "Anna"
^
SyntaxError: invalid syntax
Отладка
Если синтаксис программы правильный, но программа все равно не работает как задумано, в программе есть ошибка.
Ошибки проявляются по-раз ному. Некоторые ошибки вызывают сбой во время выполнения. Например, следующая программа
x = 10
y = 0
result = x / y
print(f"{x} divided by {y} is {result}")вызывает эту ошибку:
ZeroDivisionError: integer division or modulo by zero on line 3
Здесь проблема имеет математическую природу: деление на ноль не допускается, и это останавливает выполнение программы.
Ошибки во время выполнения обычно довольно легко исправить, потому что сообщение об ошибке указывает строку кода, вызвавшую ошибку. Конечно, настоящая причина ошибки может находиться совсем в другом месте, а не в строке кода, где ошибка проявилась.
Иногда ошибка в программе обнаруживается потому, что результат, который выдает код, неправильный. Обнаружить и найти такую ошибку бывает сложно. В упражнениях по программированию на этом курсе тесты обычно предназначены для выявления именно таких ошибок. Прежде чем исправлять ошибку, нужно сначала найти ее причину.
В программистском жаргоне поиск причин ошибок называется отладкой. Это чрезвычайно важный навык в наборе инструментов любого программиста. Профессиональные программисты часто тратят на отладку больше времени, чем на написание нового кода.
Простой, но эффективный способ отладки программы - добавлять в код отладочные команды вывода. Проверка результатов вашего кода с помощью команд print быстро подтверждает, делает ли код то, что вы от него хотите.
Ниже приведена попытка решить одно из упражнений из предыдущего раздела:
hourly_wage = float(input("Hourly wage: "))
hours = int(input("Hours worked: "))
day = input("Day of the week: ")
daily_wages = hourly_wage * hours
if day == "sunday":
daily_wages * 2
print(f"Daily wages: {daily_wages} euros")Программа работает не совсем правильно. Запуск тестов выводит следующее:
FAIL: PythonEditorTest: test_sunday_1 With input 20.0,6,Sunday correct wage 240.0 is not found in output Daily wages: 120.0 euros
При отладке упражнений на этом курсе первым шагом часто бывает проверка того, как программа ведет себя с вводом, указанным в провалившемся тесте. Действительно, результат не тот, что ожидался:
Daily wages: 120.0 euros
Отладка обычно означает многократный запуск программы. Может быть удобно временно "жестко задать" проблемный ввод вместо того, чтобы каждый раз спрашивать его у пользователя. В этом случае жестко заданный ввод мог бы выглядеть так:
# hourly_wage = float(input("Hourly wage: "))
# hours = int(input("Hours worked: "))
# day = input("Day of the week: ")
hourly_wage = 20.0
hours = 6
day = "Sunday"
daily_wages = hourly_wage * hours
if day == "sunday":
daily_wages * 2
print(f"Daily wages: {daily_wages} euros")Следующим шагом может быть добавление отладочных команд вывода. Проблемная часть кода находится в разделе, обрабатывающем воскресенья, поэтому добавим команды print до и после строки, которая должна удваивать дневную оплату по воскресеньям:
# ...
daily_wages = hourly_wage * hours
if day == "sunday":
print("wages before:", daily_wages)
daily_wages * 2
print("wages after doubling:", daily_wages)
print(f"Daily wages: {daily_wages} euros")Теперь запуск кода ничего не показывает - отладочные команды вывода вообще не печатаются. Похоже, содержимое блока if никогда не выполняется, значит, проблема должна быть в условном операторе. Попробуем вывести значение булева выражения:
# ...
daily_wages = hourly_wage * hours
print("condition:", day == "sunday")
if day == "sunday":
print("wages before:", daily_wages)
daily_wages * 2
print("wages after doubling:", daily_wages)
print(f"Daily wages: {daily_wages} euros")Действительно, значение равно False, поэтому содержимое блока if никогда не выполняется:
condition: False Daily wages: 120.0 euros
Значит, проблема должна быть внутри условия оператора if. Как и во многих ситуациях в программировании, регистр букв важен и при сравнениях. Обратите внимание, что "sunday" в булевом выражении написано не с заглавной буквы, а во вводе оно было с заглавной буквы. Исправим это (и в команде print, и в операторе if):
# ...
daily_wages = hourly_wage * hours
print("condition:", day == "Sunday")
if day == "Sunday":
print("wages before:", daily_wages)
daily_wages * 2
print("wages after doubling:", daily_wages)
print(f"Daily wages: {daily_wages} euros")Запуск этого кода выводит следующее:
condition: True wages before: 120 wages after doubling: 120 Daily wages: 120.0 euros
Похоже, значение, сохраненное в daily_wages, сначала правильное: hourly_wage = 20.0 и hours = 6, а 20.0 * 6 = 120.0. Однако команда, которая должна удвоить это число, этого не делает, значит, проблема должна быть в команде. И действительно, команда
daily_wages * 2удваивает значение, но не сохраняет новое значение никуда. Изменим ее так, чтобы она также сохраняла новое значение:
daily_wages *= 2Повторный запуск программы показывает, что финальный вывод теперь тоже правильный:
condition: True wages before: 120 wages after doubling: 240 Daily wages: 240.0 euros
Когда программа исправлена, не забудьте удалить все отладочные команды вывода и другой код, добавленный для отладки.
Этот пример был довольно простым, и в такой короткой программе ошибки, вероятно, можно было бы найти, просто внимательно прочитав код. Однако отладочные команды вывода часто помогают быстро понять, где может находиться проблема. Команды вывода можно использовать, чтобы выяснить, какие части программы, по-видимому, работают правильно, и сосредоточить поиск ошибки на наиболее вероятных участках кода.
Отладочные команды вывода - только один инструмент отладки программ. Мы еще вернемся к этой теме позже в курсе. Сейчас вам стоит привыкнуть использовать отладочные команды вывода для поиска ошибок в своем коде. Профессиональные программисты не обходятся без них, так что это очень полезный инструмент и для начинающих.
Текущие баллы можно посм отреть в синем индикаторе в правом нижнем углу страницы.