Шуман Х. - Python для детей - 2019. # Startwerte festlegen Red (255,0,0)
Скачать 5.95 Mb.
|
Глава Сравнение и повторение 3 64 Score < 0 Одно из двух условий должно быть истинным. (Или ты зна- ешь число, одновременно отрицательное и больше 100?) Чтобы предотвратить эту ошибку, которую создаст опера- тор and, нам придется заменить его на оператор or. В зависимости от условий в Python используются различные опера- торы сравнения. На данный момент ты их все уже изучил. Вот они: 1 Оператор Описание Оператор Описание == Равно != 1 Не равно < Меньше >= Больше или равно > Больше <= Меньше или равно Инструкции с операторами сравнения всегда указываются в одной строке, первое значение в которых противоположно второму. Опе- раторы сравнения для равных и неравных значений ты уже знаешь. Небольшая игра на угадывание Почему бы нам не использовать наши математические познания в небольшой игре на угадывание? Тем более ты сможешь гордиться тем, что написал свою собственную не- большую игру. Так о чем идет речь? Компьютер загадывает число в диапа- зоне от 1 до 1000. И ты должен угадать это случайное число за наименьшее число попыток. Для этого сначала нужна функция, которая генерирует слу- чайное число. К сожалению, мы не найдем такую в стан- дартном словаре языка программирования Python. Но во внешнем модуле, который также относится к Python, есть подходящая. Этот модуль называется random (от англ. – слу- чайный). Нам лишь нужно сообщить интерпретатору Python, что ему нужно использовать (т. е. импортировать) этот модуль. Начнем: ¾ закрой окно редактора с кодом предыдущей програм- мы и создай новую. Введи следующий код в файле про- граммы (⇒ guess.py): 1 С той же целью может использоваться оператор <>. – Прим. перев. Небольшая игра на угадывание 65 import random Secret = "Я задумал число от 1 до 1000" Case = random.randint(1,1000) print(Case) print(Secret) print("Угадай число: ", end="") Input = int(input()) if Input < Case : print("Слишком маленькое!") if Input > Case : print("Слишком большое!") if Input == Case : print("Правильно!") В самом верху кода программы ты можешь увидеть, как мы добавляем (импортируем) нужный модуль: import random Обращение к внешнему модулю происходит с помощью ключевого слова import, за которым следует имя модуля, в нашем случае random, что означает «случайно». Из этого модуля нам нужна одна специальная функция с именем randint() . Обрати внимание, что ее обычным способом не вызвать: Case = randint(1,1000) Ничего не выйдет. Мы также должны указать имя импорти- руемого модуля, в котором содержится эта функция: Case = random.randint(1,1000) Значения в скобках – напомню, что они называются пара метрами, – определяют начало и конец диапазона чисел, из которого компьютером будет выбираться случайное число. И как уже упоминалось, при использовании инструкции randint речь будет идти о целых числах. Я добавил команду print для отображения числа, которое долж- но быть угадано. Так мы сможем проверить правильность работы программы. Позже, правда, придется удалить эту строку. Ниже приводится правило (Case) игры, а затем появляется приглашение для ввода числа: Глава Сравнение и повторение 3 66 print(Case) print(Secret) print("Угадай число: ", end="") Input = int(input()) Затем ты вводишь целое число, и компьютер проверяет, больше оно, меньше или даже совпадает с задуманным: if Input < Case : print("Слишком маленькое!") if Input > Case : print("Слишком большое!") if Input == Case : print("Правильно!") Таким образом, ты будешь понимать, в каком направлении думать, чтобы угадать загаданное компьютером число. Ну как, не терпится запустить и опробовать программу? Давай сделаем это! ¾ Сохрани свою программу под именем guess1.py, а затем запусти ее. Программа работает, но, к сожалению, играть невозмож- но, так как допускается всего лишь единственная попытка угадать загаданное число. Этого недостаточно! Даже если ты будешь перезапускать программу снова и снова, это не поможет: компьютер каждый раз будет придумывать новое число при запуске. Итак, удовольствие от игры мы сможем получить тогда, когда у нас будет возможность попытаться угадать задуманное число несколько раз. Для этого нам необходимо повторять в програме некоторый код несколько раз. Пока число не было угадано, необходимо продолжать за- прашивать ввод и проверять числа, которые мы вводим. Для компьютера, естественно, это должно быть сформули- ровано на языке Python. Кроме того, «число не было уга- дано» – слишком размытое выражение. Оно должно быть математически точным: Input != Case И вот соответствующая конструкция для повторного ис- полнения кода: while Input != Case Небольшая игра на угадывание 67 БлокИнструкций Условие : while В общем, это значит: Пока выполняется определенное условие, компьютер будет по- вторять исполнение блока инструкций. Теперь мы должны добавить новую строку в нужную пози- цию кода. То есть применить ко всем строкам инструкций, которые необходимо повторить: while Input != Case : print("Угадай число: ", end="") Input = int(input()) if Input < Case : print("Слишком маленькое!") if Input > Case : print("Слишком большое!") if Input == Case : print("Правильно!") Здесь мы также используем двоеточие (как и в конструкци- ях if). Все строки с инструкциями, относящиеся к условной конструкции while , обязательно должны иметь отступ (пробел слева). ¾ Измени исходный код своей программы, как показано выше, и запусти свою программу. Не работает, как показано на рис. 3.2? Получается, что ин- терпретатор Python не понял, что ты добавил новую пере- менную? Глава Сравнение и повторение 3 68 Рис. 3.2.Ошибка интерпретатора А ведь верно: во время обработки строки со сравнением In put != Case переменная Input еще не существует. Она будет создана только тогда, когда мы присвоим ей какое-то зна- чение. А она создается позднее, в строке Input = int(input()) Поэтому нам необходимо присвоить переменной значение перед конструкцией while, например так: Input = 0 Это может быть любое число, но вне диапазона от 1 до 1000. В таком случае переменная будет существовать и может быть использована, в том числе и для сравнения. Если мы соберем все вместе, финальная программа будет выглядеть так (⇒ guess2.py): import random Secret = "Я задумал число от 1 до 1000" Case = random.randint(1,1000) print(Case) print(Secret) Input = 0 while Input != Case : print("Угадай число: ", end="") Input = int(input()) if Input < Case : print("Слишком маленькое!") if Input > Case : print("Слишком большое!") if Input == Case : print("Правильно!") Компьютер считает попытки 69 ¾ Измени код и начинай играть. Теперь ты можешь уга- дывать число так долго, сколько потребуется (рис. 3.3). Рис. 3.3.Число успешно угадано! Конструкция, в которой повторяется часть кода програм- мы, называется циклом. Он исполняется повторно до тех пор, пока выполняется условие. Кстати, while – это тоже ключевое слово. Компьютер считает попытки Попрактиковавшись и применив смекалку, понадобится не более десяти попыток, чтобы угадать число. (Маленький намек: старайся всегда искать золотую середину!) Если ты уже несколько раз играл в аналогичную игру, то, вероятно, не будешь возражать, если компьютер подсчита- ет колличество твоих попыток угадать число. Для этого нам понадобится новая переменная, назовем ее Attempt (т. е. «Попытка»). Мы присвоим ей значение 0, так как ни одной попытки еще не было совершено. Attempt = 0 Глава Сравнение и повторение 3 70 В цикле значение переменной Attempt должно увеличивать- ся на 1 с каждой новой попыткой угадывания. За это отве- чает следующая инструкция: Attempt = Attempt + 1 Твой компьютер берет текущее количество совершенных попыток и добавляет к нему 1. И вновь предоставляет воз- можность угадать число. В результате новое значение ста- новится на 1 больше предыдущего. Обрати внимание, это уравнение отличается от тех, которые ты привык видеть на уроках математики. Компьютер всегда выполняет сначала то, что находится справа от оператора присваивания (=). В инструкции он вычисляет выраже- ние с правой стороны. Attempt + 1 Затем он переходит влево и присваивает результат в виде нового значения переменной. Возможно, стрелка поможет понять тебе этот процесс: Attempt ← Attempt + 1 Предположим, что исходное значение равно 0. Процесс выглядит так: Процесс Схема Значение переменной Attempt Присвоение Attempt ← 0 0 Вычисление результата Attempt + 1 0 + 1 Присвоение Attempt ← Результат 1 Таким образом, старое значение количества попыток угадывания заменяется новым значением. При следующей попытке оно ста- новится 1, затем 2 и увеличивается каждый раз на единицу. Кроме того, нам понадобится вот такая надпись, уведомляю- щая, с какой попытки ты угадал число, загаданное компью- тером: print("Ты попробовал " + Attempt + " раз.") Компьютер считает попытки 71 ¾ Ну вот, снова пришло время набирать код программы. Полный код этой программы показан ниже (⇒ guess3): import random Secret = "Я задумал число от 1 до 1000" Case = random.randint(1,1000) print(Secret) Attempt = 0 Input = 0 # Процесс угадывания while Input != Case : print("Угадай число: ", end="") Input = int(input()) Attempt = Attempt + 1 if Input < Case : print("Слишком маленькое!") if Input > Case : print("Слишком большое!") if Input == Case : print("Правильно!") print("Ты попробовал " + Attempt + " раз.") Обрати внимание, что последняя строка не имеет отступа, поэто- му Python понимает, что она не относится к конструкции while. К сожалению, у нас с тобой снова появляется небольшая проблема в самом конце игры. Интерпретатор Python не хочет принимать последнюю строку в нашей программе (рис. 3.4). Рис. 3.4.В программу закралась какая-то ошибка Он требует, чтобы значение переменной с количеством по- пыток было представлено исключительно в строковом фор- Глава Сравнение и повторение 3 72 мате, иначе оно не поддерживается в сочетании с осталь- ными словами в строке. С помощью оператора + ты можешь складывать числа или соединять (конкатенировать) стро- ки, другими возможностями эта команда не обладает. Таким образом, здесь вновь происходит преобразование типа данных, но на этот раз не в числовой формат, а в стро- ковый. И это происходит следующим образом: print("Ты попробовал " + str(Attempt) + " раз.") Функция str() отвечает за преобразование в строковый формат. ¾ Измени исходный код программы и затем запусти игру еще раз. И в конце концов компьютер все-таки призна- ется, сколько раз тебе пришлось угадывать это число (рис. 3.5). Рис. 3.5.Программа успешно считает количество попыток Шлифуем игру Поиграв, в какой-то момент тебе одозначно придет на ум такая мысль: «Игра хорошая. Но мне больше не хочется играть. Я хочу выйти из игры!» Шлифуем игру 73 Так, ты можешь выйти из игры, нажав кнопку в виде крес- тика (значок × в верхнем правом углу окна), используемую для закрытия окон в операционной системе Windows. Но нет ли более элегантного выхода? Можно реализовать, например, введя ноль. Это можно сде- лать с помощью всего лишь одной строки: if Input == 0 : exit() Функция exit() завершает программу. Несмотря на то что программа полностью прервется, она не совсем корректно завершит работу. Ты можешь это понять по окну сообще- ния, которое всегда появляется, когда программа прерыва- ется (рис. 3.6). Рис. 3.6.Сообщение о принудительном завершении программы ¾ Нажми кнопку ОК, если ты решил завершить работу своей программы. Это, конечно, не изящное решение, но как же иначе нам выйти из программы до момента, когда число будет угада- но? Попробуем: if Input == 0 : break С помощью команды break ты можешь выйти из своей про- граммы. Если вы введешь ноль сразу или после нескольких неудачных попыток угадать загаданное число, то игра за- вершится. Глава Сравнение и повторение 3 74 И будет гораздо лучше, если по завершении программы ты еще увидишь число, которое загадал компьютер (⇒ guess4): if Input == 0 : print("Правильное число: " + str(Case)) break В любом случае, в конечном итоге компьютер покажет тебе, сколько раз ты пытался угадать. ¾ Обнови код программы, а затем играй столько, сколько захочешь! (А может, даже захочешь увеличить диапа- зон загадываемого числа с 1000 до 500 000?) Помимо ключевого слова break, в языке программирования Py- thon есть команда continue. В чем же разница? break continue whileцикл whileцикл В обоих случаях цикл сначала прекращается. Если обнаружена команда break, компьютер переходит к выполнению инструкций после цикла. Если обнаружена команда continue, он переходит к началу цикла (и, следовательно, происходит следующая итера- ция (повтор) цикла). Подведение итогов Ну что ж, ты создал первую игру с моими небольшими ре- комендациями, и для начала это не так уж плохо! В этой главе ты встретил новые слова из языка программи- рования Python (и, конечно, использовал и ранее выучен- ные!): and Связывающий оператор. Должны выполняться все условия для исполнения последующего блока инструкций or Связывающий оператор. Должно выполняться только одно условие для исполнения последующего блока инструкций ...и задач 75 < , <=, >, >= Операторы сравнения: больше, больше или равно, меньше, меньше или равно while Цикл. Если условие выполнено, выполняется блок инструкций внутри цикла break Выход из цикла и переход к последующим инструкциям continue Выход из цикла и переход к началу цикла для следующей его итерации import Импорт внешнего модуля (словарь) random Модуль random для генерации случайных чисел randint() Функция для генерации случайных чисел str() Преобразование типа данных в строку (String) end="" Параметр, который предотвращает переход на новую строку Несколько вопросов... 1. Объясни разницу между операторами < и <= или > и >=. 2. Что именно происходит в этих инструкциях: Value = Value + 1 Value = Value – 1 Value = Value * 2 3. Как сгенерировать случайное число в диапазоне от 1 до 6 (например, для игры в кости)? ...и задач 1. Измени программу приветствия так, чтобы введенные значения указывались непосредственно после строки (а не ниже). 2. В школах, кроме ЕГЭ, есть еще один тип оценок. Это бал- лы от 0 до 10. Здесь «0» очков считается «недостаточно», остальные баллы рассчитываются в два шага (1 и 2 = 1, 3 и 4 = 2 и т. д.). Измени программу оценок так, чтобы ее можно было также использовать для 10-балль ной си- стемы. 3. В программе с указанием возраста ты можешь ввести свой возраст (или, например, друга). Аналогичным об- разом, как программа с оценками, компьютер должен давать определенному возрасту некий подходящий ответ. 76 4 Азартная игра Ты когда-нибудь играл в лотерею? Несмотря на то что мно- гие математики настоятельно советуют этого не делать, большинство людей считает, что в конечном итоге они все-таки станут миллионерами. Шансы существенно повы- шаются, если у тебя есть небольшой капитал и ты можешь куда-нибудь инвестировать деньги и «немного» подождать (пару лет или десятилетий) до получения своего первого миллиона. В данной главе компьютер может помочь тебе разобраться в этом вопросе. Итак, в этой главе ты узнаешь: как сделать перерыв; что такое цикл for; о списках и массивах; о вложенных циклах. Игра наудачу Что ты думаешь насчет азартного варианта игры в числа? Если компьютер может генерировать случайные числа от 1 до 1000, то, конечно, сможет и сгенерировать выпадения игральной кости (т. е. от 1 до 6). В таком случае нам ничего не надо делать в программе, только ждать. Игра наудачу 77 Бросок обеих игральных костей выполняется компьюте- ром, и бросает он их совершенно случайно. ¾ Создай новый файл и введи показанный ниже код (⇒ dice1): import random, time print("Давай бросим кубики!") Attempt = 0 YourNumber = 0 MyNumber = 0 # Игральные кубики while Attempt < 5 : Attempt = Attempt + 1 print(str(Attempt) + ". Раунд") print("Твой бросок: ", end="") Shoot1 = random.randint(1,6) # Твой бросок time.sleep(0.5) # Ожидание в полсекунды print(Shoot1) print("Мой бросок: ", end="") Shoot2 = random.randint(1,6) # Мой бросок time.sleep(0.5) # Ожидание в полсекунды print(Shoot2) if Shoot1 > Shoot2 : YourNumber = YourNumber + 1 if Shoot1 < Shoot2 : MyNumber = MyNumber + 1 print(str(YourNumber) + " и " + str(MyNumber)) time.sleep(1) # Ожидание в секунду print() # Вычисления if YourNumber > MyNumber : print("Ты выиграл") elif YourNumber < MyNumber : print("Я выиграл") else : print("Ничья") Программа имеет определенное сходство с версией из пре- дыдущей главы: речь идет о случайных числах, которые здесь также будут сравниваться и подсчитываться. Однако ты не имеешь в этой игре никакого влияния. Это просто игра, где ты можешь лишь наблюдать, выиграешь ты или проиграешь. Если ты просмотришь весь код программы, то наверняка воскликнешь: ничего нового! Даже комментарии (строки, которые снабжены символом #), тебе уже знакомы. |