[英]Python 3 Passing a Function into Another Function
我对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)
但是我不确定如何实际实施它,以便它可以识别谁在先玩。
预先感谢您的帮助!
编辑:
这是我的贪婪和放大功能:
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
这不是您问题的直接答案(因为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)
。 还要注意它如何扩展到任意数量的玩家,尽管这实际上可能对您没有用。 :)
您将需要稍微重写game
功能。 请注意,您的game
函数接受P1
和P2
,但是您不对其执行任何操作-您立即为它们两个都分配了0
。
解决此问题的正确方法是让您的game
功能接受两种策略 ,可以是greedy
或zoomin
,或者稍后您可能会想到的其他任何方法。
def game(strategy1, strategy2, board):
您还需要用对传递到您函数中的策略的调用代替对函数体中对greedy
和zoomin
的显式调用(例如move = greedy(board)
),例如move = strategy1(board)
。
然后,为了让greedy
首先播放,然后让zoomin
播放第二,您可以调用:
game(greedy, zoomin, board)
或者,如果您想zoomin
然后再greedy
,则可以致电:
game(zoomin, greedy, board)
如您所见,游戏的顺序由您将两种策略传递到函数中的顺序确定。 让我知道是否需要澄清。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.