@Iceforest

Как уйти от глобальной переменной?

преподаватель просит уйти от использования в коде функций global, но уйти от них не получается, иначе неправильно подсчитывается кол-во очков
рабочий код с глобалом такой

def get_score(analized_res):
    global total# TODO от глобальных переменных стоит отказываться в пользу параметров
    # TODO так проще контролировать содержимое переменной
    total = 0
    count = 0
    frames = 0
    for frame, result_frame in (analized_res.items()):
        frames += 1
        count += 1
        check_errors(result_frame)
        game_result(result_frame)
        print(f'Фрейм {count} результат {result_frame}')
        print(f'кол-во очкoв {total}')
    if frames != 10:
        raise Exception('Неправильное количество фреймов!')
    return total


def game_result(result_frame):
    global total  # TODO тут тоже не стоит использовать глобал
    # TODO в целом старайтесь избегать этого оператора
    # TODO а необходимые данные в функцию передавайте через параметры
    if 'X' in result_frame:
        total += 20
    elif '/' in result_frame:
        total += 15
    elif '-' in result_frame:
        total += 0
    else:
        total += int(result_frame[0]) + int(result_frame[1])

    return result_frame,total


def check_errors(result_frame):
    if '0' in result_frame:
        raise ValueError('Введено неправильное значение')
    elif '/' in result_frame[0]:
        raise ValueError('Spare на первом броске')
    elif 'X' in result_frame[1]:
        raise ValueError('Strike на втором броске')
    if result_frame[0].isdigit() and result_frame[1].isdigit() and int(result_frame[0]) + int(result_frame[1]) >= 10:
        raise ValueError('Введено неправильное значение, сумма одного фрейма больше 9 очков')
  • Вопрос задан
  • 161 просмотр
Решения вопроса 1
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
Глобальный total тут вообще не нужен:
def game_result(result_frame):
    if 'X' in result_frame:
        return 20
    elif '/' in result_frame:
        return 15
    elif '-' in result_frame:
        return 0
    return int(result_frame[0]) + int(result_frame[1])

def get_score(analized_res):
    total, count, frames = 0, 0, 0
    for frame, result_frame in (analized_res.items()):
        frames += 1
        count += 1
        check_errors(result_frame)
        total += game_result(result_frame)
        print(f'Фрейм {count} результат {result_frame}')
        print(f'кол-во очкoв {total}')
    if frames != 10:
        raise Exception('Неправильное количество фреймов!')
    return total
...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы