CS61A学习笔记
1.Funcation
global frame and local feame
声明函数时会将函数的定义放在global frame(全局帧),而在调用时会新建一个local frame,在local frame中调用变量/函数时会优先从local frame中查找进而去global frame中查找,因此local frame followed global frame。
Environment Diagrams
print and None
None代表没有返回任何值,函数没有指定返回值将会返回None;None不会被解释器展示
None与其他类型运算会抛出类型错误
pure/non-pure functions
一些函数(如print)不会返回值(返回None)但是会产生side effect,在调用这个函数时会产生
看完下一节回来尝试习题https://insideempire.github.io/CS61A-Website-Archive/lab/lab01/index.html
2.Control
Multiple Environment in one diagram
这里有三个不同的frame,两个局部frame followed the全局frame;调用的函数与被调用的函数主体在不同的frame中
变量名被赋值取决于当前环境最近(从局部frame找到全局frame)的frame里的值,因此可以使形参与函数名相同。
Some Python features
truediv and floordiv
真除法和整除
documents string
书写文档字符串以告诉别人这个函数在做什么,且可以配合-v测试代码(也称文档测试);习惯上形参用大写字母开头
conditional statement

一个if,0-more个elif,0-1个else
Iteration
迭代
3.Higher-Order Functions
Control
纯函数编程思想,自己实现if函数
传入的参数如果是表达式会在使用前统一计算,而控制语句会选择执行语句的哪些部分和跳过哪些部分,因此他们在语言中并不仅仅是函数。
Control Expressions
Logical Operators
2 and 3 —> 3
def has_big_sqrt(x)
return x > 0 and sqrt(x) > 10
可以有效避免遇到x<0时程序的崩溃
def reasonable(n):
return n == 0 or 1/n !=0
Higher Order Functions
from math import pi,sqrt
def area_square(r):
assert r > 0, 'A length must be postitive'
return r*r
assert断言如果前数为假,报错并输出后字符串
统一化思想
Example
接受另一个函数作为参数的函数称为高阶函数
通过额外的括号来传入内部帧的函数的参数,原理是先评估前半部分得出结果是一个函数,如下图
作用,统一方法,移除重复的部分,分散函数功能
lambda 特性
- lambda 函数是匿名的: 所谓匿名函数,通俗地说就是没有名字的函数。lambda函数没有名字。
- lambda 函数有输入和输出: 输入是传入到参数列表argument_list的值,输出是根据表达式expression计算得到的值。
- lambda 函数拥有自己的命名空间: 不能访问自己参数列表之外或全局命名空间里的参数,只能完成非常简单的功能。
常见的lambda函数示例:
lambda x, y: x*y # 函数输入是x和y,输出是它们的积x*y
lambda:None # 函数没有输入参数,输出是None
lambda *args: sum(args) # 输入是任意个数参数,输出是它们的和(隐性要求输入参数必须能进行算术运算)
lambda **kwargs: 1 # 输入是任意键值对参数,输出是1
Environments for higher-order functions
高阶函数是以一个函数作为参数的函数
env foe nested definitions
尽管在全局帧调用了f1里定义的函数,但是此函数的父环境在被定义的时候就确定了为f1(即被定义时的环境),因此adder中的n会优先从f1中获取。
如何绘制一个环境图
Local Name
f和g两个函数的父帧都是全局帧,所以y是f的本地变量,g无法直接访问。
与上一个例子相反,这里的k是nested(嵌套)的,因此可以正常使用。
Function Composition
更加复杂的符合高阶函数
Lambda Expressions
[返回上文](#lambda 特性)
Lambda Expressions Versus Def Statements
在lambda创建并复制后,lambda函数才被赋予名称。
Function Currying
把接收多参的函数转化成可以逐个调用单个参数并返回接收剩下参数的函数称为柯里化