Другой вывод Python для однострочного оператора if else - PullRequest
0 голосов
/ 21 сентября 2018

При создании игры Connect Four я столкнулся со странной проблемой в функции, называемой make_move, когда два эквивалентных оператора возврата ведут себя по-разному.

Единственная функция прямой зависимости - это put_piece(board, column, player), которая помещаетфигура игрока в самом нижнем пустом месте в данном столбце доски.put_piece возвращает кортеж из двух элементов: индекс строки, в которой фигура заканчивается (или -1, если столбец заполнен) и обновленная доска.Функция put_piece реализована правильно.

Функция make_move - это место, где возникают разногласия.Он успешно возвращает row (индекс строки, в которой находится фрагмент) и board (обновленная доска), если я реализую, используя обычную нотацию возврата if else, как показано здесь:

def make_move(board, max_rows, max_cols, col, player):
    """
    Put player's piece in column COL of the board, if it is a valid move.
    Return a tuple of two values:

        1. If the move is valid, make_move returns the index of the row the
        piece is placed in. Otherwise, it returns -1.
        2. The updated board
    """
    if 0 <= col < len(board[0]):
        return put_piece(board, max_rows, col, player)
    return -1, board

Вот как make_move должен возвращать:

>>> rows, columns = 2, 2
>>> board = create_board(rows, columns)
>>> row, board = make_move(board, rows, columns, 0, 'X')
>>> row
1
>>> board
[['-', '-'], ['X', '-']]

Однако, если я изменю make_move на

def make_move(board, max_rows, max_cols, col, player):
    """
    Put player's piece in column COL of the board, if it is a valid move.
    Return a tuple of two values:

        1. If the move is valid, make_move returns the index of the row the
        piece is placed in. Otherwise, it returns -1.
        2. The updated board
    """
    return put_piece(board, max_rows, col, player) if 0 <= col < len(board[0]) else -1, board

Оба возвращаемых значения будут назначены как кортеж на row,board просто переносит предыдущее значение.

>>> rows, columns = 2, 2
>>> board = create_board(rows, columns)
>>> row, board = make_move(board, rows, columns, 0, 'X')
>>> row
(1, [['-', '-'], ['X', '-']])
>>> board
[['-', '-'], ['-', '-']]

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

1 Ответ

0 голосов
/ 21 сентября 2018

Это связано с приоритетом.Запятая имеет довольно низкий приоритет, поэтому

put_piece(board, max_rows, col, player) if 0 <= col < len(board[0]) else -1, board

эквивалентно

((put_piece(board, max_rows, col, player) if 0 <= col < len(board[0]) else -1), board)

Но вы действительно хотите

put_piece(board, max_rows, col, player) if 0 <= col < len(board[0]) else (-1, board)
...