Главная страница
Навигация по странице:

  • Глава Азартная игра4

  • Глава Азартная игра4 82Квадратные скобки ты можешь ввести, если переключишься на клавиатуре на английскую раскладку и нажмешь клавиши Х и Ъ

  • Шуман Х. - Python для детей - 2019. # Startwerte festlegen Red (255,0,0)


    Скачать 5.95 Mb.
    Название# Startwerte festlegen Red (255,0,0)
    Дата10.03.2023
    Размер5.95 Mb.
    Формат файлаpdf
    Имя файлаШуман Х. - Python для детей - 2019.pdf
    ТипДокументы
    #977830
    страница6 из 22
    1   2   3   4   5   6   7   8   9   ...   22
    Глава
    Азартная игра
    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 ("Палиндром")

    1   2   3   4   5   6   7   8   9   ...   22


    написать администратору сайта