Предыдущий урок: Try…Except
Этот материал посвящен инструкциям и выражениям в Python, а также отличиям между ними. Также речь пойдет об инструкциях, занимающих несколько строк, и отступах в Python. Попробуем ответить на вопрос: «Почему отступы так важны в Python?»
Что такое инструкция?
Инструкция в Python — это логическая инструкция, которую интерпретатор Python может прочесть и выполнить. Она может являться выражением или оператором присваивания в Python.
Присваивание — фундаментальный элемент этого языка. Он определяет способ создания и сохранения объектов с помощью выражений.
Что такое выражение?
Выражение — один из типов инструкции, который содержит логическую последовательность чисел, строк, объектов и операторов python. Значение и переменная являются выражениями сами по себе.
С помощью выражений можно выполнять такие операции, как сложение, вычитание, конкатенация и другие. Они также могут представлять собой вызовы функций, которые возвращают результат.
# Использование арифметических выражений
>>> ((20 + 2) * 10 / 5 - 20)
24.0
# Использование функций в выражении
>>> pow(2, 10)
1024
# Использование eval в выражении
>>> eval("2.5+2.5")
5.0
Простая операция присваивания
В случае простого присваивания создаются новые переменные, которым присваиваются значения. Их можно менять. Инструкция предоставляет выражение и имя переменной в качестве метки для сохранения значения выражения.
# Синтаксис
variable = expression
Рассмотрим типы выражений присваивания в Python и посмотрим, как они работают внутри.
Пример 1. С правой стороны — выражение со значением
Это базовая форма присваивания в Python.
>>> test = "Изучение python"
Python создаст в памяти строку "Изучение python"
и присвоит ей имя test
. Узнать адрес в памяти можно с помощью встроенной функции id()
.
>>> test = "Изучение python"
>>> id(test)
6589040
Номер — это адрес места, где значение хранится в памяти. Дальше несколько интересных вещей, о которых нужно помнить.
- Если создать другую строку с тем же значением, Python создаст новый объект и присвоит его другому местоположению в памяти. Это работает в большинстве случаев.
- Однако в двух следующих случаях он использует то же место в памяти:
- Строки без пробелов с менее чем 20 символами;
- Целые числа от -5 до 255.
Это называется интернированием и делается для сохранения памяти.
Пример 2. С правой стороны — существующая переменная Python
Теперь другой пример инструкции присваивания. С правой стороны находится ранее объявленная переменная python.
Инструкция выше не приведет к выделению нового места в памяти. Обе переменных будут ссылаться на один и тот же объект в памяти. Это как создание псевдонима для существующего объекта. Убедиться в этом можно с помощью все той же функции id()
.
>>> test = "Изучение python"
>>> id(test)
6589424
>>> another_test = test
>>> id(another_test)
6589424
Пример 3. С правой стороны — операция
В случае такой инструкции результат зависит от исхода операции. Возьмем такой пример.
>>> test = 2 * 2 / 4
>>> print(test)
1.0
>>> type(test)
В примере выше присваивание приведет к созданию переменной типа float
. А в этом — к появлению переменной типа int
.
>>> test = 3 * 3
>>> print(test)
9
>>> type(test)
Дополненная инструкция присваивания
Арифметические операторы можно объединять для формирования инструкций дополненного присваивания.
Рассмотрим такой пример: x += y
. Он является аналогичным этой инструкции — x = x + y
.
Следующий пример с добавлением новых элементов в кортеж чуть яснее демонстрирует принцип.
>>> my_tuple = (5, 10, 20)
>>> my_tuple += (40, 80,)
>>> print(my_tuple)
(5, 10, 20, 40, 80)
Следующий пример — список гласных. В нем в список добавляются недостающие значения.
>>> list_vowels = ['a','e','i']
>>> list_vowels += ['o', 'u',]
>>> print(list_vowels)
['a', 'e', 'i', 'o', 'u']
Инструкция в несколько строк
Каждая инструкция в Python заканчивается символом новой строки. Но это поведение можно расширить на несколько строк с помощью символа продолжения строки \
.
В Python есть два варианта работы с инструкциями, занимающими несколько строк.
1. Явное продолжение строки
Когда сразу используется символ продолжения строки \
для разбития инструкции на несколько строчек.
# Инициализация списка с помощью многострочной инструкции
>>> my_list = [1, \
... 2, 3\
... ,4,5 \
... ]
>>> print(my_list)
[1, 2, 3, 4, 5]
# Вычислить выражение, используя многострочную инструкцию
>>> eval ( \
... " 2.5 \
... + \
... 3.5")
6.0
2. Неявное продолжение строки
Неявное продолжение строки работает в тех случаях, когда инструкция разбивается с помощью круглых (), квадратных [] или фигурных {} скобок. В таком случае инструкцию нужно заключить внутрь скобок для переноса.
>>> result = (10 + 100
... * 5 - 5
... / 100 + 10
... )
>>> print(result)
519.95
>>> subjects = [
... 'Метематика',
... 'Английский',
... 'Химия'
... ]
>>> print(subjects)
['Метематика', 'Английский', 'Химия']
>>> type(subjects)
Отступы в Python
Большая часть высокоуровневых языков программирования, таких как C, C++, C# используют фигурные скобки для выделения блоков кода. Python делает это с помощью отступов.
Блок кода, представляющий тело функции или цикл, начинается с отступа и заканчивается первой строкой без отступа.
Сколько места занимает один отступ
Согласно правилам стиля Python (PEP8), размер отступа — 4 символа. Однако у Google есть собственные правила, ограничивающие этот размер 2 символами. Так что можно руководствоваться и собственным стилем, но лучше следовать PEP8.
Почему отступы так важны в Python?
В большинстве языков программирования отступы используются для улучшения читабельности, но добавлять их необязательно. Но в Python их обязательно нужно использовать. Обычно каждую строку предваряет отступ в 4 символа для одного блока кода.
В примерах прошлых разделов были блоки без отступов. Однако в более сложных выражениях без них не обойтись.
def demo_routine(num):
print('Демо функция')
if num % 2 == 0:
return True
else:
return False
num = int(input('Введи число:'))
if demo_routine(num) is True:
print(num, 'четное число')
else:
print(num, 'нечетное число')
Также стоит рассмотреть пример, когда ненужный отступ вызывает ошибку.
>>> 6*5-10
File "", line 1
6*5-10
^
IndentationError: unexpected indent
Выводы
Если вы планируете стать профессиональным программистом, который верит в понятие чистого кода, тогда важно знать о выражениях, инструкциях и отступах в Python. Чтобы получить максимум от этого урока, повторите все представленные примеры в консоли. Для работы с ранее введенными командами можно использовать стрелку вверх на клавиатуре.
Далее: Комментарии
Инструкции в Python
Для того, чтобы наша программа могла делать что-то полезное, мы должны предоставить интерпретатору Python верные инструкции, т.е. посредством кода
сообщить ему логическую последовательность действий, выполнение которой и приведет к желаемому результату. Если более строго, то.
Инструкция языка программирования
(от англ. statement) – это команда на языке программирования,
посредством которой компьютеру сообщается о необходимости выполнения одного определенного шага по обработке порции информации.
По сути, любой python-скрипт представляет собой не что иное, как некоторую последовательность инструкций, которая может состоять из десятков, сотен,
тысяч или даже сотен тысяч и миллионов инструкций (см. пример №1). Все зависит от того, сколько инструкций потребуется для того, чтобы описать все шаги,
необходимые для достижения целей программы.
Код
Результат
pythonCodes
# Инструкция импортирует переменную pi из модуля math.
from math import pi
# Позиционное присваивание значений глобальным переменным.
x, y, z = [1, 2, 3]
# Эта инструкция объявляет функцию со значением по умолчанию.
def ex_func(z=0):
# Будут использоваться глобальные переменные.
global x, y
# Комбинированные инструкции присваивания.
# Теперь глобальная x == 10.
x *= 10
# Теперь глобальная y == 20.
y += 18
# Глобальная z не изменилась, а локальная z == z*z.
z **= 2
# Инструкция объявляет вложенную функцию.
def in_func():
# Будет использоваться переменная z из области видимости
# объемлющей функции, т.е. ex_func.
nonlocal z
# Инструкция запускает цикл.
for i in range(25):
# Условная инструкция.
if i<5:
# Инструкция перехода в начало цикла.
continue
# От 5 до 9.
elif i>=5 and i<10:
# Увеличиваем z из обл. видимости ex_func.
z += i
# При i == 10.
else:
# Инструкция прерывания цикла.
break
# Инструкция возврата значения функцией in_func.
return z
# Инструкция возврата значения функцией ex_func.
return x + y + in_func()
# Инструкция будет отлавливать и обрабатывать исключения.
try:
# Инструкция присваивает переменной рез-т вычисления выражения.
res = int(pi)*10 + ex_func(30) + int(input('Введите число: '))
# Инструкция выводит результат на экран.
print(res, end='\n\n')
# Блок выполняется, когда возбуждается исключение.
except Exception as err:
# Выводим сообщение об ошибке.
print(err)
# Если ошибок нет.
else:
# Ничего не делаем (пустая инструкция-заполнитель).
pass
# Этот блок выполняется всегда, даже при наличии исключения.
finally:
# Запрашиваем ввод, чтобы окно не закрылось.
input()
Введите число: число
invalid literal for int() with base 10: 'число'
Пример №1. Виды и формы инструкций в Python.
Как видим, к инструкциям можно отнести практически все команды, которые мы пишем в коде программы: импорт модулей, присваивание или удаление ссылок на объекты, определение функций,
циклы, условные конструкции, обработка исключений и т.д. При этом, в случае необходимости, все эти инструкции могут быть объединены посредством отступов в целые блоки инструкций, каждый из
которых может содержать собственные вложенные блоки инструкций (в нашем примере уровень вложенности достигает четырех).
В последующих параграфах мы обязательно рассмотрим все виды инструкций и их особенности более подробно. Сейчас же, для более полного представления о наборе инструкций, использующихся в
Python, мы просто перечислим основные из них, дав краткие пояснения (в процессе чтения обязательно еще раз посматривайте в пример
№1).
-
a = b – это инструкция присваивания (например, a = 5**2 — 3 или
b = len([1, 2, 3])). Помимо этого имеются и другие формы присваивания: комбинированные инструкции присваивания (например,
a += 5 или b **= 7), позиционное присваивание (например, a, b = 5, 7 или
[a, b] = ‘AB’), операция распаковывания последовательностей (например, a, *b = 1, 2, 3 или
a, *b, c = ‘ABCDEF’), а также групповое присваивание одного значения (например, a = b = c = 5). Алгоритм присваивания
у всех этих форм несколько отличается, но главная цель у них одна – это создание ссылок на объекты и сохранение их в переменных. При этом стоит добавить, что присваивание может
быть и неявным, например, в вызовах функций или в заголовках циклов, но в любом случае результатом будут ссылки на объекты, сохраненные в переменных. -
def – определение функций и методов. Например,
def my_func(a, b, c=0, *d): return a + b + c + d[0]. - return – возврат результата из функций и методов.
-
yield – инструкция возврата результата из функции-генератора с сохранением состояния ее
локальных переменных. При повторном вызове такой функции выполнение, в отличие от инструкции return, продолжается с ключевого слова
yield, на котором ее работа была прервана ранее. - class – определение классов. Например, class MyСlass: pass.
- pass – пустая инструкция-заполнитель.
-
global – инструкция объявления используемых переменных глобальными (если переменных несколько, то они
перечисляются через запятую). -
nonlocal – инструкция используется во вложенных функциях и объявляет переменные нелокальными. В результате
интерпретатор будет использовать переменные с указанными именами из ближайшей области видимости (т.е. объемлющей функции), исключая глобальную. - if/elif/else – условная инструкция.
- for/else – инструкция обхода последовательности в цикле.
- while/else – цикл общего назначения.
- break – инструкция выхода из цикла.
- continue – инструкция перехода в начало цикла.
-
import – инструкция импорта всех доступных имен из указанных модулей (модули
присваиваются по одному за одну инструкцию, хотя допускается и по несколько за раз, но тогда они перечисляются через запятую). -
from/import – инструкция импорта из модуля только указанных имен
(имена перечисляются через запятую). Например, from math import pi as p, tau as t. - try/except/finally – инструкция обработки исключений.
- raise – инструкция возбуждения исключений.
-
assert – инструкция отладки, которая позволяет производить проверку
истинности утверждений и выводить сообщение об ошибке. Например, assert x > y, ‘Значение x недопустимо мало!’. - with/as – менеджер контекста.
-
del – инструкция удаления ссылок на объекты (если ссылок несколько, то они перечисляются через запятую). Например,
del a, b[0], c[‘car’] .
Отметим, что список инструкций языка Python постоянно изменяется. Происходит это не сразу, но после выхода очередных версий языка регулярно появляются новые
виды инструкций, а некоторые старые виды постепенно обновляются или вообще удаляются.
Что касается вызовов функций, генераторов и других выражений, то они тоже являются инструкциями, но при этом их выделяются в особую группу за счет следующих особенностей:
-
могут объединяться операторами в сколь угодно длинные конструкции, которые в итоге последовательных операций вычисляются интерпретатором и возвращаются в виде одного
единственного значения (объекта некоторого типа); - могут использоваться внутри других инструкций, являясь их составной частью.
Например, инструкция присваивания res = 5 + my_func(1, 2) содержит в правой части выражение, включающее вызов функции. Однако в
результате вычислений в переменной сохранится ссылка лишь на один итоговый объект.
В отличие от выражений обычные инструкции в Python не могут использоваться там, где ожидается значение. Поэтому их нельзя использовать в качестве
аргументов функций, правой части присваиваний, в качестве операций или возвращаемых значений. Например, если в инструкции выше заменить вызов функции ее определением в виде
res = 5 + (def my_func(a, b): return a + b), интерпретатор возбудит исключение.
По умолчанию интерпретатор Python выполняет инструкции последовательно одна за другой в порядке их следования в коде. Однако ряд специальных
инструкций, называемых управляющими конструкциями, позволяют изменять ход выполнения программы по умолчанию. К ним
относятся:
-
условные инструкции, такие как if/else или
if/elif/else, которые указывают интерпретатору Python на выполнение или пропуск других
инструкций в зависимости от значения условного выражения; -
инструкции циклов, такие как for/in или
while, которые указывают интерпретатору на многократное выполнение других инструкций; -
инструкции переходов, такие как break,
continue или return, которые указывают интерпретатору на выполнение перехода в другую
часть программы; -
инструкции обработки исключений, такие как try/except/else
или try/except/finally, которые указывают интерпретатору на выполнение перехода в другую часть программы в случае возникновения
ошибок.
Выражения в Python
Выражения являются не менее важными строительными элементами в Python, чем другие инструкции. Ведь большая часть того, что пишется в коде, является
выражениями.
Выражение (от
англ. expression) – это любая единица исходного кода Python,
которая может быть вычислена интерпретатором для получения значения. При этом литералы и переменные считаются выражениями сами по себе, а вызовы функций и некоторые другие конструкции
вроде генераторов следует относить к выражениям из-за того, что они явно или неявно, но дают результат.
Выражения делятся на простые (первичные) и сложные. Простые выражения не могут быть разделены на еще более простые выражения. К ним относятся, например, литералы, инициализированные
переменные, вызовы функций. Сложные выражения составляются из более простых при помощи различных операторов, которые позволяют выполнять такие операции, как сложение, вычитание,
конкатенация и другие (см. пример №2).
Код
Результат
pythonCodes
# Присваивается смешанное выражение, включающее
# генератор списка, арифметические выражения,
# выражения сравнения и логическое выражение.
li = [x*10 for x in (0, 1, 2, 3) if x > 0 and x != 3]
# Анонимная функция и ее вызов в арифметическом выражении.
res = (lambda a, b: a + b)(li[0], li[1])**2
# Выражения с операторами идентичности и членства,
# выражения вызовов функций.
if res in [900, 1000] and type(res) is int:
print(res)
900
Пример №2. Использование выражений в Python.
В примере выше простые выражения литерального значения (например, 10, (0, 1, 2, 3), int),
выражения переменных (например, x или res) и выражения вызовов функций (например,
type(res) или более сложный вызов анонимной функции (lambda a, b: a + b)(li[0], li[1])) посредством операторов объединяются
в более длинные смешанные выражения. Однако все эти примеры далеко не предел, т.к. выражения могут использоваться везде, где интерпретатор ожидает получить значение. Да, порой выражения могут
выглядеть довольно длинными и сложными, но в результате вычислений на выходе интерпретатор все равно будет оперировать каким-то одним результирующим значением.
Опять же, в последующих параграфах мы обязательно рассмотрим все виды выражений и особенности их использования более подробно. Сейчас же, просто перечислим основные из них для
ознакомления, дав краткие пояснения (в процессе чтения обязательно еще раз посматривайте в пример №2).
-
Выражения литерального значения – это литералы в коде программы, например, ‘ten’ (строка),
10 (число), [‘ten’, 10] (список) или list (объект). -
Выражения переменных – обычные инициализированные переменные, например, res в выражении
res in [900, 1000] (здесь переменная уже инициализирована, а значит обращение к ней возвращает значение, сохраненное в памяти под данным именем). - Арифметические выражения – используются привычные нам математические операторы, например, a + b**3.
- Условные выражения или выражения сравнения – используются операторы сравнения, например, a <= b.
- Выражения с логическими операторами – используются логические операторы, например, a > b and a < c.
- Выражения с побитовыми операторами – используются побитовые операторы, например, a&b.
-
Выражения с операторами принадлежности – используются операторы принадлежности (членства) in и
not in, например, 5 in [1, 2, 3]. -
Выражения с операторами идентичности – используются операторы идентичности is и
is not, например, 5 is not ‘5’. - Вызовы функций и методов – это тоже выражения, т.к. они явно или неявно возвращают результат, например, f(3, 5).
-
Генераторы – генераторы выражений, списков, словарей, множеств. Например,
{simb for simb in ‘123’}. -
lambda-выражения – это специальные конструкции, которые позволяют
встраивать определения функций в программный код выражений. Их еще называют анонимными функциями. Например,
5**2 + (lambda x, y: x — y)(5, 2). -
Выражения присваивания – используется моржовый оператор
:=, который позволяет присваивать значения непосредственно в выражении. Например, x = 5 + (y:=5). -
Трехместные выражения if/else – эти конструкции позволяют использовать в выражениях
условную инструкцию if/else в ее простейшей форме. Например, x = True if y > 0 else False.
Да, разделение по категориям получилось несколько условным, но вполне наглядным для того, чтобы отличать в коде выражения от инструкций. Это внешне. Логически выражения также несколько
отличаются по своему использованию и смысловому содержанию. Ведь выражения – это все, что состоит из объектов (ну, или ссылок на них) и операторов и может быть вычислено интерпретатором
для получения значения, а инструкции – это указания на выполнение программой каких-либо действий (необязательно вычислений). Да, выражения вполне обоснованно можно считать особым видом
инструкций, результатом исполнения которых являются значения. Но при этом не стоит забывать, что на практике выражения практически всегда входят в состав каких-либо инструкций и других более
сложных смешанных выражений, а вот использование инструкций в выражениях недопустимо (например, инструкция d = 5 + (def my_func(): return 3) однозначно вызовет
сбой скрипта).
Операторы в Python
Как было сказано выше, для составления более сложных выражений используются операторы, которые позволяют выполнять над объектами этих выражений некоторые операции. Но
что мы имеем в виду, когда говорим, что хотим выполнить над объектами некоторую операцию при помощи соответствующего оператора?
Операции (от
англ. operations) – это те действия, которые мы выполняем над переменными и объектами.
Некоторые операции нам уже известны (например, сложение, умножение, присваивание или сравнение), знакомство с другими еще только предстоит. Но в любом случае, чтобы
интерпретатор понял, какую операцию над объектами мы хотим выполнить, нужно использовать не слова, а соответствующие им операторы.
Операторы (от
англ. operators) – это элементы программного кода, которые используются для указаний
программе на выполнение определенных действий в выражении. Проще говоря, операторы – это символьные обозначения команд, с помощью которых мы выполняем операции.
Примерами выражений с использованием операторов могут служить
a + b, a != b, -b,
a > b, (b + 7)/(5 — 3**2) и др. Здесь символы и комбинации символов
+, !=, **, —,
/, > и есть операторы. Кстати, выражения или значения, расположенные по сторонам операторов,
называют операндами.
Большинство операторов обрабатывают свои операнды в определенном направлении. Это свойство принято называть ассоциативностью. Одни
операторы выполняют обработку своих операндов слева направо, обладая левой ассоциативностью, другие обладают правой ассоциативностью, выполняя обработку в обратном
направлении, т.е. справа налево. Также существуют операторы не имеющие ассоциативности.
Кроме того, операторы могут отличаться своим приоритетом, который определяет порядок (очередность) их выполнения в ходе вычисления
значения выражения. Первыми обрабатываются операторы с более высоким приоритетом, затем операторы с более низким приоритетом и так далее по мере убывания их приоритетности.
Если приоритет операторов одинаков, они группируются и обрабатываются либо согласно их ассоциативности, либо в соответствии с установленным для них порядком (это
касается операторов, у которых ассоциативность отсутствует). Также отметим, что для принудительного указания порядка выполнения операторов используются круглые скобки
(см. пример №3).
Код
Результат
pythonCodes
# Теперь a==19, т.к. приоритет оператора * выше, чем у +.
a = 5 + 7*2
print('5 + 7*2 ->', a)
# Теперь b==24, т.к. порядок был указан при помощи скобок.
b = (5 + 7)*2
print('(5 + 7)*2 ->', b, end='\n\n')
c = 2
# Вернет True, т.к. согласно принятому порядку
# это тоже самое, что и a < b and b > c.
print(a < b > c)
# Вернет False, т.к. скобки явно указывают порядок выполнения.
print('a < (b > c) ->', a < (b > c), end='\n\n')
# Согласно принятому порядку это тоже самое, что и c = (a = b).
# А вот использование инструкции c = a += b вызовет ошибку.
c = a = b
# Теперь d == -8, т.к. операторы - и - имеют равный приоритет и
# левую ассоциативность, поэтому 5 - 6 - 7 == (5 - 6) - 7.
d = 5 - 6 - 7
print('5 - 6 - 7 ->', d, end='\n\n')
# Теперь d == 1, т.к. (0 and 0 or 1) == (0 and 0) or 1.
d = 0 and 0 or 1
print('0 and 0 or 1 ->', d)
# Теперь d == 0, т.к. операция в скобках выполняется первой.
d = 0 and (0 or 1)
print('0 and (0 or 1) ->', d)
5 + 7*2 -> 19
(5 + 7)*2 -> 24
True
a < (b > c) -> False
5 - 6 - 7 -> -8
0 and 0 or 1 -> 1
0 and (1 or 0) -> 0
Пример №3. Использование операторов в Python.
Для большей наглядности мы перечислили основные операторы языка Python, использующиеся в выражениях, в порядке убывания их приоритетов
в таблице №4. Чем ниже приоритет, тем ниже находится строка с соответствующими операторами. Если операторы имеют одинаковый приоритет,
они перечисляются в одной и той же строке таблицы.
Оператор | Описание | Ассоциативность |
---|---|---|
** | Возведение в степень | Справа налево |
~ + — |
Побитовое отрицание (инверсия битов) Унарный плюс Унарный минус |
Справа налево |
* / % // |
Умножение Деление Деление по модулю Целочисленное деление |
Слева направо |
+ — |
Сложение Вычитание |
Слева направо |
<< >> |
Побитовый сдвиг влево Побитовый сдвиг вправо |
Слева направо |
& | Побитовое and (И) | Слева направо |
^ | Побитовое xor (исключающее ИЛИ) | Слева направо |
| | Побитовое or (ИЛИ) | Слева направо |
< <= > >= == != is, is not in, not in |
Меньше Меньше или равно Больше Больше или равно Равно Не равно Операторы тождественности Операторы членства |
Отсутствует |
not | Логическое отрицание (НЕ) | Справа налево |
and | Логическое И | Слева направо |
or | Логическое ИЛИ | Слева направо |
:= | Моржовый оператор (выражение присваивания) | Справа налево |
Таблица №4. Основные операторы языка Python.
Старайтесь всегда использовать скобки, непосредственно определяя порядок группировки и не полагаясь на приоритет или ассоциативность операторов, поскольку это
облегчит сопровождение кода и поиск ошибок как при наличии сложных выражений, так и в случае изменения поведения операторов при переходе от одной версии
Python к другой.
Большинство операторов, приведенных в таблице, являются бинарными, т.е. используются с двумя операндами (например,
+, —, !=). Есть также операторы, которые
работают только с одним операндом, их называют унарными. Примером может служить —
(оператор отрицания или унарный минус), который применяется для смены знака числа на противоположный.
В конце параграфа хотелось бы еще раз отметить, что фрагменты кода с присваиванием значений переменным в Python принято
считать инструкциями присваивания. Это связано с тем, что такие фрагменты внутри обычных выражений не разрешены, а в документации все операторы присваивания
объединены в одну группу и перечислены в отдельном пункте 2.6 «Delimiters» вместе
с другими разделителями (хотя и с оговоркой, что они могут выступать в роли операторов). Например, фрагменты кода d = 5,
s += 7**2 или li[0] += 3 — f мы будем называть инструкциями присваивания. Тем не
менее одна форма выражения присваивания в языке все таки имеется. Формируется она при помощи недавно введенного моржового оператора
:=, который может использоваться не только в инструкциях, но и внутри обычных выражений. Например, инструкция присваивания
li = [a := 1, b := 2] включает также и два выражения присваивания.
Краткие итоги параграфа
-
Инструкции – это команды на языке Python, которые сообщают интерпретатору последовательность
действий, необходимых для достижения поставленных целей. По умолчанию интерпретатор выполняет инструкции последовательно одна за другой в порядке их следования
в коде. Если нужно изменить выполнение хода программы по умолчанию, используются управляющие конструкции: условные инструкции, циклы, инструкции переходов или
инструкции обработки исключений. -
Выражение – это любая единица исходного кода Python, которая может быть вычислена
интерпретатором для получения значения. Сложные выражения составляются из более простых при помощи различных операторов, которые позволяют выполнять над объектами
такие операции как сложение, вычитание, сравнение и т.д. Но каким бы сложным не было выражение, в результате последовательных вычислений на выходе интерпретатор
все равно будет оперировать каким-то одним результирующим значением. -
Важно помнить, что на практике выражения практически всегда входят в состав каких-либо инструкций, а вот использование последних в выражениях недопустимо
(например, попытка выполнения инструкции d = if 3>k: k=3 приведет к ошибке). -
Операторы представляют собой символьные обозначения команд, с помощью которых мы выполняем операции над объектами. Выражения или значения, расположенные по сторонам
операторов, называют операндами. Если оператор используется с двумя операндами, его называют бинарным. Если же оператор работает только с одним операндом, его
называют унарным. Так в выражении -3 + (2 — 5)*7 операторы + и *
представляют собой бинарные операторы, а вот оператор — используется и как бинарный оператор вычитания, и как унарный минус. -
Большинство операторов обрабатывают свои операнды в определенном направлении. Это свойство принято называть ассоциативностью. Одни операторы выполняют обработку
своих операндов слева направо, обладая левой ассоциативностью, другие обладают правой ассоциативностью, выполняя обработку в обратном направлении, т.е. справа налево.
Кроме того, существуют операторы не имеющие ассоциативности. Так левой ассоциативностью, в основном обладают бинарные операторы, правая ассоциативность
присуща унарным операторам, а операторы сравнения вообще не обладают ассоциативностью. -
Важным является и приоритет операторов, т.к. операторы с большим приоритетом обрабатываются первыми. Например, значением выражения
2*7 + 4 будет 18, а не 22, т.к. приоритет оператора умножения
выше приоритета оператора сложения. -
Если приоритет операторов одинаков, они группируются и обрабатываются либо согласно их ассоциативности, либо в соответствии с установленным для них порядком (это
касается операторов, у которых ассоциативность отсутствует). В любом случае лучше всегда использовать скобки, непосредственно определяя порядок группировки и не
полагаясь на приоритет или ассоциативность операторов.
Вопросы и задания для самоконтроля
1. Что такое инструкция? А что такое выражение? Можно ли считать любое выражение инструкцией и наоборот?
Показать решение.
Ответ. Инструкция в Python – это команда интерпретатору на выполнение
какого-либо действия по обработке порции информации. А выражение – это любая единица исходного кода Python, которая может
быть вычислена интерпретатором для получения значения.
В принципе любое выражение можно считать особым видом инструкций, которые указывают интерпретатору на вычисление какого-либо фрагмента кода и в результате выполнения
приводят к какому-то значению. Но не любая инструкция может считаться выражением, т.к. инструкции могут указывать не только на вычисления, но и, например, на простой
переход в другую часть программы или выполнение кода определенное число раз. Более того, в Python инструкции могут содержать выражения,
а вот использовать инструкции в составе выражений нельзя (если, конечно, инструкция сама не является выражением).
2. Какие из представленных фрагментов кода относятся к инструкциям, а какие к выражениям:
2**3 + my_func(a),
if a > 2**3: print(a),
s = 2**3,
a < 2**3 and a > 5? Будем считать, что переменные уже инициализированны, а функция определена.
Показать решение.
Ответ. if a > 2**3: print(a) – условная инструкция, хотя в ней и
содержится выражение a > 2**3; s = 2**3 – инструкция присваивания;
2**3 + my_func(a) и a < 2**3 and a > 5 – выражения, т.к. оба фрагмента кода
содержат только операторы и объекты и могут быть вычислены.
3. Какие значения будут присвоены переменным в результате вычисления выражений
a = 5 + 10*5,
b = 5/10*5,
a = True in [True] is True? Выведите их на экран.
Показать решение.
Решение
Результат
pythonCodes
# Приоритет оператора умножения выше.
# 5 + 10*5 == 5 + (10*5).
a = 5+10*5
# Выведет 55.
print('5 + 10*5 =', a, end='\n\n')
# Приоритет одинаков, ассоциативность левая.
# 5/10*5 == (5/10)*5.
b = 5/10*5
# Выведет 2.5.
print('5/10*5 =', b, end='\n\n')
# Приоритет оператора is выше.
# True in [True] is True == True in ([True] is True).
res = True in [True] is True
# Выведет False.
print('True in [True] is True ->', res)
5 + 10*5 = 55
5/10*5 = 2.5
True in [True] is True -> False
4. Какие из представленных фрагментов кода содержат ошибки:
a = 7 *= 3,
c = [8, (b = True) or (g = False)],
a = 7 + (b = 5*2),
a = 7 + (b := 5*2)? Объясните ответ.
Показать решение.
Ответ. Все фрагменты кода, кроме последнего, содержат ошибки, т.к. использование инструкций присваивания внутри
обычных выражений недопустимо. А вот в состав последнего примера входит именно выражение присваивания, поскольку вместо обычного оператора присваивания был
использован моржовый оператор присваивания :=.
Быстрый переход к другим страницам
Инструкции/Операторы
Инструкция — это (грубо говоря) команда, действие, как и оператор
, но вполне часто можно заметить разделение: арифметические операторы называют как не странно операторами
, а вот оператор объявления функции def
часто могут назвать инструкцией.
В целом же разницы между ними нет.
while True:
print(«I love you!»)
Давайте добавим еще одно определение:
Оператор — это элемент программного кода, который описывает то или иное действие в выражении (операцию). В большинстве языков программирования высокого уровня оператор — это символ, благодаря которому могут производиться различные виды вычислений, сравнений или присваиваний с участием одного или нескольких значений.
Операнд — это значение, переменная или выражение, которое расположено слева или справа от оператора.
Операторы бывают:
- Унарные: когда с оператором используется только один операнд
- Бинарные: когда с оператором используется два операнда
- Тернарные: когда с оператором используется три оператора
Во многих языках тернарный оператор один, и отвечает он за ветвлениеSOME_INT = 3
is_odd = True if SOME_INT % 2 != 0 else False
На этом изображении примеры перечислены в порядке:
- Бинарный оператор сложения
- Унарный оператор инкремента
- Тернарный оператор ветвления
Выражения
Это инструкция которая которая возвращает значение, чтобы было понятнее давайте посмотрим на такой ошибочный код:
А вот вам определение из с сайта MDN
Выражением является любой корректный блок кода, который возвращает значение.
Ну вот… вроде бы мы с вами воспользовались оператором del
, но этот оператор ничего не возвращает, а значит в консоль ничего не попало. Ну и вообще вы получили SyntaxError
. А вот второй пример:
print(«even» if 3 % 2 == 0 else «odd»)
В этом примере мы воспользовались тернарным оператором
(<value> if <conditional> else <value>
)
Комментарий
Простые, однострочные комментарии в python
очень примитивные, их один вариант:
Давайте к коментариям отнесем и docstring
def foo():
«»»My awesome function»»»
pass
То что вы видите выше является объявлением функции, но есть интересная деталь в том, что если в начале тела функции встречается строчный литерал, то строка объявленная в начале будет считаться документацией(комментарием) к функции.
docstring
попадает в аттрибут __doc__
функции:
Аналогично строчный литерал объявленый в начале файла будет документацией модуля
.
«»»
This is very cool module!
«»»
def main():
pass
У модуля тоже есть аттрибут __doc__
:
import some_module
print(some_module.__doc__)
Глобальная функция help()
Обращаться к методам с двумя подчеркиваниями считается плохим тоном, поэтому у нас есть функция help()
которая вернет нам поле __doc__
объекта
Полезные ссылки
Раздел: Статьи /
Питон /
Учимся программировать на Python
Python — один из самых востребованных языков программирования. Подпишитесь на бесплатную рассылку и получайте статьи и видео о программировании на Python. |
Несмотря на свой достаточно большой опыт в программировании, я до сих пор путаюсь в некоторых понятиях. И даже если умом понимаю отличия, иногда всё равно говорю одно, подразумевая другое.
Но надо как-то отличать “мух от котлет”, и хотя бы пытаться называть вещи своими именами. Вот я и пытаюсь. А заодно делюсь своими знаниями с другими. И вот сегодня о том, что такое выражения и инструкции.
Вообще это касается большинства языков программирования, но я буду объяснять на примере Python.
Выражение (expression) — это комбинация значений, переменных и операторов. Само по себе значение или переменная также считаются выражениями, так что все приведенные ниже выражения допустимы:
50 13 x + 25
В Python вы можете напечатать всё это, и интерпретатор не выдаст никаких ошибок (при условии, что переменная х была ранее объявлена).
Когда вы вводите выражение в интерпретаторе, то он вычисляет его и возвращает значение. Это происходит всегда. То есть если вы введёте даже просто число, например, 50, то интерпретатор всё равно вычислит его, получит значение 50, и выведет это значение на экран.
Инструкция (statement) — это блок кода, который что-то делает, например создает переменную или выводит значение на экран.
z = 13 print(z)
Первая строка — это инструкция присваивания, которая присваивает
значение переменной z
. Вторая строка — это инструкция печати, которая
выводит значение z на экран.
И вот здесь всегда возникает путаница. Во-первых, потому что во многих языках инструкции называют операторами (“оператор присваивания” — наверняка вы слышали такое выражение много раз).
Во-вторых, вообще-то print()
— это функция. И можно с таким же успехом сказать, что во второй строке у нас функция печати, которая выводит значение на экран.
Так как же на самом деле правильно? А хрен его знает. Я встречал в разных источниках и те и другие названия. Поэтому и сам я не особо заморачиваюсь. Когда говорю “инструкция”, а когда — “оператор”. Хотя это ещё зависит от языка. В Python, например, чаще всего эти вещи называют именно так.
Все способы изучить Python
Каждый раз, изучая какую-то новую науку, мы задаёмся вопросом — где взять обучающие материалы. Конечно, сегодня нам помогает в этом Интернет. Но иногда на поиски уходит очень много времени, а нужного результата мы не получаем… Собрал для вас кучу полезных ссылок для изучения Python. не благодарите ))) |
В этом руководстве вы узнаете об операторах в Python, о важности использования отступов и комментариев.
Инструкции
Инструкции, которые может выполнять интерпретатор Python, называются операторами. Например, a = 1
— это оператор присваивания. Оператор if
, оператор for
, оператор while
и т. д. — это другие типы операторов, которые мы обсудим позже.
Многострочные инструкции
В Python для окончания инструкции используют символ новой строки. Но можно разбить инструкцию на несколько строк символом продолжения строки (\). Например:
a = 1 + 2 + 3 + \
4 + 5 + 6 + \
7 + 8 + 9
Это явное продолжение строки. В Python продолжение строки выполняется внутри круглых ( )
, квадратных [ ]
и фигурных скобок { }
. Например, так мы можем реализовать показанную выше многострочность:
a = (1 + 2 + 3 +
4 + 5 + 6 +
7 + 8 + 9)
Здесь круглые скобки ( )
неявно продолжают строку. То же самое с [ ]
и { }
. Например:
colors = ['красный',
'голубой',
'зеленый']
Мы также можем поместить несколько выражений в одну строку с помощью точки с запятой, как показано ниже:
a = 1; b = 2; c = 3
Отступы
Большинство языков программирования, таких как C, C ++ и Java, используют фигурные скобки { }
для определения блока кода. Однако Python использует отступы.
Блок кода (тело функции, цикла и т. д.) начинается с отступа и заканчивается первой строкой без отступа. Размер отступа зависит от вас, но он должен быть одинаковым на протяжении всего блока.
Как правило, для отступов используют четыре пробела или табуляцию. Вот пример:
for i in range(1,11):
print(i)
if i == 5:
break
Применение отступов в Python делает код аккуратным и чистым. Программы благодаря отступам выглядят последовательными. С ними блоки кода визуально легче отличать друг от друга.
Сравните:
if True:
print('Привет')
a = 5
и
if True: print('Привет'); a = 5
Оба варианта допустимы и сделают одно и то же, но первый вариант — читабельнее.
Неправильный отступ приведет к ошибке IndentationError
.
Комментарии
Комментарии очень важны при написании программы. Они описывают, что происходит внутри программы, чтобы человеку, который читает код, было проще разобраться в нем.
Вы можете забыть детали программы, написанной даже месяц назад. Поэтому всегда полезно уделять время на пояснение основных моментов в комментариях.
В Python для комментариев используется символ решетки (#).
Комментарий заканчивается символом новой строки. Интерпретатор Python игнорирует комментарии.
#Это комментарий
#выводим «Привет»
print('Привет')
Многострочные комментарии
В Python можно использовать многострочные комментарии. Один из способов — использовать символ решетки (#) в начале каждой строки. Например:
#Это длинный комментарий,
#и он продолжается
#на несколько строк
Можно поступить иначе — использовать тройные кавычки: '''
или """
.
Тройные кавычки обычно используются для многострочных строк. Но их также можно использовать для многострочных комментариев. Если они не являются строками документации, они не создают никакого дополнительного кода.
"""Это тоже
пример прекрасного
многострочного комментария"""
Строки документации (docstrings) в Python
Docstring — это сокращение от documentation string (строка документации).
Строки документации в Python — это строковые литералы, которые появляются сразу после определения функции, метода, класса или модуля.
При написании строк документации используются тройные кавычки. Например:
def double(num):
"""Функция, которая удваивает значение"""
return 2*num
Строки документации появляются сразу после определения функции, класса или модуля. Это и отличает их от многострочных комментариев, написанных с использованием тройных кавычек.
Строка документации связана с объектом как его атрибут __doc__
.
Так что мы можем получить доступ к строкам документации функции с помощью следующих строк кода:
def double(num):
"""Функция, которая удваивает значение"""
return 2*num
print(double.__doc__)
Вывод:
Функция, которая удваивает значение