Термины
Важно помнить смысл этих терминов и уметь понимать, что мы к каждому из них относим. Зачем это нужно, станет понятно дальше.
Языковая конструкция
Это часть текста программы, соответствующая какому-то набору правил, описанному в документации к языку программирования. Конструкции имеют определённый смысл для интерпретатора. Все действия которые делает интерпретатор чётко соответсвуют конструкциям в программе.
Далее мы в первом приближении рассмотрим несколько важных языковых конструкций в языке программирования Python примерно так, как они описаны в официальной документации (с некоторыми упрощениями).
Expression (выражение)
Это языковая конструкция, имеющая следующие свойства: (1) её можно вычислить, (2) во время её вычисления могут происходить побочные эффекты.
Результатом успешного вычисления expression всегда является объект.
Простейший пример текста, который является корректным expression:
"Hello"Самодостаточная часть одного expression тоже является expression. Например тут
"Hello" + " world!"Можно выделить 3 куска текста, под которые подойдёт термин expression. При вычилсении всего expression сначала вычислятся два входящих в него: получаем два объекта. Потом вычисляется результат операции между ними: получаем результат всего expression.
Примеры побочных эффектов, которые могут произойти при вычислении:
- Вывод текста в консоль
- Отправление данных по сети
- Чтение или запись в файл
- Изменение некоторого объекта (например, изменение списка)
Пример expression с побочным эффектом:
print("Hello world!")Обратите внимание на то, что
- Это всё ещё
expression. Он вычисляется, и результатом вычисления будет объектNone. Вообще, вызов любых функций подпадает подexpression. - При более детальном анализе, можно выделить внутри него ещё один
expression. Сначала вычилсяется результат первого (получаем объектHello world!), потом результат второго (получаем объектNone).
Statement (инструкция)
Это общее название для группы языковых конструкций. Далее перечислены некоторые из них, и для любой корректно говорить, что она является языковой конструкцией statement.
Примечательно, что любая программа на Python состоит из последовательности конструкций statement. Для разделения элементов последовательности обычно достаточно использовать перенос строки (хотя некоторые statement могут занимать сразу несколько строк).
Возьмём такую программу:
a = 1
["Hello"]
def test():
passВ каком-то смысле можно сказать, что интерпретатор, в определённый момент, видит этот текст вот так:
statement_1 разделитель statement_2 разделитель statement_3И выполнение вашего кода он понимает как последовательное выполнение этих statement.
Под выполнением statement понимается выполнение каких-то конкретных действий, заложенных в смысл каждого из них. Далее по тексту расписан смысл некоторых видов statement.
Assignment statement (инструкция присваивания)
Имеет вид "name = expression"
Смысл инструкции (интерпретатор понимает, что он должен сделать именно это при её выполнении):
- Вычислить
expression. - Cвязать результат вычисления с именем
name.
Expression statement (инструкция-выражение)
Имеет вид "expression".
Смысл инструкции:
- Вычислить выражение
expression(и всё).
Например вот в таком коде
a = [1]
[a]У нас есть:
- два
statement:assignment statementиexpression statement; - два
expression: первое является частьюassignment statement, второе является частьюexpression statement. - ещё два
expression, которые являются самодостаточной частью других (1является частью[1],aявляется частью[a]).
Получается, что на второй строчке у нас написан текст [a], к которому одновременно применимы термины statement, expression statement, expression. Поэтому к тексту [a] последовательно применяются сразу три смысла:
- Интерпретатор Python при выполнении программы в какой-то момент дойдёт до него и выполнит. Это мы взяли из смысла
statement. - Под выполнением при этом понимается вычисление выражения. Это мы взяли из смысла
expression statement. - В результате успешного вычисления мы получаем объект, при этом в ходе вычисления могут возникнуть побочные эффекты. Это мы взяли из смысла
expression.
Зачем учить все эти термины
Благодаря тому, что мы теперь знаем, как между собой связаны языковые конструкции, мы получаем возможность однообразно объяснять вроде бы разный код. Например:
print("Hello")
a = 1Теперь в ходе объяснения поведения первой строчки мы используем термины statement, expression statement, expression, а в ходе объяснения второй строчки используем statement, assignment statement, expression. Попробуйте в уме последовательно раскрыть смысл каждого из терминов по отношению к первой и второй строчке соответсвенно (если необходимо, вернитесь к определениям).
Обратите внимание, что поменялась только одна составляющая объяснения. Хотя раньше эти строчки могли выглядеть так, будто они делают вообще разные вещи.
Посмотрим более подробно на переиспользование тут термина expression. Под ним мы понимаем языковую конструкцию, которая характеризуется свойствами, описанными выше (возвращает значение, может вызвать побочный эффект). Эта одна идея применима сразу и к куску текста print("Hello") на первой строчке и к куску текста 1 на второй. Нам теперь не нужно для первого вспоминать одно объяснение, а для второй другое. Хорошо зная, что такое expression, мы понимаем происходящее и там и там. Тот же принцип переиспользования смысла относится и к другим языковым конструкциям, которые мы рассмотрели.
Польза такого подхода в дальнейшем будет становиться всё больше и больше. Например, expression используется в Python повсеместно, а не только в рассмотренном примере.
Та же логика относится и к тому, почему мы учили как меняется состояние Python через рисунки. Вместо того, чтобы запоминать, как ведёт себя код в огромном количестве ситуаций, можно выучить логику по которой работает состояние на картинке, и научиться применять эту логику в коде.
Задания
Чтобы успешно применять знания об абстрактных конструкциях вроде expression к коду, нужно уметь быстро видеть в нём эти конструкции; думать о коде «через них».
Примечание: примеры кода из заданий иногда специально нестандартные, и писать код именно так может не иметь смысла. Но это всё корректный код на Python, и зная материал вы должны быть способны предсказать, что будет делать интерпретатор.
Задание 1
Дан текст исходного кода. Выпишите части текста, к которым:
- Можно применить термин
expression - Можно применить термин
statement - Можно применить термин
assignment statement - Можно применить термин
expression statement
(к каждому пункту выпишите все части текста к которому термин можно применять)
Тексты исходного кода:
a = 1
b = 100a = 1
b = []
b.append(a)print("Hello world" + "!")
print(str("Hello world"))
a = print()Задание 2
Что выведут в консоль эти программы на Python?
Указание: используйте знания о том, как работают изученные языковые конструкции.
print("Hello!")
a = "Well..."
[print(a)]print("Hello!")
a = "Well..." + "."
a = [a]
b = print(a)Задание со звёздочкой:
a = print(print())
a = [a][0]
str(print(str(a)))