
5_Проверка_условий_Циклы_Jupyter_Notebook
.pdf
01.10.2022, 14:14 |
5. Проверка условий. Циклы - Jupyter Notebook |
Условные конструкции, множества, цикл while
Проверка условий
Начнем с известных всем операторов. Проверим,
правда ли, что 8 меньше 9; правда ли, что 9 больше 10.
In [1]:
1 8 < 9 # правда
Out[1]:
True
In [2]:
1 9 > 10 # неправда
Out[2]:
False
Результат такой проверки имеет логический тип (boolean).
In [3]:
1 res = 8 < 9
2 res
Out[3]:
True
Как мы уже обсуждали, переменные такого типа могут принимать два значения True или False. Обратите внимание, что True и False не заключены в кавычки ‒ добавив кавычки, мы получим строки "True" и "False".
In [4]:
1 "True" == True
Out[4]:
False
При проверке равенства двух частей (переменных, списков и так далее) используется двойной знак "равно".
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/5. Проверка условий. Циклы.ipynb |
1/14 |

01.10.2022, 14:14 |
5. Проверка условий. Циклы - Jupyter Notebook |
In [5]:
1 6 == 6
Out[5]:
True
Одинарный знак "равно" используется для присваивания значений. Так ничего не сравним, но сохраним в переменную a число 6:
In [6]:
1 a = 6
2 a
Out[6]:
6
А так уже проверим условия:
In [7]:
1 print(a == 6)
2 print(a == 9)
True
False
Неравенство, то есть отрицание равенства, в Python обозначается с помощью оператора != (вообще ! в программировании используется для отрицания).
In [8]:
1 6 != 7
Out[8]:
True
Стоит отметить, что Python достаточно лояльно относится к разделению между типам данных. Например, если мы сравним целое число и то же число, но с плавающей точкой (с дробной частью равной 0), Python сообщит, что эти числа совпадают.
In [9]:
1 6 == 6.0 # верно
Out[9]:
True
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/5. Проверка условий. Циклы.ipynb |
2/14 |

01.10.2022, 14:14 |
5. Проверка условий. Циклы - Jupyter Notebook |
Условные конструкции
Условные конструкции ‒ конструкции с операторами условия. Условная конструкция обычно предполагает "развилку": если условие выполняется, то должен выполняться один набор действий, если нет ‒ другой набор действий. Давайте напишем программу, которая будет просить пользователя ввести целое число, и если это число менее 10, на экран будет выводиться сообщение "Мало", иначе ‒ "Много". И заодно познакомимся с конструкцией if-else.
In [3]:
1 x = int(input("Введите число: "))
Введите число: 10
In [4]:
1 |
if x < 10: |
2 |
print("Мало") |
3 |
else: |
4print("Много")
Много
В части с if мы прописываем условие, в зависимости от которого Python будет делать выбор, что выводить на экран, а после двоеточия перечисляем действия, которые будут выполняться в случае, если x удовлетворяет условию. В части с else мы уже не пишем никакого условия ‒ оператор else сам по себе означает "в случае, если условие в выражении с if не выполнено".
Часть с else является необязательной: программа может существовать только с условием if . Тогда в случае невыполнения условия ничего происходить не будет, Python просто перейдет к следующим строкам кода.
Как быть, если условий несколько? Например, мы просим пользователя ввести оценку, и если оценка больше 10, на экране должно быть сообщение "Много", если ровно 10 ‒ "В самый раз", если меньше ‒ "Мало". Можно воспользоваться оператором elif , который по смыслу является сочетанием else + if : если предыдущее условие невыполнено, то, нужно проверить следующее условие, и если оно тоже не выполнено, то уже перейти к ветке с else .
In [10]:
1 mark = int(input("Введите оценку: "))
Введите оценку: 3
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/5. Проверка условий. Циклы.ipynb |
3/14 |

01.10.2022, 14:14 |
5. Проверка условий. Циклы - Jupyter Notebook |
||
In [11]: |
|
||
1 |
|
if mark > 10: |
|
|
|
||
2 |
|
print("Много") |
|
3 |
|
elif mark == 10: |
|
4 |
|
print("В самый раз") |
|
5 |
|
else: |
|
6 |
|
print("Мало") |
|
|
|
|
|
Мало
Ответвлений с elif может быть несколько: сколько условий, столько и выражений с elif . Добавим еще одно условие:
In [12]: |
|
|
1 |
if mark > |
10: |
2 |
print("Много") |
|
3 |
elif mark |
> 6: |
4 |
print("Хорошо") |
|
5 |
elif mark |
> 4: |
6 |
print("Неплохо") |
|
7 |
else: |
|
8print("Плохо")
Плохо
Законный вопрос: а можно ли обойтись совсем без elif , просто записав несколько выражений с if ? Тут все зависит от ситуации. Иногда решения использовать elif и if будут равнозначными. Если мы перепишем код в примере выше, заменив elif на if , ничего не изменится, так как условия будут проверяться последовательно в любом случае: если оценка больше 10, будет выведено слово "Много", если нет ‒ программа перейдет к следующему условию, и так далее.
In [13]:
1 |
if mark > 10: |
2 |
print("Много") |
3 |
if mark > 6: |
4 |
print("Хорошо") |
5 |
if mark > 4: |
6 |
print("Неплохо") |
7 |
else: |
8print("Плохо")
Плохо
В случае, когда условия как-то связаны между собой, нужно быть более внимательными. Рассмотрим такой пример.
Случай 1.
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/5. Проверка условий. Циклы.ipynb |
4/14 |

01.10.2022, 14:14 |
5. Проверка условий. Циклы - Jupyter Notebook |
|
In [14]: |
|
|
1 |
if mark < |
10: |
2 |
print("Это нормально") |
|
3 |
elif mark |
== 10: |
4 |
print("Отлично") |
|
5 |
if mark < |
6: |
6print("Плохо")
Это нормально Плохо
Если оценка меньше 10, мы выводим на экран сообщение "Это нормально", если нет, то проверяем, равна ли она 10: если да, то выводим "Отлично", если нет ‒ ничего не делаем. При этом, после всех этих действий делаем дополнительную проверку: если оценка меньше 6, выводим "Плохо".
Случай 2. |
|
|
In [15]: |
|
|
1 |
if mark < |
10: |
2 |
print("Это нормально") |
|
3 |
elif mark |
== 10: |
4 |
print("Отлично") |
|
5 |
elif mark |
< 6: |
6print("Плохо")
Это нормально
Если оценка меньше 10, мы выводим на экран сообщение "Это нормально", если нет, то проверяем, равна ли она 10: если да, то выводим "Отлично", если нет ‒ сравниваем ее с 6. Если оценка меньше 6, выводим "Плохо".
Почему во втором случае мы не увидели сообщение "Плохо"? Потому что из-за второго elif мы попросту до него не дошли! На ветку со вторым elif мы попадаем в случае, если предыдущее условие не выполняется, то есть если оценка не равна 10. А на ветку с первым elif мы попадем, в случае, если оценка не менее 10. Получается, что мы должны выводить слово "Плохо" в случае, когда оценка более 10 и при этом менее 6, чего в природе не бывает. Использовав elif необдуманно, мы добавили лишнее условие, которое никогда не будет выполняться! Тут будет полезно вспомнить схемы, которые многие, наверное, видели на уроках информатики в школе. Запоминать их необязательно, просто они хорошо иллюстрируют различия между двумя случаями.
Случай 1
title
Случай 2
title
Возможно, предыдущее обсуждение if и elif могло вас чуть-чуть запутать, но это не повод расстраиваться. Важно просто помнить, что разница между этими операторами есть. Остальное можно проверить экспериментально на конкретном примере :)
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/5. Проверка условий. Циклы.ipynb |
5/14 |

01.10.2022, 14:14 |
5. Проверка условий. Циклы - Jupyter Notebook |
Сложные условия
Пусть у нас есть три целочисленные переменные a , b и c , и мы планируем составлять сложные, составные уcловия, касающиеся этих переменных.
In [16]:
1 a = 3
2 b = 7
3 c = 1
Помогут операторы and и or . Оператор and соответствует одновременному выполнению условий, оператор or соответствует ситуации, когда хотя бы одно из условий выполняется. Оператор or в Python ‒ обычное "или", не исключающее: либо верно первое условие, либо второе, либо оба.
In [17]:
1 (a < b) and (b > c) # оба верны
Out[17]:
True
In [18]:
1 (a < b) and (c > b) # второе неверно -> все неверно
Out[18]:
False
In [16]:
1 (a < b) or (a > c) # первое верное -> хотя бы одно верно
Out[16]:
True
In [19]:
1 (a < b) or (c > b) # первое верное -> хотя бы одно верно
Out[19]:
True
Можем работать с элементами списков:
In [20]:
1 l1 = [1, 3, 6, 8] 2 l2 = [0, 9, 6, 8]
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/5. Проверка условий. Циклы.ipynb |
6/14 |

01.10.2022, 14:14 |
5. Проверка условий. Циклы - Jupyter Notebook |
In [21]:
1 l1[0] > l2[0] # 1 больше 0
Out[21]:
True
In [14]:
1 (l1[0] > l2[0]) and (l1[2] == l2[2]) # оба верны
Out[14]:
True
In [22]:
1 (l1[0] > l2[0]) or (l1[2] == l2[2]) # оба верны
Out[22]:
True
Давайте пройдемся по парам элементов в списках l1 и l2 , и если значения элементов, которые стоят на одном и том же месте, просто в разных списках, совпадают, мы будем выводить сообщение "It's true! They are equal!", а если нет ‒ сообщение "It's false! They are not equal!".
Сначала посмотрим на длину списков:
In [23]:
1 print(len(l1))
2 print(len(l2))
4
4
Списки одинаковой длины, это хорошо! Напишем цикл.
In [24]:
1 for i in range(0, len(l1)):
2if l1[i] == l2[i]:
3print("It's true! They are equal!")
4else:
5print("It's false! They are not equal!")
It's false! They are not equal!
It's false! They are not equal!
It's true! They are equal!
It's true! They are equal!
А теперь предлагаю вам такую задачу. Есть список оценок marks , и для каждой оценки нужно вывести комментарий (Отлично, Хорошо, Удовлетворительно, Плохо) с новой строки.
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/5. Проверка условий. Циклы.ipynb |
7/14 |

01.10.2022, 14:14 |
5. Проверка условий. Циклы - Jupyter Notebook |
|
In [25]: |
|
|
|
|
|
1 |
marks = [2, 7, 8, 10, 5, 8, 1, 6] |
|
|
|
|
Решение:
In [26]:
1 for mark in marks:
2if mark >= 8:
3print("Отлично!")
4elif (mark >= 6) and (mark < 8):
5print("Хорошо!")
6elif (mark >= 4) and (mark < 6):
7print("Удовлетворительно!")
8else:
9print("Плохо!")
Плохо! Хорошо! Отлично! Отлично!
Удовлетворительно! Отлично!
Плохо! Хорошо!
Можно написать аналогичный код, но оценку теперь будет вводить пользователь с клавиатуры.
In [28]:
1 mark = int(input("Введите оценку: ")) 2 if mark >= 8:
3print("Отлично!")
4 elif (mark >= 6) and (mark < 8):
5print("Хорошо!")
6 elif (mark >= 4) and (mark < 6): 7 print("Удовлетворительно!") 8 else:
9print("Плохо!")
Введите оценку: 4 Удовлетворительно!
Небольшое лирическое отступление, не связанное с условиями. В Python есть функция eval() ,
которая позволяет исполнять код, который записан в виде строки. Например, мы сохранили в текстовый файл какие-то списки. Открываем файл, и Python считывает наши списки как обычные строки:
In [29]:
1 s = "[2,5,6,8]"
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/5. Проверка условий. Циклы.ipynb |
8/14 |

01.10.2022, 14:14 |
5. Проверка условий. Циклы - Jupyter Notebook |
In [30]:
1 s
Out[30]:
'[2,5,6,8]'
Если мы применим к строке s функцию eval() , мы получим список.
In [31]:
1 L = eval(s)
2 L
Out[31]:
[2, 5, 6, 8]
Работает это не только для списков:
In [31]:
1 eval("a == 8")
Out[31]:
False
Внимание: использование функции eval() считается небезопасным в том смысле, что она исполняет любой код, заключенный в строке, не проверяя при этом, является ли код хорошим, правильным. Более корректно было бы использовать функцию literal_eval() , которую вы можете встретить в автоматических тестах в домашних заданиях. Эту функцию нужно импортировать из модуля ast :
In [32]:
1 from ast import literal_eval
In [33]:
1 literal_eval("[1,2,3]")
Out[33]:
[1, 2, 3]
Кроме and и or в Python есть еще полезные операторы: оператор принадлежности in и оператор отрицания not .
Пусть у нас есть списки отличных, хороших, удовлетворительных и плохих оценок.
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/5. Проверка условий. Циклы.ipynb |
9/14 |

01.10.2022, 14:14 |
5. Проверка условий. Циклы - Jupyter Notebook |
In [35]:
1 excel = [8, 9, 10] 2 good = [6, 7]
3 sat = [4, 5]
4 bad = [1, 2, 3]
Проверим, лежит ли оценка 8 в плохих:
In [36]:
1 8 in bad
Out[36]:
False
Применим отрицание:
In [37]:
1 8 not in bad # верно!
Out[37]:
True
Множества
Иногда возникает необходимость проверять разные отношения между двумя наборами элементов. Например, проверить, есть ли у двух списков общие элементы. Для этого можно воспользоваться уже известным оператором in :
In [38]:
1 |
L1 |
= |
[1, |
3, |
4] |
2 |
L2 = [1, 4, 5, 6] |
||||
|
|
|
|
|
|
In [39]:
1 for i in L2:
2if i in L1:
3print(i)
1
4
Но иногда удобно превратить списки в множества (sets) и выполнять операции, которые определены для множеств в математике: пересечение, объединение, разность и так далее.
Важно иметь в виду, что в множествах (как в программировании, так и в математике) не может быть повторяющихся элементов. Поэтому, если в списке есть повторяющиеся значения, и они важны, превращать спискок в множество не стоит, так как можно потерять элементы.
localhost:8888/notebooks/EXONTOOLS/2/Доп. занятия/5. Проверка условий. Циклы.ipynb |
10/14 |