Python高阶函数指的是可以接受其他函数作为参数或返回一个函数作为结果的函数。在Python中,函数是一等公民,可以像任何其他对象一样被传递、操作和引用。因此,高阶函数可以使用其他函数作为参数或返回值,从而使代码更加简洁、可读和灵活。
这个问题要求你实现一个名为announce_highest的高阶函数,该函数返回一个评论函数。这个评论函数在某个玩家在一轮中的得分高于其历史最高分时,会宣布这个消息。参数who用于指定玩家编号,例如who=1表示只宣布玩家1的消息。此函数需要比较上一轮结束时的该玩家得分(last_score)和本轮该玩家的得分,以计算本轮该玩家的得分增量。同时,该函数需要记录该玩家历史最高得分增量,存储在running_high变量中。
具体而言,当该玩家在本轮比赛中获得的分数高于他以前获得的任何一轮得分时,评论函数将输出格式为“Player [who] has a new high score of [score]”,并将score设置为新得分与历史最高得分之差。如果没有达到历史最高分,则评论函数输出“Player [who] has [points] points”,points表示本轮得分。
实现该函数时,可以参考给出的announce_lead_changes函数,这个函数是如何使用评论函数来记录信息的。在代码实现时,需要考虑多种情况,比如当某个玩家在一轮中得分高于他以前的得分最高值时,需要更新running_high变量;同时,为了能够记录上一轮结束时的得分,可以使用函数返回值来保存评论函数,在每轮比赛结束时,需要调用上一轮的评论函数,并将新的评论函数返回。
直接来看代码
def announce_highest(who, last_score=0, running_high=0):
"""Return a commentary function that announces when WHO's score
increases by more than ever before in the game.
# >>> f0 = announce_highest(1) # Only announce Player 1 score gains
# >>> f1 = f0(12, 0)
# >>> f2 = f1(12, 9)
# 9 point(s)! That's a record gain for Player 1!
# >>> f3 = f2(20, 9)
# >>> f4 = f3(20, 30)
# 21 point(s)! That's a record gain for Player 1!
# >>> f5 = f4(20, 47) # Player 1 gets 17 points; not enough for a new high
# >>> f6 = f5(21, 47)
# >>> f7 = f6(21, 77)
30 point(s)! That's a record gain for Player 1!
"""
assert who == 0 or who == 1, 'The who argument should indicate a player.'
# BEGIN PROBLEM 7
"*** YOUR CODE HERE ***"
# END PROBLEM 7
def func(score0,score1):
score=score0 if who==0 else score1
running_num=score-last_score
if running_num>running_high:
running_highest=running_num
print(f"Player ${who} has a new high score of ${running_highest}")
else:
running_highest=running_high
print(f"Player ${who} has ${score} points")
return announce_highest(who,score,running_highest)
return func
题目要求的返回新的评论函数,就是说这个函数的代码实现和旧评论函数一样,只是传入的参数不一样,那应该怎么实现呢?
我们在announce_highest函数内部定义一个函数func,这个函数的返回值是func函数(注意返回的是函数而不是函数的调用),他接受两个玩家的分数score0和score1,并根据变量who来判断应该用哪一个,之后函数计算出要传入下一次调用announce_highest函数(新的评论函数)时要传入的参数值,然后func函数返回调用announce_highest函数得到的返回值,也就是新的func函数,这个新的func函数用新的参数值再次计算出传入下一次announce_highest函数的参数值并返回他的调用。那么我们每次调用func,返回的就是一个新的func。