Python 3将函数传递给另一个函数

时间:2014-02-12 22:34:03

标签: python

我对Python有些新手,这是一个功课问题,所以我不会感谢任何答案,只是建议帮助我理解。我正在编写一个游戏程序,它可以相互演绎两种不同的策略 - 贪婪策略和放大策略,我已将其作为函数编写。我有一个游戏功能需要通过我的贪婪和放大功能,以及游戏板。我需要能够先将战略功能放在首位。到目前为止,我只能把它放到我贪婪策略的第一位。

def game(P1,P2,board):
    P1 = 0
    P2 = 0 
    for x in range(len(board)):
        if x%2 == 0:
           move = greedy(board)
           P1 += board[move]
           board.remove(board[move])
        else:
            move = zoomin(board)
            P2 += board[move]
            board.remove(board[move])
    if P1 > P2:
        return 1
    elif P1 == P2:
        return 0.5
    else:
        return 0

这个策略总是假设P1是贪婪的功能,但我需要能够先玩。我以为我可以传递函数,所以我的调用将是

game(greedy,zoomin,board)

但我不确定如何实际实现它,以便它可以识别谁在先玩。

提前感谢您的帮助!

编辑:

以下是我的贪婪和zoomin功能:

def greedy(board):
    if board[0] > board[len(board)-1]:
        #returns position of first item
        return 0
    elif board[len(board)-1] > board[0]:
        #returns position of last item
        return len(board)-1
    else:
        #if board[-1] == board[0]
        return 0

def zoomin(board):
    if len(board)%2 == 0:
        evens = 0
        odds = 0
        for x in range(len(board)):
            if x%2 ==0:
                evens += board[x]
            else:
                odds += board[x]
        if evens > odds:
            return 0
        else:
            return len(board)-1
    else:
        #choose the larger value (greedy)
        if board[0] < board[len(board)-1]:
            return len(board)-1
        else:
            return 0

2 个答案:

答案 0 :(得分:4)

这不是你问题的直接答案(因为senshin已经回答了),但我想指出你可以通过使用数组来减少代码重复。例如,像这样:

def game(players, board):
    scores = [0] * len(players)
    while i in range(len(board))
        p = i % len(players)
        move = players[p](board)
        scores[p] += board[move]
        del board[move]    # <-- This is also a faster and more fail-safe version of your "board.remove(board[move])"
    return scores

然后,您可以将此功能称为game([greedy, zoomin], board)。还要注意它是如何扩展到任意数量的玩家,尽管这可能对你没有用。 :)

答案 1 :(得分:2)

您需要稍微重写game功能。请注意,您的game函数接受P1P2,但您没有对它们执行任何操作 - 您会立即将0分配给它们。

解决此问题的正确方法是让game函数接受两个策略,可以是greedyzoomin,也可以是其他任何后来提出来。

def game(strategy1, strategy2, board):

您还需要将函数体中的greedyzoomin的显式调用替换为(例如move = greedy(board)),并调用传递给函数的策略 - 例如{ {1}}。

然后,为了让move = strategy1(board)先播放,greedy播放第二,您可以致电:

zoomin

或者如果你想先game(greedy, zoomin, board) zoomin秒,你可以打电话:

greedy

正如您所看到的,游戏顺序取决于您将两种策略传递到函数中的顺序。如果需要澄清,请告诉我。