# Содержание

Замечания по предыдущему листку;
Обмен значений в питоне;
Целочисленное округление вверх;
Синтаксис условной инструкции;
Операторы сравнения;
Каскадные условные инструкции;
Логические операторы;
Тип данных bool;
Вложенные условные инструкции;

# Замечания по предыдущему листку

# Обмен значений в питоне

Обмен значений двух переменных в языке Питон легко делается так:

(a, b) = (b, a)

Здесь в круглых скобках записан кортеж — последовательность из нескольких элементов. Одному кортежу можно присвоить значение другого кортежа. Этим можно пользоваться, если нужно одновременно изменить несколько переменных, например, возможна такая запись:

(x, y, z) = (x + y, y + z, z + x)

На самом деле скобки при этом можно не писать:

a, b = b, a
Совсем на самом деле...

Если забраться совсем в дебри, то при выполнении конструкции

a, b = b, a

не создаются кортежи, хотя выглядит всё именно так. Питон сначала любую программу превращает в то, что называется байткод. Байткод уже выполняется достаточно «просто» и прямолинейно.
Без объяснения подробностей байткод для кода выше выглядит так:

              0 LOAD_FAST                1 (b)
              2 LOAD_FAST                0 (a)
              4 ROT_TWO
              6 STORE_FAST               0 (a)
              8 STORE_FAST               1 (b)

Если сохранить промежуточный кортеж в переменную, то получится так:

tup = (b, a) a, b = tup
              0 LOAD_FAST                1 (b)
              2 LOAD_FAST                0 (a)
              4 BUILD_TUPLE              2
              6 STORE_FAST               2 (tup)
              8 LOAD_FAST                2 (tup)
             10 UNPACK_SEQUENCE          2
             12 STORE_FAST               0 (a)
             14 STORE_FAST               1 (b)


# Целочисленное округление вверх

В задаче «автопробег» необходимо было найти целочисленное частное от деления m на n с округлением вверх. Обычно это делается на основе известного математического факта: (m + n - 1) // n.

# Синтаксис условной инструкции

Все ранее рассматриваемые программы имели линейную структуру: все инструкции выполнялись последовательно одна за одной, каждая записанная инструкция обязательно выполняется.

if-else

Допустим мы хотим по данному числу x определить его абсолютную величину (модуль). Программа должна напечатать значение переменной x, если x>0 или же величину -x в противном случае. Линейная структура программы нарушается: в зависимости от справедливости условия x>0 должна быть выведена одна или другая величина. Соответствующий фрагмент программы на Питоне имеет вид:

x = int(input()) if x > 0: print(x) else: print(-x)

В этой программе используется условная инструкция if (если). После слова if указывается проверяемое условие (x > 0), завершающееся двоеточием. После этого идёт блок (последовательность) инструкций, который будет выполнен, если условие истинно, в нашем примере это вывод на экран величины x. Затем идёт слово else (иначе), также завершающееся двоеточием, и блок инструкций, который будет выполнен, если проверяемое условие неверно, в данном случае будет выведено значение -x.

Итак, условная инструкция в Питоне имеет следующий синтаксис:

if Условие: Блок_инструкций_1 else: Блок_инструкций_2

Блок_инструкций_1 будет выполнен, если Условие истинно. Если Условие ложно, будет выполнен Блок_инструкций_2.

if-else

В условной инструкции может отсутствовать слово else и последующий блок. Такая инструкция называется неполным ветвлением. Например, если дано число x и мы хотим заменить его на абсолютную величину x, то это можно сделать следующим образом:

if x < 0: x = -x print(x)

В этом примере переменной x будет присвоено значение -x, но только в том случае, когда x < 0. А вот инструкция print(x) будет выполнена всегда, независимо от проверяемого условия.

Кстати, получить модуль числа можно и сразу при помощи функции abs(x). Так как школьники редко внимательно читают тексты, то немногие сумеют воспользоваться этим знанием в задаче про ход слона :)

Для выделения блока инструкций, относящихся к инструкции if или else в языке Питон используются отступы. Все инструкции, которые относятся к одному блоку, должны иметь равную величину отступа, то есть одинаковое число пробелов в начале строки. Рекомендуется использовать отступ в 4 пробела и не рекомедуется использовать в качестве отступа символ табуляции.

Это одно из существенных отличий синтаксиса Питона от синтаксиса большинства языков, в которых блоки выделяются специальными словами, например, нц... кц в Кумире, begin... end в Паскале или фигурными скобками в Си.

# Операторы сравнения

Как правило, в качестве проверяемого условия используется результат вычисления одного из следующих операторов сравнения:

<
Меньше — условие верно, если первый операнд меньше второго.
>
Больше — условие верно, если первый операнд больше второго.
<=
Меньше или равно.
>=
Больше или равно.
==
Равенство. Условие верно, если два операнда равны.
!=
Неравенство. Условие верно, если два операнда неравны.

Например, условие (x * x < 1000) означает «значение x * x меньше 1000», а условие (2 * x != y) означает «удвоенное значение переменной x не равно значению переменной y».

Операторы сравнения в Питоне можно объединять в цепочки (в отличии от большинства других языков программирования, где для этого нужно использовать логические связки), например, a == b == c или 1 <= x <= 10.

if-else

# Каскадные условные инструкции

Если все случаи не ограничиваются двумя, то можно добавлять дополнительные проверки. Получится конструкция if... elif... else. Покажем это на примере программы, которая по данным ненулевым числам x и y определяет, в какой из четвертей координатной плоскости находится точка (x,y):

x = int(input()) y = int(input()) if x > 0 and y > 0: print("Первая четверть") elif x > 0 and y < 0: print("Четвёртая четверть") elif y > 0: print("Вторая четверть") else: print("Третья четверть")

В такой конструкции условия if, ..., elif проверяются по очереди, выполняется блок, соответствующий первому из истинных условий. Если все проверяемые условия ложны, то выполняется блок else, если он присутствует.

# Логические операторы

Иногда нужно проверить одновременно не одно, а несколько условий. Например, проверить, является ли данное число чётным можно при помощи условия (n % 2 == 0) (остаток от деления n на 2 равен 0), а если необходимо проверить, что два данных целых числа n и m являются чётными, необходимо проверить справедливость обоих условий: n % 2 == 0 и m % 2 == 0, для чего их необходимо объединить при помощи оператора and (логическое И): n % 2 == 0 and m % 2 == 0.

Вообще в питоне, как уже говорилось, можно писать if n % 2 == m % 2 == 0:. Но не все логические связки можно так записать.

Стандартные логические операторы: логическое И, логическое ИЛИ, логическое отрицание.

Логическое И является бинарным оператором (то есть оператором с двумя операндами: левым и правым) и имеет вид and. Оператор and возвращает True тогда и только тогда, когда оба его операнда имеют значение True.

Логическое ИЛИ является бинарным оператором и возвращает True тогда и только тогда, когда хотя бы один операнд равен True. Оператор «логическое ИЛИ» имеет вид or.

Логическое НЕ (отрицание) является унарным (то есть с одним операндом) оператором и имеет вид not, за которым следует единственный операнд. Логическое НЕ возвращает True, если операнд равен False и наоборот.

Пример. Проверим, что хотя бы одно из чисел a или b оканчивается на 0:

if a % 10 == 0 or b % 10 == 0:

Проверим, что число a — положительное, а b — неотрицательное:

if a > 0 and not (b < 0):

Или можно вместо not (b < 0) записать (b >= 0).

# Тип данных bool

Операторы сравнения возвращают значения специального логического типа bool. Значения логического типа могут принимать одно из двух значений: True (истина) или False (ложь). Если преобразовать логическое True к типу int, то получится 1, а преобразование False даст 0. При обратном преобразовании число 0 преобразуется в False, а любое ненулевое число в True. При преобразовании str в bool пустая строка преобразовывается в False, а любая непустая строка в True.

Суммируем логические выражения
>>> True == 1 True >>> False == 0 True
То свойство, что истина и ложь при превращении в числа равны 1 и 0 соответственно, позволяет писать кратко некоторые вещи. Например, пусть у нас есть числа a, b, c, и мы хотим узнать, сколько из них больше нуля. Вместо громоздкой конструкции
res = 0 if a > 0: res += 1 if b > 0: res += 1 if c > 0: res += 1
можно написать коротко
res = (a > 0) + (b > 0) + (c > 0)


Так как сравнения возвращают значения, то их можно сохранить в переменную. Иногда это позволяет сделать код более читаемым. Вместо

if первое_сложное_громоздкое_условие_чтобы_понять_слева_ли or второе_сложное_громоздкое_условие_чтобы_понять_сверху_ли: ...

можно писать

on_the_left = первое_сложное_громоздкое_условие_чтобы_понять_слева_ли on_the_top = второе_сложное_громоздкое_условие_чтобы_понять_сверху_ли if on_the_left or on_the_top: ...

# Вложенные условные инструкции

Внутри условных инструкций можно использовать любые инструкции языка Питон, в том числе и условную инструкцию. Получаем вложенное ветвление — после одной развилки в ходе исполнения программы появляется другая развилка. При этом вложенные блоки имеют больший размер отступа (например, 8 пробелов). Покажем это на примере программы, которая по данным ненулевым числам x и y определяет, в какой из четвертей координатной плоскости находится точка (x,y):

x = int(input()) y = int(input()) if x > 0: if y > 0: # x>0, y>0 print("Первая четверть") else: # x>0, y<0 print("Четвёртая четверть") else: if y > 0: # x<0, y>0 print("Вторая четверть") else: # x<0, y<0 print("Третья четверть")

В этом примере мы использовали комментарии — текст, который интерпретатор игнорирует. Комментариями в Питоне является символ # и весь текст после этого символа до конца строки.

Тернарный оператор условия

В языке питон есть тернарная условная операция, подобная [expression]?[on_true]:[on_false] в языке си. Тернарная условная операция принимает на вход три параметра: логическое выражение и два значения, и возвращает первое или второе значение в зависимости от значения логического выражения. Его синтаксис такой:

[on_true] if [expression] else [on_false] >>> 'equal' if 1 == 1 else 'not equal' 'equal' >>> 'equal' if 1 == 2 else 'not equal' 'not equal'

Данную конструкцию можно вкладывать в себя:

res = 'больше' if x > 0 else 'меньше' if x < 0 else 'ноль'

Ситуация, когда тернарный оператор уместен, встречается не так часто.