体验高阶函数的灵活运用,题目选自CS61A 2021 hog Problem 7

文章描述了一个Python编程问题,要求实现一个名为announce_highest的高阶函数,该函数接受玩家编号、上一轮得分和历史最高得分增量作为参数,返回一个评论函数。当玩家得分超过历史最高分时,评论函数会宣布新的最高分。函数需要考虑如何记录和更新历史最高得分增量,并在得分未创新高时提供相应反馈。实现过程中,需要利用函数作为返回值和参数,以实现动态维护玩家得分信息。
摘要由CSDN通过智能技术生成

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。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

idMiFeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值