Обучение — Не работает код после ввода else


Содержание

Инструкция if-elif-else, проверка истинности, трехместное выражение if/else

Условная инструкция if-elif-else (её ещё иногда называют оператором ветвления) — основной инструмент выбора в Python. Проще говоря, она выбирает, какое действие следует выполнить, в зависимости от значения переменных в момент проверки условия.

Синтаксис инструкции if

Сначала записывается часть if с условным выражением, далее могут следовать одна или более необязательных частей elif, и, наконец, необязательная часть else. Общая форма записи условной инструкции if выглядит следующим образом:

Простой пример (напечатает ‘true’, так как 1 — истина):

Чуть более сложный пример (его результат будет зависеть от того, что ввёл пользователь):

Конструкция с несколькими elif может также служить отличной заменой конструкции switch — case в других языках программирования.

Проверка истинности в Python

  • Любое число, не равное 0, или непустой объект — истина.
  • Числа, равные 0, пустые объекты и значение None — ложь
  • Операции сравнения применяются к структурам данных рекурсивно
  • Операции сравнения возвращают True или False
  • Логические операторы and и or возвращают истинный или ложный объект-операнд

Истина, если оба значения X и Y истинны.

Истина, если хотя бы одно из значений X или Y истинно.

Истина, если X ложно.

Трехместное выражение if/else

довольно короткая, но, тем не менее, занимает целых 4 строки. Специально для таких случаев и было придумано выражение if/else:

В данной инструкции интерпретатор выполнит выражение Y, если X истинно, в противном случае выполнится выражение Z.

Я учусь программировать на Python: циклы, условия и исключения

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

Предыдущий выпуск

Для начала кое-что поясню. Блог называется «Я учусь программировать», а не «Я учу программировать» — иначе говоря, это не учебник по программированию. Я не эксперт и не обладаю навыками преподавателя, а потому если и могу взять на себя право кого-то учить, то только себя.

У блога есть две цели. Первая — личная: я хочу систематизировать и укрепить знания, которые у меня есть. Как известно, один из лучших способов учиться — рассказывать и объяснять другим людям то, что знаешь. Именно поэтому я с удовольствием буду читать отзывы и указания на ошибки (в прошлый раз, кстати, ценные замечания были в нашем фейсбуке). Вторая цель — пропагандистская. Я искренне считаю, что сейчас научиться программировать может любой человек, и хочу своим примером показать: раз редактор сайта Look At Me может писать код, то его может писать вообще кто угодно.

Примечание: Весь код приводится для Python версии 3.0 и старше, а потому может не работать на более старых версиях.

В прошлый раз мы написали простую программу, которая вычисляет квадрат введённого целого числа. В конце я назвал два недостатка программы. Во-первых, она перестаёт работать сразу после того, как выводит результат. Во-вторых, она никак не защищена от неточностей при вводе: если мы введём не число, а букву, то программа покажет ошибку и закроется. Начнём с первого недостатка. Чтобы устранить его, введём понятие цикла — конструкции, которая позволяет выполнять один и тот же набор операций сколько угодно раз — при желании даже бесконечно.

def square(int):
return int * int
while True:
number = int(input(«Enter an integer: «))
print(«The square of <> is <>.».format(number, square(number)))

По сравнению с кодом из предыдущего выпуска блога я внёс лишь одно изменение: поместил две последние строчки в безусловный цикл while True:. Инструкции, выполняемые циклом, помещаются в блок кода с отступом в четыре пробела (по стандарту PEP 8) — прямо как содержимое функции. Циклы с ключевым словом while работают следующим образом:


Интерпретатор видит ключевое слово while и условие, которое задаётся после него. В нашем случае это условие True типа данных boolean. К типу boolean также относится значение False. Иначе говоря, это логический тип, у которого могут быть только два значения — истина или ложь. Слова while и True образуют нечто вроде идиоматической конструкции, говорящей интерпретатору: выполняй инструкции внутри блока бесконечно — если их только вдруг что-то не прервёт.

Интерпретатор выполняет инструкции внутри блока по порядку, от первой строки до последней.

Интерпретатор видит, что блок кода закончился, и проверяет, выполняется ли условие, указанное после ключевого слова while. Если оно выполняется, то интерпретатор возвращается к первой строке блока (обратите внимание — блока, а не всей программы) и идёт по порядку. Если условие не выполняется, то цикл завершается, и интерпретатор переходит к строке, которая следует сразу за последней строкой блока. В нашем случае условие будет выполняться всегда, вне зависимости от того, что происходит внутри блока. Но в теории мы могли бы задать другое условие, например, сделать так, чтобы конструкция сработала только три раза:

i = 0
while i

Хотя мы исправили первый недостаток, на его месте появился другой. Сейчас наша программа работает бесконечно — из неё невозможно выйти. Но что если задать условие, при котором пользователь, набрав букву q, смог бы выйти из программы? Давайте так и сделаем, а заодно разберём изменения в коде:

def square(int):
return int * int
print(«Input ‘q’ to quit.»)
while True:
number = input(«Enter an integer: «)
if number == ‘q’:
break
else:
number = int(number)
print(«The square of <> is <>.».format(number, square(number)))
print(«Thank you for using the app.»)

Обратите внимание на третью и последнюю строки. Я добавил функции print() для вывода сообщений, которые помогут ориентироваться пользователю в программе. Первое сообщение будет всегда выводиться один раз в самом начале, второе — один раз, когда программа заканчивает работу. Внутри блока, относящегося к циклу while True:, появились операторы ветвления if и else. Они позволяют задавать условия выполнения блоков кода и эквивалентны синтаксической конструкции «если . то . ». Вот как они работают:

После ключевого слова if задаётся условие. Если это условие выполняется, то интерпретатор переходит к коду внутри блока, следующего за двоеточием. В нашем случае условие — это number == ‘q’, а вся строка будет читаться как «если значение переменной number — это ‘q’». Оператор == значит «равно» — не путайте его с оператором =, который обозначает присваивание (условие number = ‘q’ выдаст ошибку — это попытка присвоить переменной number, значение которой только что было введено, значение ‘q’; нам же нужно сравнить введённое значение со значением ‘q’).

Внутри блока используется ключевое слово break, говорящее интерпретатору, что ему нужно прервать текущий цикл и перейти к следующей за блоком строкой программы — в нашем случае это последняя строка программы с функцией print(). Блок if . : находится внутри блока while True:, а потому строка с ключевым словом break записана с отступом в восемь пробелов. Если бы слова break не было, то интерпретатор, миновав блок else:, продолжил бы двигаться дальше по циклу.

Цукерберг рекомендует:  C# . - Проблема с работой в Unity3d метода OnTriggerEnter

Если условие не выполняется, то интерпретатор переходит к следующей за блоком строке, в нашем случае — строке с ключевым словом else. Это слово сообщает интерпретатору, что если условие в if не выполняется, то следует выполнить код внутри блока else:. В этот блок я поместил две операции, которые раньше находились внутри блока while True:.

Таким образом, в программе появляется условие: если введённый нами символ — это q, то работу цикла нужно завершить, если нет, то продолжить, перевести переменную number из типа string в тип int и вывести сообщение с квадратом числа.

Наверняка у многих появится вопрос — а зачем я вынес операцию по переводу переменной number из типа string в тип int на отдельную строку внутри блока else:? Дело в том, что если оставить эту операцию на первой строке цикла, то после ввода символа q программа выдаст ошибку, потому что символ q нельзя перевести в int — то есть сделать целым числом. Иначе говоря, программа выдаст ошибку ещё до того, как успеет проверить условие. Если же мы уберём перенос внутрь блока else, то ввод q позволит выйти из программы. Осталось только сделать так, чтобы ввод других букв не приводил к ошибке.

Чтобы программа не выбрасывала пользователя каждый раз, когда он вводит нецелое число и любую букву, кроме q, мы воспользуемся операторами обработки исключений try и except — и опишем, как они работают:

def square(int):
return int * int
print(«Input ‘q’ to quit.»)
while True:
number = input(«Enter an integer: «)
if number == ‘q’:
break
else:
try:
number = int(number)
print(«The square of <> is <>.».format(number, square(number)))
except ValueError:
print(«Error: incorrect value. Please try again.»)
print(«Thank you for using the app.»)

Конструкция с ключевыми словами try и except стала частью блока else: из цикла while True:, а потому оба слова введены с отступом в восемь пробелов, а строки внутри блоков try: и except ValueError: — в 12 пробелов.

Слово try указывает интерпретатору, что нужно проверить, выполнимы ли инструкции внутри блока, следующего за двоеточием. Если они выполнимы и не выдают ошибок, то нужно их выполнить и вернуться в предыдущий блок кода (в нашем случае блок while True:), если невыполнимы — перейти в блок с ключевым словом except.

Блок слова except указывает, что делать в том случае, если операции из блока try: оказались невыполнимы. В нашем случае мы ожидаем ошибку типа ValueError и указываем её после ключевого слова — хотя можно было и просто написать except:, то есть что делать в случае, если появится ошибка любого типа.

Таким образом программа проверяет, что ввёл пользователь. Если он ввёл нецелое число и любую букву, кроме q, то программа, поняв, что невозможно выполнить первую строку из блока try:, выводит сообщение об ошибке из блока except: и продолжает цикл дальше. Теперь, если вы введёте неверный символ, программа сразу предложит вам попробовать это сделать ещё раз, а не прекратит работу.

Теперь программа делает всё так, как я хотел с самого начала. Её можно расширить — например, чтобы она высчитывала не только квадрат, но и куб введённого числа или работала с десятичными дробями, для чего надо использовать тип данных float. Я этого делать в блоге не буду, но если вдруг есть желание — вперёд.

Возможно, я сегодня переборщил с новым материалом, и это всё будет непросто переварить. Но я намеренно не углублялся в каждую из тем, а лишь затронул их: мы ещё не раз будем встречать эти понятия и наловчимся, как ими пользоваться. Пока я не решил, что будет в следующем выпуске — думаю, либо простенькая текстовая игра, либо задание, которое я дал себе в первом выпуске блога. Главное, что в следующий раз мы укрепим и расширим представления, полученные в этом и предыдущем выпуске.

Пожалуйста, если вам что-то непонятно, пишите комментарии под постом и в социальных сетях — буду рад и любым другим отзывам. Если вы более опытный в программировании человек, чем я, то с удовольствием выслушаю содержательную критику. Спасибо, и до следующего раза!

Полные курсы Python на Codeacademy и Treehouse*

* — платные курсы, но есть пробный период

Развитие программистского мышления на Udacity

Циклы в Python на Learnpython.org и Python Course

Условия в Python на Learnpython.org и Python Course

Исключения в Python на Learnpython.org и Python Course

изображение via Shutterstock

Не работает if else c++


Если сумма 3 действительных чисел x,y,z | улучшить этот вопрос

2 ответа 2

Работает только эта ветка (при исходных данных s = 0,6, что меньше 1):

На проверке if ((x сразу же получаем false, т.к. на самом деле x больше y . На этом выполнение программы завершается.

Если кажется, что if не работает, или работает не так, как надо, то всегда нужно проверять сами условия, потому что if работает всегда. А если «не работает», значит ошибка в условиях.

После ввода моя программа пропускает первый оператор IF и сразу переходит к ELSE

У меня проблема с кодом. Он компилируется без ошибок, но сразу после ввода данных пользователем, даже с правильными значениями, он пропускает первый условный оператор и переходит непосредственно к ELSE, что приводит к завершению программы. Кажется, я не могу найти причину такого поведения.

Я думаю, что это может быть связано со способом построения условного оператора:
if( ((S

Мне нужно проверить, является ли введенное значение 25 и делится на 5, а другое значение 0.2

Решение

Во-первых, если вы хотите 25 25 не S , То же самое с U а также D — они должны быть 0.2 а также 0.35 ,

Во-вторых, вышеприведенный оператор возвращает логическое значение — таким образом, если S является значением от 25 до 75, логическое значение будет приведено к целочисленному значению 1, и 1 % 5 == 0 всегда быть ложным. (Точно так же, если S находится вне этого диапазона, логическое значение будет приведено к целому числу 0 и 0 % 5 == 0 всегда будет правдой)

Правильный, полный оператор if выглядит следующим образом:

Другие решения

Если вы читаете число от 25 до 75 из ввода, if( ((S всегда ложно.

Вы должны использовать if( ((S >= 25 && . ,

Проблема главным образом заключается в ваших условиях цикла. Например, в этой строке из вашего кода:

лабы по информатике, егэ

лабораторные работы и задачи по программированию и информатике, егэ по информатике

Pascal: Занятие №2. Часть 1: Условный оператор в Паскале (If)

Условный оператор в Паскале

До рассмотрения данной темы в основном использовались линейные алгоритмы в Паскале, характерные для весьма простых задач, когда действия (операторы) выполняются последовательно, одно за другим. Более сложные алгоритмы предусматривают использование конструкция ветвления.

Блок-схема условного оператора:

Условный оператор в Паскале имеет следующий синтаксис:

if условие then оператор;

Полный вариант:

if условие then оператор else оператор;

Условный оператор в Паскале — if — служит для организации хода задачи таким образом, при котором изменяется последовательность выполнения операторов в зависимости от какого-либо логического условия. Логическое условие может принимать одно из двух значений: либо true (истина), либо false (ложь), соответственно, оно может быть либо истинным, либо ложным.

Составной оператор

Если при истинном условии необходимо выполнять несколько операторов, то их по правилам языка Pascal необходимо заключать в блок, начинающийся со служебного слова begin и заканчивающегося служебным словом end . Такой блок принято называть операторными скобками, а данную конструкцию — составным оператором:


Операторные скобки и составной оператор в Паскале:

if логическое выражение then begin оператор1; оператор2; end else begin оператор1; оператор2; end;

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

Вариант 1 Вариант 2

Подробно разобраться в работе условного оператора в Паскале можно, просмотрев видеоурок:

Обратите внимание на то, как в данном примере выводится y . При выводе переменных типа real в pascal, можно использовать так называемый форматированный вывод, или запись с двумя двоеточиями:
y:6:2
— цифра после первого двоеточия ( 6 ) указывает на то, сколько знаков будет занимать число при выводе на экран
— цифра после второго двоеточия ( 2 ) указывает на то, сколько знаков после запятой вещественного числа будет выводиться

Таким образом, использование такой записи в pascal практически позволяет выполнить округление до сотых, тысячных и т.п.

Логические операции в Паскале (в логическом выражении)

Когда необходимо использовать двойное условие в Pascal, то понадобятся логические операции.

  • Логическая операция AND (И), поставленная между двумя условиями, говорит о том, что должны выполняться сразу оба эти условия (должны быть истинными). Логический смысл операции — «конъюнкция».
  • Поставленный между двумя условиями, знак OR (ИЛИ) говорит о том, что достаточно, если будет выполняться хотя бы одно из них (одно из двух условий истинно). Логический смысл операции — «дизъюнкция».
  • На языке Паскаль XOR — знак логической операции, имеющий смысл «строгая дизъюнкция» и указывающий на то, что необходимо, чтобы одно из двух условий выполнялось (истинно), а другое — не выполнялось (ложно).
  • Логическая операция NOT перед логическим выражением или переменной имеет смысл «отрицание» или «инверсия» и указывает на то, что если данная переменная или выражение истинны, то их отрицание — ложь и наоборот.

var n:integer; begin n:=6; if (n>5) and (n 7) or (n 7) xor (n 7) then writeln(‘истина’); end.

Цукерберг рекомендует:  Пример 3D помещения выставки
Вариант 1 Вариант 2

var a,b: integer; begin write(‘Введите A: ‘); read(a); b := a mod 2; if b>0 then writeln(‘true’) else writeln (‘false’) end.

Построение блок-схем по коду Паскаль

Теперь настало время вспомнить о том, что такое блок-схемы.
Блок схема — ориентированный граф, указывающий на последовательность операций, приводящую к решению поставленной задачи.

Существуют управляющие структуры трех типов:

следование ветвление повторение или цикл

Две из трех представленных структур блок-схемы мы уже можем перевести в код Pascal.

Переход в оператор else после ввода инструкции if из-за завитушек

Этот пример кода работает правильно, например. вступает первым, если, выпадает после того, как не встречается 2-й, если.

Я изначально закодировал это как это, что не работает. Он входит в первую, если, не соответствует второму, если ожидалось, но затем вводит оператор else и выполняет запись.

Почему второй кодовый блок не работает так же, как первый блок? Поскольку только одна строка кода ниже первого оператора, я считал допустимым, чтобы не было <> .

Для справки фрейм стека:

Это проблема «оборванных else «: else всегда принадлежит ближайшему, если независимо от отступа.


В вашем первом фрагменте используются фигурные скобки, чтобы сообщить компилятору, что else принадлежит к верхнему if , а не к внутреннему. Второй фрагмент позволяет компилятору решить; компилятор применяет ближайшее правило if и присоединяет else к внутреннему if .

Ответ dasblinkenlight правильный. Я бы добавил, что это пример более общего принципа, иногда называемый принципом максимум munch . То есть: когда сталкивается с двусмысленностью, анализатор пытается сделать все возможное, что он может сделать прямо сейчас.

Оператор if имеет две возможные формы:

if ( Булевое выражение ) statement-statement

if ( Boolean-expression ) result-statement else альтернативный оператор

Итак, когда у вас

анализатор выглядит так:

  • Я попытаюсь сделать самое большое выражение, которое я могу.
  • А, там if . Я попытаюсь сделать самый большой if , я могу.
  • Хорошо, там есть условие в круглых скобках.
  • И вот результат утверждения. Опять же, я попытаюсь сделать самое большое выражение, которое я могу .
  • Там if . Опять же, попробуйте сделать максимально возможный оператор if .
  • Там условие в круглых скобках
  • Там говорится о последствиях. Есть ли else ? Да! Мы можем сделать это if больше.
  • Есть альтернативный оператор else , и. мы сделали внутренний if . Продолжайте анализ внешнего if .
  • Есть ли else ? Нет. Мы не можем сделать внешний if больше.

Мораль истории: привыкнуть использовать фигурные скобки.

Прочие варианты использования оператора else

Всем нам хорошо известен способ использования ключевого слова else совместно с if:

Однако в Python’е существует и несколько других, неизвестных большинству программистов, применений else.

for… else

Бьюсь об заклад, что вам неизвестно, что else можно ставить сразу после окончания цикла for! Для чего, спросите вы? Когда элементы перебираемой последовательности будут исчерпаны, управление перейдет коду, находящемуся в блоке else. «А когда эти элементы не будут исчерпаны?» — когда вы выйдете из цикла досрочно по условию break.

Использование else в данном случае может выглядеть неразумным, так как else не совсем верно описывает характер происходящего, однако этот синтаксический сахар может быть полезным тогда, когда у вас в цикле имеется оператор break, и вам необходимо знать, переходило ли к нему управление. Допустим, у нас есть компьютер и список людей, и мы хотим, чтобы каждый из них воспользовался компьютером (до тех пор, пока один из них его не сломает). В конце цикла мы хотим узнать, был ли наш компьютер сломан. Обычно, мы записываем это таким образом:

С использованием for..else мы можем привести этот код к более удобочитаемой форме:

while… else

Семантика здесь абсолютно та же, что и в предыдущем случае. Тело цикла while выполняется до тех пор, пока верно некое условие — это вы и так уже знаете. Если в какой-то момент условие перестало быть верным, выполнение переходит в ветвь else. Оператор break, если условие дойдет до него, прервет выполнение всего цикла while..else, таким образом, ветвь else выполняться не будет. В двух словах: логика поведения while..else точно такая же, как и у for..else.

try… except… else

Есть некоторый код, заключенный в блоке try. Вы хотите перехватывать определенные исключения, и обрабатывать их, но что, если в процессе выполнения никаких исключений выброшено не было? На помощь приходит условие else. Оно будет выполняться лишь в том случае, когда никаких исключения выброшено не было, и перед блоком finally (если он, конечно, существует). Нужно заметить, что исключения, порожденные в блоке else предшествующими конструкциями except, обрабатываться не будут:

Конструкция ветвления в C++ — урок 3

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

К примеру, мы вводим с клавиатуры целое число. Если это число больше десяти, то программа должна выполнить одно действие, иначе — другое. Реализуем этот алгоритм на C++ с помощью конструкции ветвления.

Если вы запустите эту программу, то при вводе числа, меньшего десяти, будет выводиться соответствующее сообщение.

Если введенное число окажется большим, либо равным десяти — отобразится другое сообщение.

Оператор if

Оператор if служит для того, чтобы выполнить какую-либо операцию в том случае, когда условие является верным. Условная конструкция в С++ всегда записывается в круглых скобках после оператора if .

Внутри фигурных скобок указывается тело условия. Если условие выполнится, то начнется выполнение всех команд, которые находятся между фигурными скобками.


Пример конструкции ветвления

Здесь говорится: «Если переменная num меньше 10 — вывести соответствующее сообщение. Иначе, вывести другое сообщение».

Усовершенствуем программу так, чтобы она выводила сообщение, о том, что переменная num равна десяти:

Здесь мы проверяем три условия:

  • Первое — когда введенное число меньше 10-ти
  • Второе — когда число равно 10-ти
  • И третье — когда число больше десяти

Заметьте, что во втором условии, при проверке равенства, мы используем оператор равенства — == , а не оператор присваивания, потому что мы не изменяем значение переменной при проверке, а сравниваем ее текущее значение с числом 10.

  • Если поставить оператор присваивания в условии, то при проверке условия, значение переменной изменится, после чего это условие выполнится.

Каждому оператору if соответствует только один оператор else . Совокупность этих операторов — else if означает, что если не выполнилось предыдущее условие, то проверить данное. Если ни одно из условий не верно, то выполняется тело оператора else .

Если после оператора if , else или их связки else if должна выполняться только одна команда, то фигурные скобки можно не ставить. Предыдущую программу можно записать следующим образом:

Такой метод записи выглядит более компактно. Если при выполнении условия нам требуется выполнить более одной команды, то фигурные скобки необходимы. Например:

Данная программа проверяет значение переменной num. Если она меньше 10, то присваивает переменной k значение единицы. Если переменная num равна десяти, то присваивает переменной k значение двойки. В противном случае — значение тройки. После выполнения ветвления, значение переменной k выводится на экран.

Хорошенько потренируйтесь, попробуйте придумать свой пример с ветвлением. Когда поймете, что поняли эту тему, можете смело приступать к следующему уроку.

Обучение — Не работает код после ввода «else»

25 просмотра

1 ответ

1 Репутация автора

Я пишу код, который принимает любое число от пользователя, он сообщает пользователю, содержит ли ввод 3,6 или 9. В противном случае код должен распечатать тот же самый ввод. Мне удалось правильно получить «если», если пользователь вводит любое число, код скажет, содержит ли оно 3, 6 или 9. Однако, когда я добавляю часть «еще», код больше не работает, и он не скажет, содержал ли вставленный номер 3, 6 или 9.

Этот код может обнаружить любое число:

добавление этих строк в приведенный выше код не заставит его работать правильно

вывод без оператора else: «Есть 3, 6 или 9». (Правильный)

вывод с оператором else: 300 (неверно)

Ответы (1)

плюса

152062 Репутация автора

Перепишите цикл следующим образом

В противном случае, если следующая цифра (например, 0) числа не равна 3, 6 или 9, выполняется оператор else и происходит выход из цикла.

Я учусь программировать на Python: циклы, условия и исключения


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

Предыдущий выпуск

Для начала кое-что поясню. Блог называется «Я учусь программировать», а не «Я учу программировать» — иначе говоря, это не учебник по программированию. Я не эксперт и не обладаю навыками преподавателя, а потому если и могу взять на себя право кого-то учить, то только себя.

У блога есть две цели. Первая — личная: я хочу систематизировать и укрепить знания, которые у меня есть. Как известно, один из лучших способов учиться — рассказывать и объяснять другим людям то, что знаешь. Именно поэтому я с удовольствием буду читать отзывы и указания на ошибки (в прошлый раз, кстати, ценные замечания были в нашем фейсбуке). Вторая цель — пропагандистская. Я искренне считаю, что сейчас научиться программировать может любой человек, и хочу своим примером показать: раз редактор сайта Look At Me может писать код, то его может писать вообще кто угодно.

Цукерберг рекомендует:  Программирование по 15 часов в день

Примечание: Весь код приводится для Python версии 3.0 и старше, а потому может не работать на более старых версиях.

В прошлый раз мы написали простую программу, которая вычисляет квадрат введённого целого числа. В конце я назвал два недостатка программы. Во-первых, она перестаёт работать сразу после того, как выводит результат. Во-вторых, она никак не защищена от неточностей при вводе: если мы введём не число, а букву, то программа покажет ошибку и закроется. Начнём с первого недостатка. Чтобы устранить его, введём понятие цикла — конструкции, которая позволяет выполнять один и тот же набор операций сколько угодно раз — при желании даже бесконечно.

def square(int):
return int * int
while True:
number = int(input(«Enter an integer: «))
print(«The square of <> is <>.».format(number, square(number)))

По сравнению с кодом из предыдущего выпуска блога я внёс лишь одно изменение: поместил две последние строчки в безусловный цикл while True:. Инструкции, выполняемые циклом, помещаются в блок кода с отступом в четыре пробела (по стандарту PEP 8) — прямо как содержимое функции. Циклы с ключевым словом while работают следующим образом:

Интерпретатор видит ключевое слово while и условие, которое задаётся после него. В нашем случае это условие True типа данных boolean. К типу boolean также относится значение False. Иначе говоря, это логический тип, у которого могут быть только два значения — истина или ложь. Слова while и True образуют нечто вроде идиоматической конструкции, говорящей интерпретатору: выполняй инструкции внутри блока бесконечно — если их только вдруг что-то не прервёт.

Интерпретатор выполняет инструкции внутри блока по порядку, от первой строки до последней.

Интерпретатор видит, что блок кода закончился, и проверяет, выполняется ли условие, указанное после ключевого слова while. Если оно выполняется, то интерпретатор возвращается к первой строке блока (обратите внимание — блока, а не всей программы) и идёт по порядку. Если условие не выполняется, то цикл завершается, и интерпретатор переходит к строке, которая следует сразу за последней строкой блока. В нашем случае условие будет выполняться всегда, вне зависимости от того, что происходит внутри блока. Но в теории мы могли бы задать другое условие, например, сделать так, чтобы конструкция сработала только три раза:

i = 0
while i

Хотя мы исправили первый недостаток, на его месте появился другой. Сейчас наша программа работает бесконечно — из неё невозможно выйти. Но что если задать условие, при котором пользователь, набрав букву q, смог бы выйти из программы? Давайте так и сделаем, а заодно разберём изменения в коде:

def square(int):
return int * int
print(«Input ‘q’ to quit.»)
while True:
number = input(«Enter an integer: «)
if number == ‘q’:
break
else:
number = int(number)
print(«The square of <> is <>.».format(number, square(number)))
print(«Thank you for using the app.»)

Обратите внимание на третью и последнюю строки. Я добавил функции print() для вывода сообщений, которые помогут ориентироваться пользователю в программе. Первое сообщение будет всегда выводиться один раз в самом начале, второе — один раз, когда программа заканчивает работу. Внутри блока, относящегося к циклу while True:, появились операторы ветвления if и else. Они позволяют задавать условия выполнения блоков кода и эквивалентны синтаксической конструкции «если . то . ». Вот как они работают:

После ключевого слова if задаётся условие. Если это условие выполняется, то интерпретатор переходит к коду внутри блока, следующего за двоеточием. В нашем случае условие — это number == ‘q’, а вся строка будет читаться как «если значение переменной number — это ‘q’». Оператор == значит «равно» — не путайте его с оператором =, который обозначает присваивание (условие number = ‘q’ выдаст ошибку — это попытка присвоить переменной number, значение которой только что было введено, значение ‘q’; нам же нужно сравнить введённое значение со значением ‘q’).

Внутри блока используется ключевое слово break, говорящее интерпретатору, что ему нужно прервать текущий цикл и перейти к следующей за блоком строкой программы — в нашем случае это последняя строка программы с функцией print(). Блок if . : находится внутри блока while True:, а потому строка с ключевым словом break записана с отступом в восемь пробелов. Если бы слова break не было, то интерпретатор, миновав блок else:, продолжил бы двигаться дальше по циклу.

Если условие не выполняется, то интерпретатор переходит к следующей за блоком строке, в нашем случае — строке с ключевым словом else. Это слово сообщает интерпретатору, что если условие в if не выполняется, то следует выполнить код внутри блока else:. В этот блок я поместил две операции, которые раньше находились внутри блока while True:.

Таким образом, в программе появляется условие: если введённый нами символ — это q, то работу цикла нужно завершить, если нет, то продолжить, перевести переменную number из типа string в тип int и вывести сообщение с квадратом числа.

Наверняка у многих появится вопрос — а зачем я вынес операцию по переводу переменной number из типа string в тип int на отдельную строку внутри блока else:? Дело в том, что если оставить эту операцию на первой строке цикла, то после ввода символа q программа выдаст ошибку, потому что символ q нельзя перевести в int — то есть сделать целым числом. Иначе говоря, программа выдаст ошибку ещё до того, как успеет проверить условие. Если же мы уберём перенос внутрь блока else, то ввод q позволит выйти из программы. Осталось только сделать так, чтобы ввод других букв не приводил к ошибке.

Чтобы программа не выбрасывала пользователя каждый раз, когда он вводит нецелое число и любую букву, кроме q, мы воспользуемся операторами обработки исключений try и except — и опишем, как они работают:

def square(int):
return int * int
print(«Input ‘q’ to quit.»)
while True:
number = input(«Enter an integer: «)
if number == ‘q’:
break
else:
try:
number = int(number)
print(«The square of <> is <>.».format(number, square(number)))
except ValueError:
print(«Error: incorrect value. Please try again.»)
print(«Thank you for using the app.»)

Конструкция с ключевыми словами try и except стала частью блока else: из цикла while True:, а потому оба слова введены с отступом в восемь пробелов, а строки внутри блоков try: и except ValueError: — в 12 пробелов.

Слово try указывает интерпретатору, что нужно проверить, выполнимы ли инструкции внутри блока, следующего за двоеточием. Если они выполнимы и не выдают ошибок, то нужно их выполнить и вернуться в предыдущий блок кода (в нашем случае блок while True:), если невыполнимы — перейти в блок с ключевым словом except.

Блок слова except указывает, что делать в том случае, если операции из блока try: оказались невыполнимы. В нашем случае мы ожидаем ошибку типа ValueError и указываем её после ключевого слова — хотя можно было и просто написать except:, то есть что делать в случае, если появится ошибка любого типа.

Таким образом программа проверяет, что ввёл пользователь. Если он ввёл нецелое число и любую букву, кроме q, то программа, поняв, что невозможно выполнить первую строку из блока try:, выводит сообщение об ошибке из блока except: и продолжает цикл дальше. Теперь, если вы введёте неверный символ, программа сразу предложит вам попробовать это сделать ещё раз, а не прекратит работу.

Теперь программа делает всё так, как я хотел с самого начала. Её можно расширить — например, чтобы она высчитывала не только квадрат, но и куб введённого числа или работала с десятичными дробями, для чего надо использовать тип данных float. Я этого делать в блоге не буду, но если вдруг есть желание — вперёд.

Возможно, я сегодня переборщил с новым материалом, и это всё будет непросто переварить. Но я намеренно не углублялся в каждую из тем, а лишь затронул их: мы ещё не раз будем встречать эти понятия и наловчимся, как ими пользоваться. Пока я не решил, что будет в следующем выпуске — думаю, либо простенькая текстовая игра, либо задание, которое я дал себе в первом выпуске блога. Главное, что в следующий раз мы укрепим и расширим представления, полученные в этом и предыдущем выпуске.

Пожалуйста, если вам что-то непонятно, пишите комментарии под постом и в социальных сетях — буду рад и любым другим отзывам. Если вы более опытный в программировании человек, чем я, то с удовольствием выслушаю содержательную критику. Спасибо, и до следующего раза!

Полные курсы Python на Codeacademy и Treehouse*

* — платные курсы, но есть пробный период

Развитие программистского мышления на Udacity

Циклы в Python на Learnpython.org и Python Course

Условия в Python на Learnpython.org и Python Course

Исключения в Python на Learnpython.org и Python Course

изображение via Shutterstock

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