提示:本文内容来源于UCB CS61A课程,详情请点击CS 61A: Structure and Interpretation of Computer Programs
文章目录
前言
本文为UCB CS61a 课程 Dicussion02内容
以下是本篇文章正文内容,叙述部分参考Disc 02: Higher-Order Functions,由本人与chatgpt共同翻译,作业部分为作者完成,仅供参考,若有错误欢迎评论指正
CS61a Disc02
Lambda expressions
lambda表达式通过求值可以得到一个函数,该函数叫做lambda函数
如,lambda y: x + y
就是一个lambda表达式,该表达式可以读作:
一个函数,该函数接受一个参数y
,返回了x + y
表达式本身会被求值为一个函数,但不会被绑定到一个变量名上
与def语句定义函数类似,lambda函数的返回表达式(冒号右边的部分)直到lambda函数被调用时才会被求值(恰似def定义的函数直到调用时才会执行其函数体)
>>> what = lambda x : x + 5
>>> what
<function <lambda> at 0xf3f490>
与def语句不同,lambda表达式即可作为操作符也可以作为操作数(因为其是一个会被求值为函数的单行表达式)
>>> (lambda y: y + 5)(4)
9
>>> (lambda f, x: f(x))(lambda y: y + 1, 10)
11
柯里化 Curring
柯里化是高阶函数的一个重要应用,其可以将一个多参数函数转换为一系列接受单个参数的函数
如以下函数将pow
函数转换为它的柯里化形式
>>> def curried_pow(x):
... def h(y):
... return pow(x, y)
... return h
>>> curried_pow(2)(3) # curried_pow(底数)(质数)
8
>>> two_s_power = curried_pow(2) # 相当于y = 2 ^ x,当该方程被大量需要时,将其柯里化可以避免在pow中不断传入参数2
>>> two_s_power(3)
8
环境图中的高阶函数
环境图可以跟踪所有已定义的变量及其绑定的值。这些值不一定仅限于整数和字符串。环境图还可以模拟使用高阶函数的复杂程序
lambda函数在环境图中的表示于函数类似,但由于没有固定的名称,因此用符号λ表示
func <函数名>(参数) [parent=定义该函数的父环境]
func λ(参数) <line lambda表达式所在行的行号> [parent=lambda表达式所在的父环境]
任何函数(包括 lambda 表达式)的父环境始终是定义该函数的帧。在环境图中需要包含函数的父环境信息,以便查找当前帧中未定义的变量。
Question
1.1 和 1.2
1.1要求画出给出代码块的环境图,此处不作答,有需求者复制代码到pythontutor查看
def