Решения для бананов

Этот код создает проблему для пользователя для решения (очень простая проблема), после чего он проверяет, правильно ли он прав и скажет.

import random
import time
def mathsquestion():

    attempts=2
    bananas1 = random.randrange(1,40)
    bananas2 = random.randrange(30,70)
    print('lucy has', bananas1,' bananas and tracy has', bananas2,' if both of them put their bananas together and split them evenly')
    question = float(input('how many bananas do each of them get?'))


    if question == (bananas1+bananas2)/2:
        print ('correct')
        restart=input('want to try again')
        if restart == ('yes'):
            mathsquestion()

    else:
        print('wrong')
        attempts-=1
        print('you have',attempts,'attempts remaining')
        question2 = float(input('how many bananas do each of them get?'))
        if question2 == (bananas1+bananas2)/2:
            print('yay finally')
            restart=input('want to try again')
            if restart == ('yes'):
                mathsquestion()

        else:
            print('wrong')
        attempts-=1
        print('you have',attempts,'attempts remaining')
        print('shutting down')

    if attempts == 0:
        time.sleep(3)
        quit()

mathsquestion()
11 голосов | спросил J.Fitz 26 J0000006Europe/Moscow 2016, 19:06:16

1 ответ


18

Общая обратная связь

Хорошо, что совершенно ясно, что делает ваш код. У вас по большей части четкие имена переменных и не слишком много беспорядка. Однако я бы изменил bananas1 на lucys_bananas и bananas2 до tracys_bananas.

Кажется, вы знакомы с другим языком программирования. Python имеет руководство по стилю PEP 8 , которое объясняет в мучительной детали, как структурировать ваш код. Я всем сердцем рекомендую проскальзывать через него и следовать ему.

Вы пишете attempts = 3, однако, согласно PEP 8, рекомендуется использовать CAPITALIZED_WITH_UNDERSCORES для констант, UpperCamelCase для имен классов и lowercase_separated_by_underscores для других имен.

Обработка ошибок Logic

Первое, что пришло в голову, было

question = float(input('how many bananas do each of them get?'))

Я думаю, вы подумали, что было бы неплохо задать вопрос в float, поскольку (bananas1+bananas2)/2 создает float. Идея хороша, но что произойдет, если я угадаю что-то, что не является плавающей? Вся ваша программа сработает! Хороший способ избежать этого - поймать ошибку, прежде чем это произойдет.

question = input('how many bananas do each of them get?')
try:
    question = float(question)
except:
    print('Error, number of bananas must be an integer')
    continue 

Как ваш код в настоящее время настроен, это не совсем работает. Однако мы можем внести еще несколько изменений. Получение половины бананов и необходимость работать с поплавками, когда бананы являются целыми числами, по-моему, странно странно. Однако можно убедиться, что количество бананов всегда равномерно делится. Если у Люси странное число, то у Трейси должно быть нечетное количество бананов. Точно так же, если у Люси есть четное число, тогда у Трейси должно быть четное количество бананов. Так как \ $ (2L + 1) + (2T + 1) = 2 (T + L + 1) \ $ и \ $ 2L + 2T = 2 (T + L) \ $. Это можно закодировать следующим образом.

    lucy_bananas = get_bananas(1, 40)
    even_lucy_bananas = lucy_bananas % 2
    tracy_bananas = get_bananas(30+even_lucy_bananas, 70+even_lucy_bananas, 2)

Чтобы переключить поведение, мы можем поместить создание случайных величин в новую функцию. Пересмотренный код ниже

Следующая часть странная и не очень питоновая.

if attempts == 0:
    time.sleep(3)
    quit()

Какова цель time.sleep(3)? Также quit() - это то, что вам никогда не придется использовать. Стандарт return, однако лучшим решением является обертывание всей функции в цикле while. Таким образом, он может завершиться один раз, когда attempts достигнет нуля.

Дополнительные советы и изменения

Что делает ваша функция, но ясно, что вы разделите ее на более мелкие части. Хорошей практикой является то, что каждая функция имеет одну цель, так как она стоит на вашей основной функции, это слишком много.

  1. Необязательный импорт time не обязательно
  2. Вам не нужно импортировать всю библиотеку random, вы используете только одну функцию.
  3. Вы должны использовать if __name__ == "__main__": в вашем ответе.
  4. Дублирование кода, который вы пишете question2 = float(input('how many bananas do each of them get?')) более одного раза.
  5. Выше это не вопрос? Лучшее имя будет answer
  6. Обработка ошибок, вы конвертируете answer в float, что, если это вызывает ошибку? У вас нет способа обнаружить это.
  7. mathsquestion() не должен вызывать себя, вы должны оставить это в main.
  8. Создание случайных переменных должно быть помещено в отдельную функцию
  9. Четкие имена переменных хороши, но вы должны также включить краткое объяснение того, что делает ваш код. Это делается с помощью docstrings
  10. Печать может быть улучшена с помощью pythons удивительные возможности форматирования

Я улучшил первые несколько пунктов в приведенном ниже коде. Я оставлю остальное вам.

from random import randrange

MAX_ATTEMPTS = 3
LUCY_MIN_BANANA = 1
LUCY_MAX_BANANA = 40
STACY_MIN_BANANA = 30
STACY_MAX_BANANA = 70
EVEN_BANANAS = True

def get_bananas():
    lucy_bananas = randrange(LUCY_MIN_BANANA, LUCY_MAX_BANANA)
    if EVEN_BANANAS:
        offset = lucy_bananas % 2
        step = 2
    else:
        offset = 0
        step = 1      
    tracy_bananas = randrange(STACY_MIN_BANANA+offset, STACY_MAX_BANANA-offset, step)
    return lucy_bananas, tracy_bananas


def mathsquestion():

    lucy_bananas, tracy_bananas = get_bananas()
    bananas_evenly_divided = float(lucy_bananas+tracy_bananas)/2

    print('lucy has', lucy_bananas, ' bananas and tracy has', tracy_bananas,
          ' if both of them put their bananas together and split them evenly')
    print('how many bananas do each of them get?')

    attempts = MAX_ATTEMPTS
    while attempts > 0:

        answer = input('answer: ')
        try:
            answer = float(answer)
        except:
            print('Error, the number of bananas must be an integer')
            continue

        if answer == bananas_evenly_divided:
            return True
        print('attempts remaining: ', attempts-1)
        attempts -= 1
    return False


def main():
    want_to_play = True
    while want_to_play:
        guess_correct = mathsquestion()
        if guess_correct == True:
            print('Congratulations!)')
        else:
            print('Better luck next time!')
        restart = input('want to try again? [y/n]: ').lower()
        if restart not in ['yes', 'y']:
            want_to_play = False


if __name__ == '__main__':

    main()
ответил N3buchadnezzar 26 J0000006Europe/Moscow 2016, 20:26:09

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132