赋值是一种简单的抽象方法:将名称与值绑定在一起。
函数定义是一种更强大的抽象手段:将名称与表达式绑定在一起。
1. 定义函数(使用def语句)
def <name>(形参):
return <返回表达式>
- 函数签名表示函数接受多少个参数。
- 函数体定义了当前函数被调用时所执行的计算。
def语句的执行过程:
- 创建一个签名为 <name>(<形式参数>) 的函数。
- 设置该函数的主体,即第一行后缩进的所有内容。(主体在调用函数之前不会真正执行)
- 将<name>绑定到在环境的当前框架中创建的新函数。
2. 调用函数
调用用户定义函数的过程:
- 添加一个本地框架,形成一个新环境。
- 将函数的形参绑定到该框架中的参数。
- 在新环境中执行函数的主体。
函数的签名包含了我们在这里构建的本地框架所需的所有信息
- square:命名本地框架
- x:绑定到参数值的名称
3. 在环境中查找名称
每个表达式都是在环境中进行评估的。
到目前为止,当前环境要么是
- 全局框架,或
- 局部框架,然后是全局框架。
(环境图中的一个框,环境是这些框的序列)
总结:
- 环境是一系列框架。框架是名称和值之间的绑定。
- 名称的计算结果为:在该名称所在当前环境的最早框架中,绑定到该名称的值。
如果一个环境由一系列框架组成,并且想查找名称在该环境中的含义,应依次检查每个框架
例如,在square函数的主体中查找某个名称:
- 先在本地框架中查找该名称。
- 如果未找到,则在全局框架中查找,因为那是环境中的下一个框架。
(内置名称(如 "max")也在全局框架中,我们只是不显示它们)
示例: