Добавил:
хачю сдать сессию Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

5_Проверка_условий_Циклы_Jupyter_Notebook

.pdf
Скачиваний:
0
Добавлен:
09.07.2025
Размер:
671.42 Кб
Скачать

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