Как фильтровать переменные через несколько условных выражений - PullRequest
0 голосов
/ 01 января 2019

Я пишу код, который присваивает звание бразильским игрокам джиу-джитсу.Формула ранжирования заимствована из шахмат (метод ELO Rating), но для корректного отражения BJJ необходимо внести некоторые коррективы.У меня есть три условные функции, через которые должна проходить оценка, чтобы она корректно обновлялась:

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

def Weight_Age_Rank_Dif():
    """this functions checks for a certain weight, age AND rank difference 
    between two players. 
    (it will kick in if the difference is bigger than 10 kilos, 15 years, 
    AND 100 rating points; so think of it as a smaller, less experienced 
    older guy fighting a bigger, more experienced and much younger 
    opponent)."""

def Weight_Dif():
    """this function checks for a weight difference only (10 or more kilos 
    between opponents)"""

def Age_Dif():
    """this function checks for an age difference only (10 or more years between 
    two players AND at least one player over 50; so it would have no effect 
    between two guys who were 22 and 34)."""

# PRINT RESULTS

Идея этих функций заключается в том, чтобы обеспечить амортизаторам (меньшим, менее опытным или значительно более старшим ребятам).Если они выигрывают, они выигрывают больше очков, а если они проигрывают, они теряют меньше.

Мой вопрос: как мы можем убедиться, что выполняется только ОДНА из функций?Итак, если два игрока выполнили все условия для первой функции, то как мы можем быть уверены, что код переходит непосредственно к # PRINT RESULTS, не касаясь двух других?

Кроме того, каждая функция имеет несколько условных операторов.Например, в функции Weight_Age_Rank_Dif() есть 8 условных операторов.Когда выполняется одно из этих условий, как мы можем заставить код выйти из функции, пропустить две другие функции и перейти непосредственно к # PRINT RESULTS?

Я попытался превратить весь сценарий в один гигантский условный оператор с кучей elif операторов, но он не работает, потому что вложенные условные выражения в elif операторах выдают UnboundLocalError, и он кажется неэффективнымкаждый раз вводить глобальную переменную.

1 Ответ

0 голосов
/ 01 января 2019

Вы хотите поместить свои условия в некую структуру, например, в словарь или класс.Затем проверьте каждое условие по порядку в цикле, и, если один из них соответствует, выполните функцию настройки, которую они «защищают», и затем выйдите из цикла.

Например, вы также можете поместить условия в функции.Функции в Python - это просто больше объектов, вы можете поместить объект функции в список так же, как вы можете поместить другие объекты в список.Список - это хорошая структура, потому что списки упорядочены , так что вы можете упорядочить условия.

Другой вариант - просто оставить тестирование условий для функции и проверить, изменился ли счет,Если оценка ELO изменилась, пропустите другие функции, если нет, продолжите.Сначала я бы поместил функции в список:

# list of score adjustment functions. Note that they are *not being called*,
# the function objects themselves are referenced here, not what they produce.
adjust_elo_score_functions = [Weight_Age_Rank_Dif, Weight_Dif, Age_Dif]

for adjustment_function in adjust_elo_score_functions:
    new_elo_score = adjustment_function(elo_score)
    if new_elo_score != elo_score:
        # score was adjusted, stop adjusting further
        elo_score = new_elo_score
        break

# PRINT RESULTS
...