Изучаем Python Эрик Метиз. Crash course2 n d e d i t i o na h a n d s o n, p r o j e c t b a s e d i n t r o d u c t i o n t o p r o g r a m m i n g
Скачать 6.19 Mb.
|
greeter.py prompt = "If you tell us who you are, we can personalize the messages you see." prompt += "\nWhat is your first name? " name = input(prompt) print(f"\nHello, {name}!") 130 Глава 7 • Ввод данных и циклы while В этом примере продемонстрирован один из способов построения длинных строк. Первая часть длинного сообщения сохраняется в переменной prompt . Затем опера- тор += объединяет текст, хранящийся в prompt , с новым фрагментом текста. Теперь содержимое prompt занимает две строки (вопросительный знак снова от- деляется от ввода пробелом для наглядности): If you tell us who you are, we can personalize the messages you see. What is your first name? Eric Hello, Eric! Использование int() для получения числового ввода При использовании функции input() Python интерпретирует все данные, введен- ные пользователем, как строку. В следующем сеансе интерпретатора программа запрашивает у пользователя возраст: >>> age = input("How old are you? ") How old are you? 21 >>> age '21' Пользователь вводит число 21, но когда мы запрашиваем у Python значение age , выводится '21' — представление введенного числа в строковом формате. Кавычки, в которые заключены данные, указывают на то, что Python интерпретирует ввод как строку. Но попытка использовать данные как число приведет к ошибке: >>> age = input("How old are you? ") How old are you? 21 ❶ >>> age >= 18 Traceback (most recent call last): File " ❷ TypeError: unorderable types: str() >= int() Когда вы пытаетесь сравнить введенные данные с числом в точке , Python выдает ошибку, потому что не может сравнить строку с числом: строка '21' , хранящаяся в age , не сравнивается с числовым значением 18; происходит ошибка . Проблему можно решить при помощи функции int() , интерпретирующей строку как числовое значение. Функция int() преобразует строковое представление числа в само число: >>> age = input("How old are you? ") How old are you? 21 ❶ >>> age = int(age) >>> age >= 18 True В этом примере введенный текст 21 интерпретируется как строка, но затем он преобразуется в числовое представление вызовом int() в точке . Теперь Python Как работает функция input() 131 может проверить условие: сравнить переменную age (которая теперь содержит чис- ловое значение 21) с 18. Условие «значение age больше или равно 18» выполняется, и результат проверки равен True Как использовать функцию int() в реальной программе? Допустим, программа проверяет рост пользователя и определяет, достаточен ли он для катания на ат- тракционе: rollercoaster.py height = input("How tall are you, in inches? ") height = int(height) if height >= 48: print("\nYou're tall enough to ride!") else: print("\nYou'll be able to ride when you're a little older.") Программа может сравнить height с 48 , потому что строка height = int(height) преобразует входное значение в число перед проведением сравнения. Если введен- ное число больше или равно 36, программа сообщает пользователю, что он прошел проверку: How tall are you, in inches? 71 You're tall enough to ride! Если пользователь вводит числовые данные, которые используются в вашей про- грамме для вычислений и сравнений, обязательно преобразуйте введенное значение в его числовой эквивалент. Оператор вычисления остатка При работе с числовыми данными может пригодиться оператор вычисления остат- ка ( % ), который делит одно число на другое и возвращает остаток: >>> 4 % 3 1 >>> 5 % 3 2 >>> 6 % 3 0 >>> 7 % 3 1 Оператор % не сообщает частное от целочисленного деления; он возвращает только остаток. Когда одно число нацело делится на другое, остаток равен 0, и оператор % возвра- щает 0. Например, этот факт может использоваться для проверки четности или нечетности числа: 132 Глава 7 • Ввод данных и циклы while even_or_odd.py number = input("Enter a number, and I'll tell you if it's even or odd: ") number = int(number) if number % 2 == 0: print(f"\nThe number {number} is even.") else: print(f"\nThe number {number} is odd.") Четные числа всегда делятся на 2. Следовательно, если остаток от деления на 2 равен 0 ( number % 2 == 0 ), число четное, а если нет — нечетное. Enter a number, and I'll tell you if it's even or odd: 42 The number 42 is even. УПРАЖНЕНИЯ 7.1. Прокат машин: напишите программу, которая спрашивает у пользователя, какую ма- шину он бы хотел взять напрокат. Выведите сообщение с введенными данными (например, «Let me see if I can find you a Subaru”). 7.2. Заказ стола: напишите программу, которая спрашивает у пользователя, на сколько мест он хочет забронировать стол в ресторане. Если введенное число больше 8, выведите сообщение о том, что пользователю придется подождать. В противном случае сообщите, что стол готов. 7.3. Числа, кратные 10: запросите у пользователя число и сообщите, кратно оно 10 или нет. Циклы while Цикл for получает коллекцию элементов и выполняет блок кода по одному разу для каждого элемента в коллекции. В отличие от него, цикл while продолжает вы- полняться, пока остается истинным некоторое условие. Цикл while в действии Цикл while может использоваться для перебора числовой последовательности. Например, следующий цикл считает от 1 до 5: counting.py current_number = 1 while current_number <= 5: print(current_number) current_number += 1 В первой строке отсчет начинается с 1, для чего current_number присваивается зна- чение 1. Далее запускается цикл while , который продолжает работать, пока значе- ние current_number остается меньшим или равным 5. Код в цикле выводит значение current_number и увеличивает его на 1 командой current_number += 1 . (Оператор += является сокращенной формой записи для current_number = current_number + 1 .) Циклы while 133 Цикл повторяется, пока условие current_number <= 5 остается истинным. Так как 1 меньше 5, Python выводит 1, а затем увеличивает значение на 1, отчего current_ number становится равным 2. Так как 2 меньше 5, Python выводит 2 и снова при- бавляет 1, и т. д. Как только значение current_number превысит 5, цикл останавли- вается, а программа завершается: 1 2 3 4 5 Очень многие повседневные программы содержат циклы while . Например, пред- ставьте компьютерную игру: цикл while выполняется, пока игра продолжается, и завершается, как только игрок захочет остановить игру. Вряд ли кого-нибудь обрадует, если программа завершает работу преждевременно или продолжа- ет работать, когда ей приказали остановиться, так что циклы while весьма по- лезны. Пользователь решает прервать работу программы Программа parrot .py может выполняться, пока пользователь не захочет остановить ее, — для этого большая часть кода заключается в цикл while . В программе опре- деляется признак завершения, и программа работает, пока пользователь не введет нужное значение: parrot.py ❶ prompt = "\nTell me something, and I will repeat it back to you:" prompt += "\nEnter 'quit' to end the program. " ❷ message = "" ❸ while message != 'quit': message = input(prompt) print(message) В точке определяется сообщение, которое объясняет, что у пользователя есть два варианта: ввести сообщение или ввести признак завершения (в данном случае это строка 'quit' ). Затем переменной message присваивается значение, введенное пользователем. В программе переменная message инициализируется пустой стро- кой "" , чтобы значение проверялось без ошибок при первом выполнении строки while . Когда программа только запускается и выполнение достигает команды while , значение message необходимо сравнить с 'quit' , но пользователь еще не вводил никакие данные. Если у Python нет данных для сравнения, продолжение выполнения становится невозможным. Чтобы решить эту проблему, необходимо предоставить message исходное значение. И хотя это всего лишь пустая строка, для Python такое значение выглядит вполне осмысленно; программа сможет выполнить сравнение, на котором основана работа цикла while . Цикл while выполняется, пока значение message не равно 'quit' 134 Глава 7 • Ввод данных и циклы while При первом выполнении цикла message содержит пустую строку, и Python входит в цикл. При выполнении команды message = input(prompt) Python отображает подсказку и ожидает, пока пользователь введет данные. Эти данные сохраняются в message и выводятся командой print ; после этого Python снова проверяет усло- вие команды while . Пока пользователь не введет слово 'quit' , приглашение будет выводиться снова и снова, а Python будет ожидать новых данных. При вводе слова 'quit' Python перестает выполнять цикл while , а программа завершается: Tell me something, and I will repeat it back to you: Enter 'quit' to end the program. Hello everyone! Hello everyone! Tell me something, and I will repeat it back to you: Enter 'quit' to end the program. Hello again. Hello again. Tell me something, and I will repeat it back to you: Enter 'quit' to end the program. quit quit Программа работает неплохо, если не считать того, что она выводит слово 'quit' , словно оно является обычным сообщением. Простая проверка if решает проблему: prompt = "\nTell me something, and I will repeat it back to you:" prompt += "\nEnter 'quit' to end the program. " message = "" while message != 'quit': message = input(prompt) if message != 'quit': print(message) Теперь программа проводит проверку перед выводом сообщения и выводит сообще- ние только в том случае, если оно не совпадает с признаком завершения: Tell me something, and I will repeat it back to you: Enter 'quit' to end the program. Hello everyone! Hello everyone! Tell me something, and I will repeat it back to you: Enter 'quit' to end the program. Hello again. Hello again. Tell me something, and I will repeat it back to you: Enter 'quit' to end the program. quit Флаги В предыдущем примере программа выполняла некоторые операции, пока заданное условие оставалось истинным. А если вы пишете более сложную программу, вы- полнение которой может прерываться по нескольким разным условиям? Циклы while 135 Например, компьютерная игра может завершаться по разным причинам: у игрока кончились все «жизни»; прошло отведенное время; все города, которые он должен был защищать, были уничтожены и т. д. Игра должна завершаться при выполне- нии любого из этих условий. Попытки проверять все возможные условия в одной команде while быстро усложняются и становятся слишком громоздкими. Если программа должна выполняться только при истинности нескольких условий, определите одну переменную-флаг. Эта переменная сообщает, должна ли програм- ма выполняться далее. Программу можно написать так, чтобы она продолжала выполнение, если флаг находится в состоянии True , и завершалась, если любое из нескольких событий перевело флаг в состояние False . В результате в команде while достаточно проверить всего одно условие: находится ли флаг в состоянии True . Все остальные проверки (которые должны определить, произошло ли событие, перево- дящее флаг в состояние False ) удобно организуются в остальном коде. Добавим флаг в программу parrot .py из предыдущего раздела. Этот флаг, который мы назовем active (хотя переменная может называться как угодно), управляет тем, должно ли продолжаться выполнение программы: prompt = "\nTell me something, and I will repeat it back to you:" prompt += "\nEnter 'quit' to end the program. " ❶ active = True ❷ while active: message = input(prompt) ❸ if message == 'quit': active = False ❹ else: print(message) В точке переменной active присваивается True , чтобы программа начинала работу в активном состоянии. Это присваивание упрощает команду while , потому что в самой команде while никакие сравнения не выполняются; вся логика реали- зуется в других частях программы. Пока переменная active остается равной True , цикл выполняется . В команде if внутри цикла while значение message проверяется после того, как пользователь введет данные. Если пользователь ввел строку 'quit' , флаг active переходит в состояние False , а цикл while останавливается. Если пользователь ввел любой текст, кроме 'quit' , то введенные им данные выводятся как сообщение. Результаты работы этой программы ничем не отличаются от предыдущего приме- ра, в котором условная проверка выполняется прямо в команде while . Но теперь в программе имеется флаг, указывающий, находится ли она в активном состоянии, и вы сможете легко добавить новые проверки (в форме команд elif ) для событий, с которыми переменная active может перейти в состояние False . Это может быть удобно в сложных программах — например, в компьютерных играх с многочис- ленными событиями, каждое из которых может привести к завершению програм- мы. Когда по любому из этих событий флаг active переходит в состояние False , 136 Глава 7 • Ввод данных и циклы while основной игровой цикл прерывается, выводится сообщение о завершении игры и у игрока появляется возможность сыграть еще раз. Команда break и выход из цикла Чтобы немедленно прервать цикл while без выполнения оставшегося кода в цикле независимо от состояния условия, используйте команду break . Команда break управляет ходом выполнения программы; она позволит вам управлять тем, какая часть кода выполняется, а какая нет. Рассмотрим пример — программу, которая спрашивает у пользователя, в каких го- родах он бывал. Чтобы прервать цикл while , программа выполняет команду break , как только пользователь введет значение 'quit' : cities.py prompt = "\nPlease enter the name of a city you have visited:" prompt += "\n(Enter 'quit' when you are finished.) " ❶ while True: city = input(prompt) if city == 'quit': break else: print(f"I'd love to go to {city.title()}!") Цикл, который начинается с while True , будет выполняться бесконечно — если только в нем не будет выполнена команда break . Цикл в программе продолжает запрашивать у пользователя названия городов, пока пользователь не введет строку 'quit' . При вводе строки 'quit' выполняется команда break , по которой Python выходит из цикла: Please enter the name of a city you have visited: (Enter 'quit' when you are finished.) New York I'd love to go to New York! Please enter the name of a city you have visited: (Enter 'quit' when you are finished.) San Francisco I'd love to go to San Francisco! Please enter the name of a city you have visited: (Enter 'quit' when you are finished.) quit ПРИМЕЧАНИЕ Команда break может использоваться в любых циклах Python . Напри- мер, ее можно включить в цикл for для перебора элементов словаря . Команда continue и продолжение цикла Вместо того чтобы полностью прерывать цикл без выполнения оставшейся части кода, вы можете воспользоваться командой continue для возвращения к началу Циклы while 137 цикла и проверке условия. Например, возьмем цикл, который считает от 1 до 10, но выводит только нечетные числа в этом диапазоне: counting.py current_number = 0 while current_number < 10: ❶ current_number += 1 if current_number % 2 == 0: continue print(current_number) Сначала переменной current_number присваивается 0. Так как значение меньше 10, Python входит в цикл while . При входе в цикл счетчик увеличивается на 1 в точке , поэтому current_number принимает значение 1. Затем команда if проверяет остаток от деления current_number на 2. Если остаток равен 0 (это оз- начает, что current_number делится на 2), команда continue приказывает Python проигнорировать оставшийся код цикла и вернуться к началу. Если счетчик не делится на 2, то оставшаяся часть цикла выполняется и Python выводит текущее значение счетчика: 1 3 5 7 9 Предотвращение зацикливания У каждого цикла while должна быть предусмотрена возможность завершения, что- бы цикл не выполнялся бесконечно. Например, следующий цикл считает от 1 до 5: counting.py x = 1 while x <= 5: print(x) x += 1 Но если случайно пропустить строку x += 1 (см. далее), то цикл будет выполняться бесконечно: # Бесконечный цикл! x = 1 while x <= 5: print(x) Теперь переменной x присваивается начальное значение 1, но это значение никогда не изменяется в программе. В результате проверка условия x <= 5 всегда дает ре- зультат True , и цикл while выводит бесконечную серию единиц: 138 Глава 7 • Ввод данных и циклы while 1 1 1 1 Любой программист время от времени пишет бесконечный цикл, особенно если в программе используются неочевидные условия завершения. Если ваша про- грамма зациклилась, нажмите Ctrl+C или просто закройте терминальное окно с выводом программы. Чтобы избежать зацикливания, тщательно проверьте каждый цикл while и убе- дитесь в том, что цикл прерывается именно тогда, когда предполагается. Если программа должна завершаться при вводе некоторого значения, запустите про- грамму и введите это значение. Если программа не завершилась, проанализируйте обработку значения, которое должно приводить к выходу из цикла. Проверьте, что хотя бы одна часть программы может привести к тому, что условие цикла станет равно False или будет выполнена команда break ПРИМЕЧАНИЕ В некоторых редакторах — в частности, в Sublime Text — используется встроенное окно вывода . Оно может усложнить прерывание бесконечных циклов; воз- можно, для выхода из цикла придется закрыть редактор . Прежде чем нажимать Ctrl+C, по- пробуйте щелкнуть в области вывода; возможно, вам удастся прервать бесконечный цикл . |