Учим Python, делая крутые игры 2018. Invent your owncomputer gameswith python
Скачать 6.56 Mb.
|
54 Глава 3 19. 20. if guess > number: 21. print('Твое число слишком большое.') 22. 23. if guess == number: 24. break 25. 26. if guess == number: В игре «Угадай число» блок for начинается с инструкции for в строке 12, а первой строкой после блока for будет строка 26. Инструкция for всегда содержит двоеточие (:) после условия . Предпо- лагается, что если вы закончили инструкцию двоеточием, то со следующей строки начинается новый блок. Это показано на рис. 3.2. 12. for guessesTaken in range(6): 13. print('Попробуй угадать.') # Четыре пробела перед именем функции print 14. guess = input() 15. guess = int(guess) 16. 17. if guess < number: 18. print('Твое число слишком маленькое.') # Восемь пробелов перед именем функции print 19. 20. if guess > number: 21. print('Твое число слишком большое.') 22. 23. if guess == number: 24. break 25. 26. if guess == number: Цикл выполняется 6 раз Рис. 3.2. Ход выполнение цикла for Рисунок 3.2 демонстрирует выполнение кода. Интерпретатор входит в блок for в строке 13 и продолжает выполнение сверху вниз. Когда програм- ма достигает конца блока, вместо того, чтобы спускаться дальше к следующей строке, начинается второе выполнение цикла со строки 13. Так повторяется 6 раз, поскольку в вызове функции инструкции for указано range(6). Каждое выполнение цикла называется итерацией. Можно представить себе, что инструкция for сообщает: «Выполнить код в следующем блоке указанное количество раз». Игра «Угадай число» 55 Игрок угадывает число В строках 13 и 14 компьютер предлагает игроку угадать число и предо- ставляет возможность ввести свой вариант. 13. print('Попробуй угадать.') # Четыре пробела перед именем функции print 14. guess = input() Число, которое вводит игрок, сохраняется в переменной с именем guess. Преобразование значений при помощи функций int(), fl oat() и str() В строке 15 вызывается новая функция, которая называется int(). 15. guess = int(guess) Функция int() принимает аргумент и возвращает значение этого аргу- мента в виде целого числа. Введите следующий код в интерактивной оболочке, чтобы посмотреть, как работает функция int(): >>> int('42') 42 Вызов int('42') возвратит целочисленное значение 42. >>> 3 + int('2') 5 Вызов 3 + int('2') является примером, в котором возвращаемое значение функции int() используется как часть выражения. Вычисление производится до целочисленного значения 5. 3 + int('2') 3 + 2 5 56 Глава 3 Несмотря на то что вы можете конвертировать строку в целое число, вы не можете сделать это с любой строкой. Попытка конвертации строки 'forty-two' (сорок два) в целое число при- ведет к ошибке . >>> int('сорок-два') Traceback (most recent call last): File " ", line 1, in int('сорок-два') ValueError: invalid literal for int() with base 10: 'сорок-два' Строка, которую вы передаете функции int(), должна содержать только цифры. В игре «Угадай число» мы получаем ответ игрока при помощи функции input() . Помните, функция input() всегда возвращает строку текста, вводи- мую игроком. Если игрок ввел 5, функция input() вернет строковое значение '5' , а не целочисленное значение 5. Но в будущем нам понадобится сравнить ввод игрока с целочисленным значением, а Python не сможет использовать операторы < и > для сравнения строкового и целочисленного значений. >>> 4 < '5' Traceback (most recent call last): File " ", line 1, in 4 < '5' TypeError: unorderable types: int() < str() Поэтому нам необходимо преобразовать строку в целое число. 14. guess = input() 15. guess = int(guess) В строке 14 мы присваиваем переменной guess то строковое значение, ко- торое ввел игрок. В строке 15 строковое значение переменной guess меняется на целочисленное, возвращаемое функцией int(). Код int(guess) возвращает новое целочисленное значение, которое было указано в виде строки, и опе- ратор = присваивает это новое значение переменной guess. В дальнейшем это позволит программе сравнить значение переменной guess и определить его отношение к секретному числу в переменной number. Игра «Угадай число» 57 Функции float() и str() будут возвращать версии переданных им аргу- ментов в виде числа с плавающей запятой и строки, соответственно. Введите следующий код в интерактивной оболочке: >>> float('42') 42.0 >>> float(42) 42.0 Если функции float() передать строку '42' или целое число 42, будет воз- вращено число с плавающей запятой — 42.0. Теперь попробуйте использовать функцию str(). >>> str(42) '42' >>> str(42.0) '42.0' Если передать целое число 42 функции str(), она возвратит строковое значение '42'. Если передать ей то же число с плавающей запятой, вернется строковое значение '42.0'. Используя функции int(), float() и str(), вы можете брать значения одно- го типа данных и превращать их в значения другого типа. Логический тип данных В Python каждое значение имеет свой тип данных. Вы уже познакоми- лись с такими типами, как целое число, число с плавающей запятой и строка. Новый тип называется логическим или булевым. Логический (булев) тип дан- ных может принимать одно из двух значений: True (Истина) или False (Ложь) . Имена логических значений следует писать строго с соблюдением регистра: True или False. Логические значения могут храниться в переменных, как и другие типы данных. >>> spam = True >>> eggs = False 58 Глава 3 В этом примере вы присваиваете переменной spam значение True, а пере- менной eggs — значение False. Строго соблюдайте регистр при вводе логиче- ских значений. Вы будете использовать логические значения с операторами сравнения для создания условий. Сначала давайте разберемся, что такое операторы сравнения, а затем перейдем к условиям. Операторы сравнения Операторы сравнения сравнивают два значения и возвращают результат в виде логического значения True или False. В таблице 3.1 приведен перечень всех операторов сравнения в Python. Таблица 3.1. Операторы сравнения Оператор Значение < Меньше > Больше <= Меньше или равно >= Больше или равно == Равно != Не равно Вы уже знакомы с арифметическими операторами +, -, * и /. Как и любые другие операторы, операторы сравнения объединяются со значениями для формирования выражений, таких как guessesTaken < 6. В строке 17 программы «Угадай число» используется оператор сравнения «меньше». 17. if guess < number: Позднее мы рассмотрим инструкцию if более детально. Сейчас давай- те взглянем на выражение, которое следует за ключевым словом if (guess < number ). Это выражение содержит два значения (значения переменных guess и number), связанных между собой оператором < (меньше). Проверка условий и определение истинности/ложности Условие — это выражение, которое объединяет два значения при помо- щи оператора сравнения (такого, как < или >), выдавая в результате логиче- ское значение. Условие — это всего лишь иное название выражения, кото- Игра «Угадай число» 59 рое определяется как истинное (True) или ложное (False). Например, условия почти всегда встречаются в инструкциях if. Условие в строке 17 — guess < number — это вопрос: «Меньше ли значе- ние переменной guess, чем значение переменной number?». Если да, то условие определяется истинное. Если нет — то ложное. Предположим, переменная guess содержит целое число 10, а переменная number — 16. Так как 10 меньше, чем 16, это условие будет определено, как ис- тинное. Вычисление будет производиться следующим образом: guess < number 10 < 16 True Эксперименты с логическими операторами, операторами сравнения и условиями Введите следующие выражения в интерактивной оболочке, чтобы уви- деть логические результаты их вычисления: >>> 0 < 6 True >>> 6 < 0 False Условие 0 < 6 возвращает логическое значение True, так как число 0 мень- ше, чем число 6. А так как 6 больше 0, то условие 6 < 0 возвращает значение False Обратите внимание, что выражение 10 < 10 возвращает значение False, потому что число 10 не меньше числа 10. >>> 10 < 10 False Значения одинаковые. Если абстрактные Анна и Борис — одного роста, то нельзя сказать, что один из них выше или ниже другого. Оба эти заявления были бы ложными. Введите следующие выражения в интерактивной оболочке: 60 Глава 3 >>> 10 == 10 True >>> 10 == 11 False >>> 11 == 10 False >>> 10 != 10 False В этом примере 10 равно 10, поэтому выражение 10==10 истинно. Но 10 не равняется 11, поэтому выражение 10==11 ложно. И наконец, 10 равно 10, поэтому выражение 10!=10 ложно. При помощи операторов сравнения вы также можете сравнивать строко- вые значения. >>> 'Привет' == 'Привет' True >>> 'Прощай' != 'Привет' True >>> 'Привет' == 'ПРИВЕТ' False 'Привет' — то же самое, что и 'Привет', поэтому выражение 'Привет' == 'Привет' истинно. 'Прощай' не равняется 'Привет', поэтому выражение 'Прощай' != 'Привет' — также истинно. Обратите внимание, что последнее выражение ложно. Вспомним, Python различает строчные и прописные буквы. Поэтому 'Привет' не равняется 'ПРИВЕТ'. Целочисленные значения и строковые значения никогда не будут равны друг другу, поскольку они принадлежат к разным типам. Например, введите следующий код в интерактивной оболочке: >>> 42 == 'Привет' False >>> 42 != '42' True В первом примере 42 — целое число, а 'Привет' — строка, поэтому значе- ния не одинаковы и выражение ложно. Во втором примере строковое значе- Игра «Угадай число» 61 ние '42' так же не является целым числом, поэтому выражение «целое число 42 не равняется строковому значению '42'» истинно. Разница между операторами = и == Будьте внимательны, чтобы не перепутать оператор присваивания = и оператор сравнения ==. Знак равно (=) используется в инструкциях присваивания, чтобы сохра- нять (присваивать) значение переменной, а двойной знак равно (==) исполь- зуется в выражениях сравнения, чтобы определить, равны ли два значения. Их очень легко случайно перепутать. Чтобы запомнить разницу, помните, что обозначение оператора «Равно» (==), как и оператора «Не равно» (!=), состоит из двух символов. Инструкции if Код в строке 17 — это инструкция if . 17. if guess < number: 18. print('Твое число слишком маленькое.') # Восемь пробелов перед именем функции print Блок кода, который следует за инструкцией if, будет выполнен, если усло- вие инструкции будет определено как истинное. Если условие окажется лож- ным, код в блоке if будет пропущен. Используя инструкцию if, вы можете заставить программу запускать код только тогда, когда вам это необходимо. В строке 17 проверяется, меньше ли введенное игроком число, чем се- кретное число, которое загадал компьютер. Если да, интерпретатор перехо- дит внутрь блока if к строке 18, и игрок получает сообщение, что его число меньше загаданного. В строке 20 проверяется, что больше: введенное игроком или загаданное число. 20. if guess > number: 21. print('Твое число слишком большое.') Если это условие истинно, вызов функции print() сообщает игроку, что его число больше загаданного компьютером. 62 Глава 3 Выход из цикла до его завершения при помощи инструкции break Инструкция if в строке 23 проверяет, равно ли число, введенное игроком, числу, которое загадал компьютер. Если да, программа запускает инструк- цию break в строке 24. 23. if guess == number: 24. break Инструкция break незамедлительно переносит выполнение из блока for в первую строку после окончания этого блока. Инструкцию break следует вы- зывать только из циклов, таких как блок for. Проверка, победил ли игрок Блок for заканчивается на следующей строкой кода без отступов, которой является строка 26. 26. if guess == number: Выполнение блока for прекращается в двух случаях: либо когда было пройдено 6 циклов (и игрок исчерпал свои попытки угадать число), либо ког- да выполняется инструкция break в строке 24 (т.е. игрок победил). В строке 26 проверяется, угадал ли игрок число. Если да, происходит вы- полнение кода блока if в строке 27. 27. guessesTaken = str(guessesTaken + 1) 28. print('Отлично, ' + myName + '! Ты справился за ' + guessesTaken + ' попытки!') Строки 27 и 28 выполняются только в том случае, если условие в инструк- ции if в строке 26 истинно (то есть если игрок угадал число). В строке 27 вызывается функция str() , которая возвращает строковое значение guessesTaken + 1 (так как диапазон функции изменяется от 0 до 5, а не от 1 до 6). Код в строке 28 конкатенирует строки, чтобы сообщить игроку о его выигрыше и о том, с какой попытки ему это удалось. Только строковые значения могут конкатенироваться с другими строками. Вот почему нам не- обходимо в строке 27 преобразовать значение guessesTaken + 1 в строковую Игра «Угадай число» 63 форму. В противном случае при попытке объединить строку и целое число Python выдаст ошибку. Проверка, проиграл ли игрок Когда игрок использовал все свои попытки угадать число, интерпретатор переходит к следующей строке кода. 30. if guess != number: В строке 30 используется оператор сравнения «Не равно», !=, чтобы про- верить условие «последняя попытка игрока угадать не равняется числу, зага- данному компьютером». Если это условие истинно, интерпретатор переходит к блоку if в строке 31. Строки 31 и 32 внутри блока if выполняются только в том случае, если условие в строке 30 истинно. 31. number = str(number) 32. print('Увы. Я загадала число ' + number + '.') В этом блоке программа сообщает игроку загаданное число. Для этого необходимо конкатенировать строки, но переменная number содержит цело- численное значение. В строке 31 мы перезаписываем значение переменной number в виде строки, чтобы можно было конкатенировать строки и получить результат — 'Увы. Я загадала число ' + number + '.' в строке 32. В этой точке достигается конец кода, и выполнение программы заверша- ется. Поздравляю! Вы только что написали свою первую игру! Вы можете изменять сложность игры, настраивая максимальное количе- ство попыток угадать число. Чтобы предоставить игроку всего четыре по- пытки, измените код в строке 12 следующим образом: 12. for guessesTaken in range( 4): Передав функции range() аргумент 4, вы определяете, что код внутри цик- ла будет выполняться четыре раза вместо шести. Это существенно усложняет игру. Чтобы упростить игру, введите большее целое число в вызов функции range() . Это приведет к тому, что цикл будет выполняться большее количе- ство раз, и у игрока будет больше попыток угадать число. Заключение Программирование — написание кода программ — это создание про- грамм, которые будут выполняться компьютером. Когда вы видите, что кто-то работает с программой (например, играет в вашу игру «Угадай число»), все что вы видите, — это текст на экране ком- пьютера. Программа решает, какой текст выводить на экран (программный вывод), основываясь на указанных вами инструкциях и на том, что игрок вво- дит с клавиатуры (программный ввод). Программа — это всего лишь набор инструкций, которые реагируют на ввод пользователя. В Python существует несколько видов инструкций: • Выражения — значения, связанные операторами. Все выражения вычисляются в одно значение. Например, в результате вычисления 2 + 2 получается 4, а результатом выражения 'Привет' + ', ' + 'мир!' будет строка 'Привет, мир!'. Когда выражения следуют за ключевыми словами if и for, их еще называют условиями. • Инструкции присваивания сохраняют значения в переменных для их дальнейшего использования в программе. • Инструкции if , for и break управляют потоком и позволяют пропу- скать инструкции, зацикливать выполнение инструкций или пре- кращать выполнение циклов. Вызов функций позволяет изменить ход выполнения, осуществив переход к набору инструкций внутри функции . • Функции print() и input() отображают текст на экране и получают текст, набранный с клавиатуры. Инструкции, которые имеют дело с программным вводом и выводом, называются инструкциями ввода/ вывода. Вот и все — только эти четыре пункта. Конечно же, еще предстоит из- учить множество деталей об этих четырех типах инструкций. В следующих главах вы узнаете больше типов данных и операторов, изучите больше ин- струкций управления потоком и много других функций Python. Существуют также разные способы ввода/вывода помимо текстового, такие как ввод с по- мощью мыши и звуковой/графический вывод. Программа-шутник 65 4 ПРОГРАММА-ШУТНИК Программа из этой главы рассказывает пользователю несколько анекдотов и де- монстрирует более продвинутые спосо- бы использования функции print(). В большинстве игр из этой книги для вво- да и вывода применяется обычный текст . Ввод производит пользователь путем набора на клавиату- ре, а вывод — это текст, который отображается на экране . В ЭТОЙ ГЛАВЕ РАССМАТРИВАЮТСЯ СЛЕДУЮЩИЕ ТЕМЫ: • Экранируемые символы • Использование одинарных и двойных кавычек в строках • Использование ключевого слова end в функции print() для пропуска символа новой строки Вы уже знаете, как отображать обычный текстовый вывод с помощью функции print(). Теперь давайте ближе рассмотрим, как в Python работают строки и функция print(). Пример запуска программы «Шутки» Вот что видит пользователь, когда выполняется программа «Шутки» : Что получится, если скрестить снеговика с вампиром? Обморожение! Что дантисты называют 'черной дырой'? |