Part I: Building Abstractions with Functions
代码组成(expression->statement->module)
任意一个python代码,均由statements组成(简单的statement, 比如import; 复合statement, 比如if, def, while, for),即:
- statement0
- statement1
- statement2
- …
实际上,大部分的代码都在evaluate the value of expression, 而这些值的关系通过statements组织在一起。
这里,引出两个概念: expression 和 statment
Expressions & Statements
Broadly, computer programs consist of instructions to either
- Compute(evaluate) some value: expressions typically describe computations
- primitive experssion: 3
- call experssion: max(3, 4)
- Carry out(execute) some action: statements typically describe actions: foo=3
- simple statement, such as '=/import'
- compound statement, such as 'if/def/for'
函数Function
函数提供了抽象,使得代码复用成为可能:
- 如果没有函数, 我们所有的代码都需要从程序语言支持的原始Operation(Primitive Operation)往上一层一层构建
- 如果没有函数,我们重用代码的途径就是Ctrl-C, Ctrl-V, 代码会变成一坨一坨的屎
函数需要区分定义(defined)和执行(executed, called):
- def语句定义一个函数,和赋值语句没有区别,只是bind了一个name到一个value (使得定义递归函数成为可能)
- 函数真正执行时(called), 会创建一个Local Frame, 这个Local Frame维护着该函数内部的变量
函数的引入,使得概念变为复杂:
- 函数作为一等公民(可以作为入参、出参,可以bound to name)
- 嵌套函数,使得(name -> value的维护,变得复杂)
嵌套函数引入前, 只需要两层的Enviroment维护name->value的关系
- one global frame
- multiple local frames
嵌套函数引入后,使得Enviroment由两层拓展至任意多层:
- global frame -> frame1 -> frame2 -> …
- variable name的查找,也一层一层往上查询,直至global frame
其他
- 高阶函数
- 递归函数
网友评论