Глава 8 Структура циклов и булевы выражения.ppt
- Количество слайдов: 96
Программирование на Python’е: введение в информатику Глава 8 Структура циклов и булевы выражения Python Programming, 2/e 1
Задачи n n Понять концепции определённых и неопределённых циклов как они реализуются в Python’е, операторы for и while. Понять программные образцы интерактивных циклов и циклов с ограничением и их реализацию с помощью оператора Python’а while. Python Programming, 2/e 2
Задачи n n Понять программные образцы файловых циклов и способы реализации таких циклов на языке Python. Уметь проектировать и реализовывать решения задач с циклами и вложенными циклами. Python Programming, 2/e 3
Задачи n Понимать основные идеи булевой алгебры, уметь анализировать и писать булевы выражения, включающие булевы операторы. Python Programming, 2/e 4
Циклы for: краткий обзор n n n Оператор цикла for позволяет повторять блок команд для каждого значения из последовательности значений. for <счетчик> in <последов>: <тело цикла> Счетчик цикла переменная <счетчик> принимает каждое из значений последовательности, тело цикла выполняются для каждого значения. Python Programming, 2/e 5
Циклы for: краткий обзор n n n Предположим, что мы хотим написать программу, которая вычисляет среднее последовательности чисел, введённых пользователем. Чтобы программа была общей, она должна работать с произвольным множеством чисел. Нам не нужно запоминать каждое введённое число, нужно знать текущую сумму и количество введённых чисел. Python Programming, 2/e 6
Циклы for: краткий обзор n Мы сталкивались с такими вещами раньше: n n ряд чисел можно обработать в некоторой разновидности цикла, если у нас n чисел, то цикл нужно выполнять n раз; нам нужна текущая сумма, для её создания используем переменную-накопитель. Python Programming, 2/e 7
Циклы for: краткий обзор n n n Введите количество чисел, n Присвойте переменной sum число 0 Выполните n раз n n n введите число, x прибавьте x к sum Выведите переменную average равную sum/n Python Programming, 2/e 8
Циклы for: краткий обзор # average 1. py # Программа усредняет множество чисел # Иллюстрирует цикл со счетчиком и накопитель def main(): n = eval(input("Сколько у нас чисел? ")) sum = 0. 0 for i in range(n): x = eval(input("Введите число >> ")) sum = sum + x print("n. Среднее множества чисел равно", sum/n) n Заметьте, что переменная sum инициализируется числом с плавающей точкой, поэтому число sum/n тоже с плавающей точкой Python Programming, 2/e 9
Циклы for: краткий обзор Сколько Введите Введите у нас число число чисел? 5 >> 32 >> 45 >> 34 >> 76 >> 45 Среднее множества чисел равно 46. 4 Python Programming, 2/e 10
Неопределённые циклы n n n Последняя программа выполнила работу. Но в ней предполагается, что вы заранее знаете сколько чисел нужно обработать. Мы хотим поручить компьютеру сколько чисел в нашем множестве. Цикл for определённый цикл, это означает, что когда начинается цикл (максимальное) число итераций в цикле уже известно. Python Programming, 2/e 11
Неопределённые циклы n n n Мы не можем использовать определённый цикл, если не знаем заранее число итераций. Но мы не знаем, сколько итераций будет нужно пока не введены все числа. Нам нужно другое средство. Неопределённый или условный цикл выполняется до тех пор пока выполняется определённое условие. Python Programming, 2/e 12
Неопределённые циклы n n n while <условие>: <тело цикла> условие это булево выражение, такое же как в операторе if. Блок операторов <тело цикла> это последовательность из одного или более операторов. Тело цикла выполняется повторно до тех пор пока условие цикла истинно. Когда условие становится ложным, цикл завершается. Python Programming, 2/e 13
Неопределённые циклы n Если условие проверяется в начале итерации, то цикл с предусловием. Если условие ложно, то цикл не выполняется ни разу. Python Programming, 2/e 14
Неопределённые циклы n Пример цикла while, который считает от 0 до 10: i = 0 while i <= 10: print(i) i = i + 1 n Этот код даёт тот же результат, что и цикл for: for i in range(11): print(i) Python Programming, 2/e 15
Неопределённые циклы n n Цикл while требует, чтобы мы управляли содержанием счетчика i, инициализируя его в 0 до цикла и увеличивая на 1 в теле цикла. В цикле for работа со счетчиком происходит автоматически. Python Programming, 2/e 16
Неопределённые циклы n n n Оператор while простой, но мощный и опасный – он часто становится источником ошибок в программах. i = 0 while i <= 10: print(i) Что кодирует этот код? Python Programming, 2/e 17
Неопределённые циклы n n Когда Python доходит до этого цикла переменная i равна 0, что меньше 10, поэтому тело цикла выполняется, печатая 0. Управление передаётся на проверку условия. Так как i в цикле не изменяется и поэтому всегда 0, то цикл повторяется безостановочно. Это пример бесконечного цикла. Python Programming, 2/e 18
Неопределённые циклы n Что следует делать, если вы угодили в бесконечный цикл? n n n Во-первых, попытайтесь нажать комбинацию клавиш Control-C Если не сработало, то попробуйте комбинацию Control-Alt-Delete Если результата всё равно нет, то нажмите кнопку Reset. Python Programming, 2/e 19
Интерактивные циклы n n Одним из важных применений неопределённых циклов являются интерактивные циклы. Интерактивные циклы позволяют пользователю повторять отдельные части программ. Вспомните как нам нужен был способ, с помощью которого компьютер бы отслеживал сколько чисел было введено. Давайте воспользуемся другим накопителем, называемым count. Python Programming, 2/e 20
Интерактивные циклы n n В каждой итерации цикла будем спрашивать пользователя будут ли еще данные. Нам нужно установить переменную цикла в “да”, чтобы цикл прошел в первый раз. установите moredata в “да” while moredata равно “да” получи следующую порцию данных обработай порцию данных спроси пользователя будут ли еще данные Python Programming, 2/e 21
Интерактивные циклы n n Совмещение интерактивного цикла с накопителем для sum и count: инициализируем sum в 0. 0 инициализируем count в 0 устанавливаем moredata в “да” while moredata равно “да” вводим число, x добавляем x к sum добавляем 1 to count спрашиваем есть ли еще данные (moredata==“да”? ) output sum/count Python Programming, 2/e 22
Интерактивные циклы # average 2. py # Программа усредняет множество чисел # Иллюстрирует интерактивный цикл с двумя накопителями def main(): moredata = "да" sum = 0. 0 count = 0 while moredata[0] == 'д': x = eval(input("Введите число >> ")) sum = sum + x count = count + 1 moredata = input("Есть ли еще данные (да или нет)? ") print("n. Среднее чисел равно", sum/count) n Использование индексирования (moredata[0]) позволяет принимать “д”, “да-с” для продолжения цикла Python Programming, 2/e 23
Интерактивные циклы Введите Есть ли Введите Есть ли число >> 32 еще данные (да число >> 45 еще данные (да число >> 34 еще данные (да число >> 76 еще данные (да число >> 45 еще данные (да или нет)? дап или нет)? д или нет)? нэт Среднее чисел равно 46. 4 Python Programming, 2/e 24
Циклы с ограничителями n n n Цикл с ограничением продолжает обрабатывать данные пока не дойдёт до специального значения, которое обозначает окончание цикла. Это специальное значение называется ограничителем. Ограничитель должен быть отличим от данных, потому что он не должен обрабатываться как данные. Python Programming, 2/e 25
Циклы с ограничителями n Получаем первую порцию данных пока среди данных нет ограничителя обрабатываем данные получаем следующую порцию данных n n n Первую порцию данных получаем до начала работы цикла. Иногда говорят о предварительном чтении, потому что оно запускает процесс. Если первая порция ограничитель, то цикл заканчивается и данные не обрабатываются. В противном случае данные обрабатываются и считается следующая порция Python Programming, 2/e 26
Циклы с ограничителями n n В нашем усредняющем примере предположим, что мы усредняем оценки за тест. Мы можем считать, что оценок меньше 0 нет, поэтому отрицательное число будет ограничителем. Python Programming, 2/e 27
Циклы с ограничителями # average 3. py # Программа усредняет множество чисел # Иллюстрирует цикл с ограничителем, ограничитель число <0 def main(): sum = 0. 0 count = 0 x = eval(input("Введите число(отрицательное для выхода) >> ")) while x >= 0: sum = sum + x count = count + 1 x = eval(input("Введите число(отрицательное для выхода) >> ")) print("n. Усреднение чисел равно", sum/count) Python Programming, 2/e 28
Циклы с ограничителями Введите Введите число(отрицательное число(отрицательное для для для выхода) выхода) >> >> >> 32 45 34 76 45 -1 Усреднение чисел равно 46. 4 Python Programming, 2/e 29
Циклы с ограничителями n n n Эта версия предоставляет лёгкость использования интерактивного цикла без необходимости печатать всё время ‘д’. И в этой программе есть недостаток – программа не может усреднять множества чисел, содержащие положительные и отрицательные числа. Если мы хотим усреднять и отрицательные числа, то ограничитель больше не может быть числом. Python Programming, 2/e 30
Циклы с ограничителями n n n Мы вводим данные как цепочки символов. Правильный ввод преобразуется в численную форму. В качестве ограничителя можно было бы использовать символьный ограничитель. Можно использовать пустую цепочку (“”). Python Programming, 2/e 31
Циклы с ограничителями инициализируем sum в 0. 0 инициализируем count в 0 Вводим данные как цепочку, x. Str пока x. Str не пустая преобразуем x. Str в число, x прибавляем x к sum прибавляем 1 к count вводим следующую порцию данных, x. Str Выводим значение sum/count Python Programming, 2/e 32
Циклы с ограничителями # average 4. py # Программа усредняет множество чисел # Иллюстрирует цикл с ограничителем, используя в качестве # ограничителя пустую цепочку def main(): sum = 0. 0 count = 0 x. Str = input("Введите число (
Циклы с ограничителями Введите Введите число число (
Файловые циклы n n n Самым большим недостатком нашей программы к настоящему моменту является то, что она интерактивная. Что если вы ошибётесь при наборе 43 -го числа из 50? Лучшее решение для больших объёмов данных читать данные из файлов. Python Programming, 2/e 35
Файловые циклы # average 5. py # Вычисляет среднее чисел, хранящихся в файле. def main(): file. Name = input("Введите имя файла, в котором хранятся числа ") infile = open(file. Name, 'r') sum = 0. 0 count = 0 for line in infile. readlines(): sum = sum + eval(line) count = count + 1 print("n. Среднее чисел равно", sum/count) Python Programming, 2/e 36
Файловые циклы n n n Во многих языках нет механизма для организации такого цикла с файлом. В них для этих целей используется ограничитель. Мы могли бы использовать оператор readline в цикле, чтобы перейти к следующей строке файла. В конце файла оператор readline возвращает пустую строку “”. Python Programming, 2/e 37
Файловые циклы n n n line = infile. readline() while line != "" # обработай строку line = infile. readline() Правильно ли этот код обработает случай пустой строки в файле? Правильно, потому что пустая строка в действительности заканчивается символом новой строки и readline возвратит этот символ, “n” != “” Python Programming, 2/e 38
Файловые циклы # average 6. py # Вычисляет среднее чисел, записанных в файл. def main(): file. Name = input("Введите имя файла, в котором хранятся числа ") infile = open(file. Name, 'r') sum = 0. 0 count = 0 line = infile. readline() while line != "": sum = sum + eval(line) count = count + 1 line = infile. readline() print("n. Среднее чисел равно ", sum / count) Python Programming, 2/e 39
Вложенные циклы n n В предыдущей главе мы видели как вкладываюся друг в друга операторы if. Мы можем так же вкладывать и циклы. Предположим, что мы поменяли наши условия и разрешаем теперь сколько угодно чисел в строке файла (разделённые запятыми), а не одно число в строке. Python Programming, 2/e 40
Вложенные циклы n На верхнем уровне мы будем использовать цикл, обрабатывающий файл, который вычисляет текущие значения sum и count. sum = 0. 0 count = 0 line = infile. readline() while line != "": #актуализируем sum и count для значений строки line = infile. readline() print("n. Среднее чисел равно", sum/count) Python Programming, 2/e 41
Вложенные циклы n n На следующем уровне нам нужно актуализировать sum и count в теле цикла. Так каждая строка файла содержит одно или более чисел, разделённых запятыми, то мы можем разбить цепочки на подцепочки, содержащие по одному числу. Затем мы в цикле по подцепочкам преобразовываем каждую подцепочку в число, и добавляем его к sum. Нам нужно также актуализировать count. Python Programming, 2/e 42
Вложенные циклы n n for x. Str in line. split(", "): sum = sum + eval(x. Str) count = count + 1 Заметьте, что этот цикл for использует переменную line, которая также является управляющей переменной внешнего цикла. Python Programming, 2/e 43
Вложенные циклы # average 7. py # Вычисляет среднее чисел, перечисленных в файле. # Работает с несколькими числами в строкеe. import string def main(): file. Name = input("Введите имя файла, в котором хранятся числа ") infile = open(file. Name, 'r') sum = 0. 0 count = 0 line = infile. readline() while line != "": for x. Str in line. split(", "): sum = sum + eval(x. Str) count = count + 1 line = infile. readline() print("n. Среднее чисел равно", sum/count) Python Programming, 2/e 44
Вложенные циклы n n Цикл, обрабатывающий числа строки, оформлен с помощью отступов во внешнем цикле. Внешний цикл while повторяется раз для каждой строки файла. Для каждой итерации внешнего цикла во внутреннем цикле выполняется столько итераций, сколько чисел в строке. Когда внутренний цикл заканчивается, прочитывается следующая строка файла и повторяется внутренний цикл. Python Programming, 2/e 45
Вложенные циклы n Проектирование вложенных циклов: n n n проектируй внешний цикл, не думая о внутреннем; проектируй внутренний цикл, не думая о внешнем; Соедини внешнюю и внутреннюю части вместе, сохраняя вложенность. Python Programming, 2/e 46
Вычисление булевых выражений n n n В операторах if и while используются булевы выражения. Булевы выражения принимают два значения True или False. До сих пор мы использовали булевы выражения для сравнения чисел, например, (while x >= 0) Python Programming, 2/e 47
Булевы операторы n n Иногда наши простые выражения не кажутся достаточно выразительными. Предположим, что нам нужно убедиться, что две точки находятся в одном положении – их x-координаты и y-координаты равны. Python Programming, 2/e 48
Булевы операторы n n n if p 1. get. X() == p 2. get. X(): if p 1. get. Y() == p 2. get. Y(): # точки одинаковы else: # точки разные Ясно, что это неуклюжий способ вычислять булевы выражения. Давайте рассмотрим три булевых оператора and, or, и not. Python Programming, 2/e 49
Булевы операторы n n n Булевы операторы and и or используются для соединения двух булевых выражений и создания булева результата. <выр> and <выр> or <выр> Python Programming, 2/e 50
Булевы операторы n n Оператор and от двух выражений =И тогда и только тогда, когда оба выражения истинны. Мы можем изобразить это с помощью таблицы истинности. P Q P and Q И И Л Л И Л И Л Л Л Python Programming, 2/e 51
Булевы выражения n n n В таблице истинности P и Q представляют меньшие булевы выражения. Так каждое выражение имеет только два значения, существует 4 возможных комбинации значений. В последнем столбце приведены значения (P and Q). Python Programming, 2/e 52
Булевы выражения n Оператор or от двух выражений =И, когда хотя бы одно из выражений истинно. P Q P or Q И И Л Л Л Python Programming, 2/e 53
Булевы выражения n n Оператор or =Л тогда и только тогда, когда оба выражения ложны. Особо отметим, что or истинно, когда оба выражения истинны. Это не соответствует тому как мы обычно используем “or” в повседневном языке. Python Programming, 2/e 54
Булевы операторы n n Оператор not выдаёт противоположное булевому выражению. Оператор not это унитарный оператор, то есть он действует не на паре, а на одном выражении. P not P И Л Л И Python Programming, 2/e 55
Булевы операторы n n Мы можем использовать эти операторы вместе, чтобы создавать булевы выражения произвольной сложности. Интерпретация выражений основывается на правилах старшинства операторов. Python Programming, 2/e 56
Булевы операторы n n n Рассмотрим выражение a or not b and c Как следует вычислять это выражение? Правила старшинства от высшего к низшему: not, and, or. Этот оператор эквивалентен следующему (a or ((not b) and c)) Так как большинство людей не запоминает правила старшинства для булевых выражений, то используйте скобки, чтобы избежать путаницу. Python Programming, 2/e 57
Булевы операторы n n n Чтобы протестировать совпадение двух точек, мы можем использовать оператор and. if p 1. get. X() == p 2. get. X() and p 2. get. Y() == p 1. get. Y(): # точки одинаковы else: # точки различны Всё условие истинно, только если оба простых условия истинны. Python Programming, 2/e 58
Булевы операторы n n Предположим вы пишете моделирование игры в рэкетбол. Игра заканчивается, когда игрок набирает 15 очков. Как представить это с помощью булева выражения? score. A == 15 or score. B == 15 Когда любое из условий истинно, то и всё условие истинно. Если ни одно из условий не истинно, то всё условие ложно. Python Programming, 2/e 59
Булевы операторы n n n Мы хотим построить цикл, который продолжается до тех пор пока игра не заканчивается. Вы можете сделать это взяв отрицание условия окончания игры в качестве условия цикла. while not(score. A == 15 or score. B == 15): #продолжаем играть Python Programming, 2/e 60
Булевы операторы n n В рэкетболе существует условие окончания игр всухую, если один из игроков набирает 7 очков, а другой при этом не набрал ни одного, то игра заканчивается. while not(score. A == 15 or score. B == 15 or (score. A == 7 and score. B == 0) or (score. B == 7 and score. A == 0): #продолжаем играть Python Programming, 2/e 61
Булевы операторы n n n Давайте посмотрим на счет в волейболе. Чтобы выиграть волейбольная команда должна опередить противника минимум на два очка. В волейболе команда выигрывает, когда набирает 25 очков. Если счет 25 : 24, игра продолжается, как и при 31 : 30. (a >= 25 and a - b >= 2) or (b >= 25 and b - a >= 2) (a >= 25 or b >= 25) and abs(a - b) >= 2 Python Programming, 2/e 62
Булева алгебра n n Способность формулировать манипулировать и мотивировать с помощью булевых выражений это важное искусство. Булевы выражения подчиняются определённым алгебраическим законам, которые называются булевой логикой или булевой алгеброй. Python Programming, 2/e 63
Булева алгебра Алгебра a*0=0 n a and true == a a+0=a n a and false == false a*1=a n Булева алгебра a or false == a and похож на умножение or похож на сложение 0 and 1 соответствуют лжи и истине (false и true), соответственно. Python Programming, 2/e 64
Булева алгебра n Что-либо подставленное в or с true = true: a or true == true n Операторы and и or дистрибутивны: a or (b and c) == (a or b) and (a or c) a and (b or c) == (a and b) or (a and c) n Двойное отрицание сокращается: not(not a) == a n Законы де Моргана: not(a or b) == (not a) and (not b) not(a and b) == (not a) or (not b) Python Programming, 2/e 65
Булева алгебра n n Мы можем использовать эти правила, чтобы упростить булевы выражения. while not(score. A == 15 or score. B == 15): #продолжаем играть Это как сказать “Пока игрок A не набрал 15 очков или игрок B не набрал 15 очков продолжаем играть. ” Применяя законы де Моргана: while (not score. A == 15) and (not score. B == 15): #продолжаем играть Python Programming, 2/e 66
Булева алгебра n Это становится: while score. A != 15 and score. B != 15 # продолжаем играть n Не проще ли понять так: “Пока игрок A не набрал 15 очков и игрок B не набрал 15 очков, продолжаем играть. ” Python Programming, 2/e 67
Булева алгебра n n Иногда легче определить когда цикл должен остановиться, чем когда он должен продолжать работу. В этом случае напишите условие остановки цикла и поставьте not перед условием. После нескольких применений законов де Моргана получим более простое, но эквивалентное условие. Python Programming, 2/e 68
Другие стандартные структуры n n Операторы if и while можно использовать, чтобы выразить любой постигаемый человеком алгоритм. Для некоторых проблем могут быть удобны альтернативные структуры. Python Programming, 2/e 69
Циклы с постусловием n n Допустим, что мы хотим написать программу, которая получает неотрицательное число от пользователя. Если пользователь вводит неправильное число, то программа просит другое значение. Этот процесс повторяется до тех пор пока не будет введено правильное число. Этот процесс называется проверкой вводимых значений. Python Programming, 2/e 70
Циклы с постусловием n повторяй получаем число от пользователя пока число не станет >= 0 Python Programming, 2/e 71
Циклы с постусловием n n n Когда проверка условия продолжения цикла производится после тела цикла, то цикл называется циклом с постусловием. В цикле с постусловием тело цикла выполняется по крайней мере один раз. У Python’а нет встроенного оператора, чтобы это делать, но мы можем это сделать с помощью немного изменённого оператора цикла while. Python Programming, 2/e 72
Циклы с постусловием n n n Мы задаём условие цикла, поэтому мы можем гарантировать выполнение цикла один раз. number = -1 while number < 0: number = eval(input("Введите положительное число : ")) Полагая number равным – 1, мы заставляем выполнить тело цикла по крайней мере один раз. Python Programming, 2/e 73
Циклы с постусловием n n n Некоторые программисты предпочитают имитировать цикл с постусловием с помощью оператора break. Выполнение оператора break заставляет Python немедленно выйти из окружающего оператор break цикла. Оператор break иногда применяется для выхода из бесконечного цикла. Python Programming, 2/e 74
Циклы с постусловием n Тот же алгоритм, реализованный с оператором break: while True: number = eval(input("Введите положительное число : ")) if x >= 0: break # Выход из цикла, если число правильное n Цикл while продолжается до тех пор пока условие цикла истинно. Так как True всегда истинно, то такой цикл кажется бесконечным. Python Programming, 2/e 75
Циклы с постусловием n n n Когда значение x неотрицательно, выполнение оператора break прекращает выполнение цикла. Если тело оператора if помещается в строку, то строку можно написать после знака «: » . Было бы хорошо, чтобы программа выдавала предупреждение, если ввод неправильный. Python Programming, 2/e 76
Циклы с постусловием n В версии с циклом while это выглядит неуклюже: number = -1 while number < 0: number = eval(input("Введите положительное число: ")) if number < 0: print("Введённое число не положительно") n Потому что мы проверяем правильность в двух местах Python Programming, 2/e 77
Циклы с постусловием n Добавление предупреждения в версию с оператором break всего лишь добавит оператор else: while True: number = eval(input("Введите положительное число: ")) if x >= 0: break # Выход из цикла, если число правильное else: print("Введённое число не положительно. ") Python Programming, 2/e 78
Цикл с половинкой n Стилистически программисты предпочитают следующий подход: while True: number = eval(input("Eвведите положительное число: ")) if x >= 0: break # Выход из цикла print("Введённое число не положительно") n Здесь мы выходим из цикла в середине тела цикла. Это и имеется в виду, когда говорят о цикле с половинкой. Python Programming, 2/e 79
Цикл с половинкой n n n Цикл с половинкой это элегантный способ обойти первое чтение в цикле с ограничением. while True: получаем следующую порцию данных если есть ограничитель: break обрабатываем данные Этот способ развивает идею цикла с ограничением, ограничитель не обрабатывается. Python Programming, 2/e 80
Цикл с половинкой Python Programming, 2/e 81
Цикл с половинкой n n n Использовать или не использовать оператор break. Вот в чем вопрос! Использование оператора break большей частью вопрос стиля и вкуса. Избегайте часто использовать оператор break в цикле, потому что трудно понять логику цикла, если в нём содержатся многочисленные выходы. Python Programming, 2/e 82
Булевы выражения как альтернативы n n n Булевы выражения можно сами использовать как управляющие структуры. Предположим вы пишете программу, которая идёт до тех пор пока вы отвечаете на вопросы словами, начинающимися с ‘д’ (как ранее в интерактивном цикле). Один из способов сделать это: while response[0] == "д" or response[0] == "Д": Python Programming, 2/e 83
Булевы выражения как альтернативы n Будьте внимательны! Нельзя сократить свою работу: while response[0] == "д" or "Д": n n n Почему это не работает? Python’овский тип bool использует 1 и 0 чтобы представлять True и False, соответственно. Условный оператор Python’а == всегда выдаёт значение типа bool. Python Programming, 2/e 84
Булевы выражения как альтернативы n Тем не менее, Python позволит вычислить любой встроенный тип как булев. Для чисел (типы int, float, и long int), ноль, рассматриваемый в качестве высказывания равен False, все прочие значения, рассматриваемые в качестве логических высказываний приравниваются True. Python Programming, 2/e 85
Булевы выражения как альтернативы >>> bool(0) False >>> bool(1) True >>> bool(32) True >>> bool("Привет") True >>> bool("") False >>> bool([1, 2, 3]) True >>> bool([]) False Python Programming, 2/e 86
Булевы выражения как альтернативы n n Пустая последовательность символов интерпретируется как False, а все непустые последовательности по определению равны True. Булевы операторы имеют рабочие определения, которые могут быть полезны и для других целей. Python Programming, 2/e 87
Булевы выражения как альтернативы Оператор Рабочее определение x and y Если x = false, то возвращает x. Иначе возвращает y. x or y Если x = true, то возвращает x. Иначе возвращает y. not x Если x = false, то возвращает True. Иначе возвращает False. Python Programming, 2/e 88
Булевы выражения как альтернативы n n n Рассмотрим x and y. Чтобы выражение было истинно, и x и y должны быть истинны. Как только определяем, что одно из них ложно, мы знаем, что само выражение ложно и нам не нужно заканчивать вычисления. Поэтому, если x ложно, то Python должен возвратить ложь, а именно x. Python Programming, 2/e 89
Булевы выражения как альтернативы n n Если x истинно, то значение всего выражения зависит только от y. Возвращаем y. Если y истинно, то возвращаем истину. Если y ложно, то возвращаем ложь. Python Programming, 2/e 90
Булевы выражения как альтернативы n n Другими словами Python’овские булевы это операторы короткого замыкания, результат возвращается как только он становится известным. В операторе and, в котором первое выражение ложно, или в операторе or, в котором первое выражение истинно, Python не вычисляет второе выражение. Python Programming, 2/e 91
Булевы выражения как альтернативы n n n response[0] == "д" or "Д" Булев оператор соединяет две операции. Ниже приведено эквивалентное выражение: (response[0] == "д") or ("Д") n Согласно рабочему определению оператора or, это выражение возвращает True, если response[0]=“y”, или “Y”, второе выражение всегда истинно. Python Programming, 2/e 92
Булевы выражения как альтернативы n n Иногда мы пишем программы, которые запрашивают данные, но предлагают значение по умолчанию, которое можно ввести нажатием клавиши
Булевы выражения как альтернативы n n ans = input("Какой аромат вы предпочитаете [ванили]: ") if ans: flavor = ans else: flavor = "ванили" Если пользователь просто нажмёт клавишу
Булевы выражения как альтернативы n n Код можно сделать более кратким! ans = input("Какой аромат вы хотите [ванили]: ") flavor = ans or "ванили" Запомните, любой непустой ответ интерпретируется как истина (True). Это упражнение можно свести к одной строке! flavor = input("Какой аромат вы хотите [ванили]: ” ) or "ванили" Python Programming, 2/e 95
Булевы выражения как альтернативы n Еще раз, если вы понимаете этот метод, то со спокойной душой применяйте его. Убедитесь только в том, что если ваш код достаточно замысловат, то он хорошо документирован. Python Programming, 2/e 96


