Есть ли способ уменьшить количество операторов if? - PullRequest
1 голос
/ 22 мая 2019

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

def ai_player(self, state, team = 1): 
    new_shape_x = np.asarray(state[1]).shape
    player1 = Minimax(n = new_shape_x, default_team = team)
    if team == -1:
        state = player1.convert_board_state(state)
    best_move = player1.decision_maker(state)
    chosen_succ, utility = best_move
    if team == -1:
        chosen_succ = player1.convert_board_state(chosen_succ)
    return chosen_succ

Нет ошибок, он работает нормально с дополнительными кодами строк.

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Вы можете отделить логику от team == -1 от логики, которая происходит, когда team != -1:

def ai_player(self, state, team = 1): 
    new_shape_x = np.asarray(state[1]).shape
    player1 = Minimax(n = new_shape_x, default_team = team)

    if team == -1:
        state = player1.convert_board_state(state)
        best_move = player1.decision_maker(state)
        chosen_succ, utility = best_move
        chosen_succ = player1.convert_board_state(chosen_succ)
    else:
        best_move = player1.decision_maker(state)
        chosen_succ, utility = best_move

    return chosen_succ

Хотя будет повторение кода.

В этом случаеВы также можете превратить две повторяющиеся строки в одну, давая понять, что эта часть кода является повторяющейся частью:

def ai_player(self, state, team = 1): 
    new_shape_x = np.asarray(state[1]).shape
    player1 = Minimax(n = new_shape_x, default_team = team)

    if team == -1:
        state = player1.convert_board_state(state)
        chosen_succ, utility = player1.decision_maker(state)
        chosen_succ = player1.convert_board_state(chosen_succ)
    else:
        chosen_succ, utility = player1.decision_maker(state)

    return chosen_succ

Теперь переменная best_move исчезла.Если вы все еще хотите сказать, что выбираете лучший ход, вы можете переименовать метод decision_maker в что-то вроде choose_best_move:

def ai_player(self, state, team = 1): 
    new_shape_x = np.asarray(state[1]).shape
    player1 = Minimax(n = new_shape_x, default_team = team)

    if team == -1:
        state = player1.convert_board_state(state)
        chosen_succ, utility = player1.choose_best_move(state)
        chosen_succ = player1.convert_board_state(chosen_succ)
    else:
        chosen_succ, utility = player1.choose_best_move(state)

    return chosen_succ

И вот оно!

1 голос
/ 22 мая 2019

Что не так с этими прекрасно читаемыми операторами if?

Как не совсем серьезный вариант, вы можете заменить любой, если с поиском dict:

# ...
options = {
    False: lambda: None
    True: lambda: player1.convert_board_state(state)
}
options[team==-1]()
# ...

Чтобы сделать его еще более лаконичным (то есть неясным), вы также можете использовать список. Индексирование с помощью False дает элемент 0, а с помощью True дает элемент 1:

# ...
[
    lambda: None,
    lambda: player1.convert_board_state(state)
][team==-1]()
# ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...