Шуман Х. - Python для детей - 2019. # Startwerte festlegen Red (255,0,0)
Скачать 5.95 Mb.
|
Глава Азартная игра 4 78 Единственно, ты встретил новые ключевые слова, time и sleep. Кроме того, я интегрировал в программу два моду- ля с помощью команды import. Если первый модуль, random, тебе знаком по прошлой программе, то второй – это мо- дуль time, он предоставляет функцию sleep(), которая мо- жет приостановить выполнение программы на указанное время. Параметром в скобках является время в секундах, допустимы как целочисленные, так и значения с плаваю- щей запятой. В нашем случае игра делает небольшие перерывы после «подбрасывания игральных костей» общей длительностью в полторы секунды. (Если это для тебя слишком мало или много, измени значения в коде.) ¾ Сохрани программу в файл с именем dice1.py, а затем запусти ее несколько раз для проверки (рис. 4.1). Рис. 4.1.Запуск программы из файла dice1.py Конструкция for 79 Ты можешь заметить, что для функции print()» ничего не ука- зано в качестве параметра в круглых скобках. Это означает, что она ничего не будет выводить, но текстовый курсор тем не ме- нее переходит на следующую строку: так мы создаем расстояние между строками. Это особенно полезно, когда текст должен быть визуально отделен – просто потому, что так программа выглядит лучше. Конструкция for В предыдущей версии игры мы не указывали явно коли- чество попыток угадывания числа, а теперь зададим коли- чество подбрасываний кубиков. В языке Python есть другая условная конструкция, отличная от while (⇒ dice2.py): # Игральные кубики import random, time print("Давай бросим кубики!") YourNumber = 0 MyNumber = 0 for Nr in range(5) : print(str(Nr+1) + ". Раунд") 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("Ничья") Глава Азартная игра 4 80 ¾ Измени код предыдущей версии программы в соответ- ствии с листингом и запусти ее. Прежде всего в глаза бросается, вероятно, такая строка: for Nr in range(5) : Вот что она означает: Для переменной Nr компьютер должен ПОВТОРИТЬ блок инст- рукций указанное количество раз. БлокИнструкций Nr in range(Значение) : for Начнем разбираться: функция range() определяет список, который в этом случае содержит целые числа от 0 до 4. Для каждого элемента этого списка цикл повторяется. Переменная Attempt не нужна, потому что подсчетом теперь занимается переменная Nr, но мы должны учитывать, что подсчет компьютер начинает с 0: print(str(Nr+1) + ". Раунд") Остальные же инструкции точно такие же, что и в цикле while . Получилась так называемая конструкция for. И по- скольку она занимается подсчетом, ты можешь назвать ее считающим циклом. А как быть в том случае, если тебе нужен список, который начинается не с 0, а, скажем, с 1? Это можно решить следу- ющим образом: for Nr in range(1,6) : Упростить можно так: print(str(Nr) + ". Раунд") Мы можем задать функции range() еще и третий параметр, который определяет ее математический шаг. Мы не можем Конструкция for 81 вывести разные числа в определенном диапазоне, но мож- но показать, допустим, каждое второе (⇒ mathe4.py): # Четные числа for Nr in range (0,100,2) : print(Nr, end=" ") print() print() # Нечетные числа for Nr in range (1,100,2) : print(Nr, end=" ") ¾ Если хочешь, создай новую программу и введи исход- ный код. Затем запусти свою программу (рис. 4.2). Рис. 4.2.Запуск программы mathe4.py Как видишь, здесь можно промахнуться с функцией print(): я сделал так, чтобы с помощью параметра end=" " между каждым выводимым числом отображался пробел. Кроме того, в коде ис- пользуются две инструкции с функцией print() без параметров, необходимые для создания промежутка между строками четных и нечетных чисел. Вместо функции range() ты также можешь применить спи- сок, который затем использовать в цикле for. Вот неболь- шой пример: Week = ["Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье"] for Day in Week : print(Day) Программа выводит списком названия дней недели. Глава Азартная игра 4 82 Квадратные скобки ты можешь ввести, если переключишься на клавиатуре на английскую раскладку и нажмешь клавиши Х и Ъ. Важно, что дни недели перечисляются в одной строке про- граммы (это не всегда получается показать в книге). На пути к миллиону Со знаниями, которые ты уже получил, ты легко можешь создать программу, способную чуть подправить твое фи- нансовое положение. ¾ Введи следующий код программы (⇒ million1.py): import random Capital = random.randint(2,10)*10000 print("Ты выиграл в лотерею " + str(Capital) + " рублей!") print("Ты можешь не забирать выигрыш сразу, ", end="") print("а вложить деньги и заработать на этом!") print("Процентная ставка: ", end="") Percent = float(input()) Term = 0 while Capital < 1000000 : Fee = Capital * Percent / 100 Capital = Capital + Fee Term += 1 print("Чтобы стать миллионером, тебе понадобится ", end="") print(str(Term) + " лет.") (Обрати внимание, что инструкции print, если даже в кни- ге распределены на две строки, в программе должны быть однострочными!) Если ты столкнулся с очень длинными строками, то в Python ты сможешь разделить одну строку на две части: print("Ты выиграл в лотерею " + str(Capital) + \ " рублей!") Так называемая «косая черта», или «слеш» (\), в конце строки сообщает Python, что следующая строка относится к той же ин- струкции. На пути к миллиону 83 Так что же происходит в этой программе? Тот факт, что она имеет какое-то отношение к математике, выражается не только в именах переменных, например: Fee, Capital и Per cent Поскольку капитал (Capital) должен быть (случайной) при- былью, мы попытаемся использовать генератор чисел. Что- бы эта прибыль не оказалась слишком маленькой, мы нач- нем с 20 тыс. рублей: Capital = random.randint(2,10)*10000 Теперь устанавливаем прибыль в диапазоне от 20 тыс. до 100 тыс. рублей, ведь не будем же мы ставить на выигрыш сразу миллион?! (И делать выигравшего сразу миллионе- ром.) Какой процент выбранный тобой банк (или другая финан- совая организация) предлагает, ты вводишь сам: print("Процентная ставка: ", end="") Percent = float(input()) Разумеется, здесь также можно использовать числа с плаваю- щей запятой. Затем срок устанавливается равным нулю: Term = 0 А теперь речь пойдет о вычислении процентов. Если ты еще не проходил (или уже забыл) эту тему на уроках математи- ки, все не так уж плохо. Просто вводи данные и доверься мне – я знаю, как это делается. Что происходит в цикле while? Во-первых, вычисляется до- ход за один год: Fee = Capital * Percent / 100 Затем он будет засчитан в капитал: Capital = Capital + Fee И поскольку каждый год доход увеличивается, срок вклада будет увеличивается на 1: Term += 1 Глава Азартная игра 4 84 Но это выглядит немного странно. Фактически вот что делает Py- thon в этой строке: Term = Term + 1 Можно заменить следующим кодом: Term += 1 Для строки Term = Startzeit + 1 прием, разумеется, не сработает. И так будет продолжаться, пока не будет достигнут первый миллион: Capital < 1000000 ¾ Запусти программу несколько раз, чтобы узнать, како- вы твои шансы стать миллионером в ближайшие не- сколько десятилетий, при условии, конечно, что у тебя будет достаточно денег. Если ты введешь ноль в качестве процентной ставки (Percent), возникнет проблема: твоя программа зависнет, поскольку милли- он никогда не будет достигнут и выполнение будет происходить бесконечно. Тебе придется закрыть окно программы. Если хочешь, то также можешь создать дополнительный цикл, ко- торый будет повторять запрос ввода процентной ставки, пока не будет введено число больше нуля. Может быть, лучше не полагаться на удачу в финансовом вопросе, а начать с капитала, который ты действительно можешь иметь? Для этого мы немного изменим начало программы, чтобы у тебя была возможность указать свой начальный капитал: print("Какую сумму ты хочешь инвестировать: ", end="") Capital = float(input()) Затем код программы продолжается, как и раньше: print("Процентная ставка: ", end="") Percent = float(input()) На пути к миллиону 85 Term = 0 … Ниже представлен полный код новой версии игры (⇒ mil lion2.py): print("Какую сумму ты хочешь инвестировать: ", end="") Capital = float(input()) print("Процентная ставка: ", end="") Percent = float(input()) Term = 0 while Capital < 1000000 : Fee = Capital * Percent / 100 Capital = Capital + Fee Term += 1 if Term > 0 : print("Чтобы тебе превратиться в миллионера, твои деньги в течение ", end="") print(str(Term) + " лет должны быть в банке.") else : print("Добро пожаловать в Клуб миллионеров!") Добавим еще кое-что в код программы. Если ты начал игру с миллиона (или более), срок вклада (Term) станет бессмыс- ленным (то есть равным 0), но ты все еще можешь кое-что сделать в игре. ¾ Измени свою программу и попробуй запустить новую версию программы несколько раз. Ты увидишь, что в некоторых случаях должно пройти мно- го лет, да и ты сам, скорее всего, выйдешь на пенсию, когда получишь возможность снять свой первый миллион. Может быть, тебе будет интересно узнать, сколько сможет накапливаться денег за определенный срок? В этом случае ты должен сам определить срок вклада. Таким образом, у нас получается три строки кода для ввода: print("Какую сумму ты хочешь инвестировать: ") Capital = input() print("Процентная ставка: ") Percent = input() print("На какой срок ты вкладываешь деньги: ") Term = input() Например, цикл для расчета процентов и общего капитала может изменяться по мере его выполнения: Глава Азартная игра 4 86 while Term > 0 : Fee = Capital * Percent / 100 Capital = Capital + Fee Term = 1 Опять же, я для краткости использовал символы =, но на этот раз для обратного отсчета. Это важный момент, который очень легко упустить. Если вместо минуса будет плюс, тогда условие > 0 всег- да будет истинно, и программа завязнет (вновь) в бесконечном цикле. Я рекомендую не использовать цикл из прошлой версии программы. Поскольку срок нам уже известен и понятно, как часто этот цикл нужно будет повторить, ты можешь просто позволить компьютеру провести вычисления само- стоятельнно. Выглядеть это будет так: for Value in range(Term) : Fee = Capital * Percent / 100 Capital = Capital + Fee Совсем неплохо! И даже немного лаконичнее, чем писать целую конструкцию while. Ниже представлен полный ис- ходный код (⇒ million3.py): print("Какую сумму ты хочешь инвестировать: ") Capital = float(input()) print("Процентная ставка: ") Percent = float(input()) print("На какой срок ты вкладываешь деньги: ") Term = int(input()) for Value in range(Term) : Fee = Capital * Percent / 100 Capital = Capital + Fee print("Так ты получишь " + str(Capital) + " рублей") if Capital < 1000000 : print("Но так ты не станешь миллионером!") else : print("Добро пожаловать в Клуб миллионеров!") ¾ Измени код в соответствии с листингом и запусти про- грамму. Ты видишь, что за короткие сроки накапают неплохие проценты. Выиграть в лотерею? 87 Выиграть в лотерею? Конечно, также можно выиграть деньги в настоящую азарт- ную игру. Если ты действительно выиграешь, не так важно, что шансы проиграть в реальности были намного выше. В качестве примера возьмем одну лотерею, где 6 из 49 но- меров (шаров) выбираются случайным образом. Набросаем такой код программы-лотереи (⇒ lotto1.py) import random for Nr in range(6) : Case = random.randint(1,49) print("№ " + str(Nr+1) + " => " + str(Case)) И это все? И да, и нет. Потому что в случае проигрыша не только числа, выбранные компьютером, будут неправиль- ные, но может выйти и так, что числа сгенерируются дваж- ды (рис. 4.3). Рис. 4.3.Компьютер сгенерировал одни и те же числа несколько раз Чтобы узнать, генерировался ли уже один из номеров, компьютер должен запоминать числа, которые он сгене- рировал. Затем каждая новая попытка должна быть по от- дельности сопоставлена с прошлыми выпадениями чисел, и таким образом получится определить, есть ли это число в списке. Но как компьютер может запомнить 49 чисел? Довольно просто: мы составим ему список, который изначально пуст: Ball = [] Глава Азартная игра 4 88 Я выбрал имя Ball, так как в классической лотерее «Спорт- лото» происходит розыгрыш из контейнера с 49 пронуме- рованными шарами. Итак, сначала у нас есть 0 элементов. В цикле мы теперь добавляем 49 элементов к пустому списку: for Nr in range(1,50) : Ball.append(0) Это выполняется с помощью функции append(), для кото- рой указывается значение конкретного элемента в круглых скобках. Итак, у нас, наконец-то, есть 49 элементов списка, который я назвал Ball. И каждый элемент несет значение 0 , которое является для нас с тобой синонимом значения «еще не использовано». В функции range() второе число является верхним пределом, ко- торый не включен, поэтому используются элементы от 1 до 49. Во втором цикле, который ты уже знаешь из первой версии нашей лотереи, создается случайное значение: Case = random.randint(1,49) Но сначала ты должен проверить, не был ли этот шар уже выбран компьютером. Вот почему мы помещаем случайное число в конструкцию while: while Ball[Case] == 1 : Case = random.randint(1,49) Если номер уже был выбран компьютером и показан нам, то будет создано новое случайное значение. (Может потре- боваться немного времени на поиск компьютером «сво- бодного» номера.) Если это шар с номером [Case] == 0, то больше он не будет выпадать. Будет присвоено значение 1, говорящее, что шар «уже используется в игре». Ball[Case] = 1 Это предотвратит вытаскивание второго шара с тем же числом. Ниже представлен полный код данной программы (⇒ lotto2.py): Выиграть в лотерею? 89 import random Ball = [] # Все шары еще не "вытащены" for Nr in range(1,50) : Ball.append(0) Case = random.randint(1,49) # "Вытягивается" шесть шаров for Nr in range(6) : # поиск неиспользованных шаров while Ball[Case] == 1 : Case = random.randint(1,49) # Пометка использованного шара "вытащенным" Ball[Case] = 1 print("№ " + str(Nr+1) + " => " + str(Case)) То, что переменная Nr используется дважды для разных целей, не имеет значения. Но ты можешь выбрать два разных имени для этой переменной. Я хотел бы показать тебе еще один вариант, в котором ис- пользуется новый тип переменной (⇒ lotto3.py): import random Ball = [] # Все шары еще не "вытащены" for Nr in range(1,50) : Ball.append(False) Case = random.randint(1,49) # "Вытягивается" шесть шаров for Nr in range(6) : # поиск неиспользованных шаров while Ball[Case] : Case = random.randint(1,49) # Пометка использованного шара "вытащенным" Ball[Case] = True print("№ " + str(Nr+1) + " => " + str(Case)) Вместо 0 и 1 здесь у нас появляются значения False и True для списка Ball. Это так называемая логическая переменная. Она может принимать только одно из двух значений – ис- тина (True) или ложь (False): одно противоположно другому, поэтому операция присвоения, такая как ball = not ball, не- посредственно меняет значение переменной. Глава Азартная игра 4 90 Попробуй запустить такой код: Ball = True print(Ball) Ball = notBall print(Ball) Ты еще должен узнать про ключевое слово not, прежде чем логическая переменная изменит ее значение. Если внимательно рассмотришь код программы-лотереи со значениями True и False, то наверняка заметишь еще одно изменение. Вместо while Ball[Case] == True : у нас используется while Ball[Case] : Это связано с тем, что условие в конструкции (например, if или while) может быть только в одном из двух состояний: либо оно выполняется (= True), либо нет (= False). Поэтому мы можем опустить == True и использовать логическую пе- ременную непосредственно в качестве условия. Для полно- ты картины тебе также следует знать, что while Ball[Case] == False : можно заменить на while not Ball[Case] : Управление строками Сейчас мы в основном занимаемся числами, но нам бу- дет необходим также и текст. Ранее мы использовали его в виде строк. И хотя ты уже знаешь некоторые возможности использования текста в языке программирования Python, это еще не все. Я хотел бы закончить главу чем-то, не имеющим ничего общего с деньгами. Мне удалось найти подходящие пред- ложения: «А роза упала на лапу Азора» и «Аргентина манит негра» (оба предложения – палиндромы, или перевертыши, одинаково читающиеся в обоих направлениях). Управление строками 91 Давай проверим эти фразы в нашей программе (⇒ palin drom.py): print("Напиши короткий текст (небольшой, без пробелов): ") Text1 = input() Text2 = "" Chain = len(Text1) for Nr in range(0, Chain) : Text2 += Text1[Chain-Nr-1] print(Text2) if Text1 == Text2 : print ("Палиндром") Сначала компьютер попросит нас написать что-нибудь. Это необязательно должны быть только строчные буквы, да и пробелы, конечно, допускаются. Но если ты хочешь про- верить свой текст, лучше все-таки написать его последова- тельностью обычных строчных (маленьких) букв. С помощью функции input() ты вводишь свое предложение или слово. Попробуй ввести в этой программе одно из двух предложений, которые я упомянул выше. Кроме того, мы также определим вторую пустую строку. Тогда нам еще по- надобится длина набранной строки: Chain = len(Text1) Теперь мы используем цикл for, который «соответствует» каждой букве первого текста: for Nr in range(0, Chain) : Несмотря на то что отсчет начинается с самого начала, но- меру 1 соответствует последняя буква, затем идет предпо- следняя и т. д. добавляется к пустой второй строке: Text2 += Text1[Chain-Nr-1] Опять же, используются комбинации + и других знаков. Наконец, ты можешь увидеть обращенный текст. И так как фраза является палиндромом, компьютер сообщит об этом (рис. 4.4). print(Text2) if Text1 == Text2 : print ("Палиндром") |