# Содержание
Замечания по предыдущему листку;
Обмен значений в питоне;
Целочисленное округление вверх;
Синтаксис условной инструкции;
Операторы сравнения;
Каскадные условные инструкции;
Логические операторы;
Тип данных 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.
# Синтаксис условной инструкции
Все ранее рассматриваемые программы имели линейную структуру: все инструкции выполнялись последовательно одна за одной, каждая записанная инструкция обязательно выполняется.
Допустим мы хотим по данному числу 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.
В условной инструкции может отсутствовать слово 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... 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:
print("Первая четверть")
else:
print("Четвёртая четверть")
else:
if y > 0:
print("Вторая четверть")
else:
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 'ноль'
Ситуация, когда тернарный оператор уместен, встречается не так часто.