cs61a学习笔记 高阶函数实例

今天在做cs61a的Hog项目时,遇到了高阶函数实例,花了一番心思研究,将遇到的问题和其分析列举下来:
在pythontutor上运行了几十遍,一步一步看,终于理清楚代码运行方式。
高阶函数 例1
困惑点
困惑点描述:return announce_lead_changes(leader)
1.当say函数执行到return时,就会调用ann函数并生成新的函数框架f3,再次返回say(此时的say与之前不同,在f3框架下)。
2.return结果赋值给f1
3.当下一行调用f1 时,执行f3 框架下的 say 函数。

高阶函数 例2

def say_scores(score0, score1):
    """输出两玩家分别得分"""
    print("Player 0 now has", score0, "and Player 1 now has", score1)
    return say_scores
def announce_lead_changes(prev_leader=None):
 """输出两玩家分数差"""
    def say1(score0, score1):
        if score0 > score1:
            leader = 0
        elif score1 > score0:
            leader = 1
        else:
            leader = None
        if leader != None and leader != prev_leader:
            print('Player', leader, 'takes the lead by', abs(score0 - score1))
        return announce_lead_changes(leader)
    return say1
def both(f, g):
    def say2(score0, score1):
        return both(f(score0, score1), g(score0, score1))
    return say2
h0 = both(say_scores, announce_lead_changes())
h1 = h0(10, 0)
h2 = h1(10, 6)
''' 执行结果:
    >>> h0 = both(say_scores, announce_lead_changes())
    >>> h1 = h0(10, 0)
    Player 0 now has 10 and Player 1 now has 0
    Player 0 takes the lead by 10
    >>> h2 = h1(10, 6)
    Player 0 now has 10 and Player 1 now has 6'''

困惑点1
困惑点2:h0 = both(say_scores, announce_lead_changes())
1.python 根据实参自动识别形参的类型,上条语句中,实参1是函数类型,而实参2是ann这个函数值(目前不能确定类型)
2.当执行到这一条语句时,先调用执行ann f1这个函数
3.执行完毕返回值是say1这个函数,即形参g指向say1(注意say1函数在f1框架内,是局部量)
4.得到实参2的返回值后,再执行both f2函数(此时可以判断两个实参都是函数类型,但一个为全局量,一个为局部量,即图中f和g)
5.此行代码执行完毕,both返回值为嵌套函数say2

最终结果:h0=say2(say2定义在f2框架内)

困惑点2
困惑点3: h1 = h0(10, 0)
1.调用h0(即both内部的say2函数)
2执行say2 f3函数,return both(f(score0, score1), g(score0, score1))
3.score0, score1 是 f3 框架内局部变量,因此此语句同为
return both(f(10,0), g(10,0))
将这条语句分为三部分
第一部分:
f(10,0)
1.1 f在both 框架内,指向全局函数say_scores(由前一条语句而来)
1.2 调用say_scores(10,0)f4(全局函数)
1.3执行print后,返回 仍是 say_scores函数(global 框架内)
1.4 f(10,0)执行结果:输出各玩家得分并将say_scores函数返回
第二部分:
g(10,0)
2.1 g 在f1框架内,指向局部函数say1,
2.2调用say1(10,0) f5
2.3执行print后,返回是函数值announce_lead_changes(leader)
2.4 g(10,0)执行结果:输出两玩家分数差并将announce_lead_changes(leader)返回
第三部分:
both(f(10,0), g(10,0))
3.1 调用both函数,此时:both(say_scores,announce_lead_changes(leader))
3.2 仍然先执行announce_lead_changes(leader) f6,返回say1(属于ann,即f6框架内)
3.3 both(say_scores,say1) 再走一遍both f7,返回say2(f7框架下)

最终结果h1=say2,中间打印两行文字(say2定义在f7内)

结论:
上述两例可以看出,嵌套函数可实现:
1.实现函数的连续套用
如例一中 announce_lead_changes函数的调用方法。
2.新调用的函数可执行多项功能
如例二中 both 函数,正确调用both函数,完成通过一次调用,实现两个功能。

发布了2 篇原创文章 · 获赞 1 · 访问量 100

猜你喜欢

转载自blog.csdn.net/weixin_44297861/article/details/104445264