表达式(Expression)与函数(Function)的正式区别是什么?附Scheme/Python示例
表达式(Expression)和函数(Function)的核心区别
基础定义
- 表达式是语法层面的概念:凡是可以被求值、最终会产出一个返回值的代码片段,都属于表达式,哪怕返回值是
None、undefined这类空值。你示例里的(display "hello")、print('hello')本身都是典型的表达式。 - 函数是值层面的概念:它是一类特殊的、可被调用的一等公民值,本身可以作为表达式的求值结果存在。你写的匿名lambda,就是lambda表达式求值后得到的函数对象。
对你提到的三点认知的修正
你提到的三点认知有部分偏差,逐一解释:
- 「函数拥有名称可被引用,表达式是不是也可以被赋值给变量?」
函数不需要天然拥有名称,你写的无绑定的匿名lambda就是没有名字的函数。赋值操作的本质是把表达式的求值结果绑定到变量上,和结果是不是函数没有关系:你可以把2+3这个算术表达式的结果(整数5)绑定给变量,也可以把lambda表达式的结果(函数)绑定给变量,逻辑是完全一致的。 - 「函数可以接收参数,表达式是否也支持接收参数?」
表达式是静态的代码结构,不是可调用对象,本身不支持接收参数。但如果一个表达式的求值结果是函数类型,那这个结果就支持接收参数,这是函数值的能力,不是表达式的能力。 - 「函数拥有作用域/封装能力,可包含多条语句。」
这个结论基本成立,只有小的语言差异需要注意:比如Python的lambda语法限制只能写单条表达式,但它求值得到的依然是函数。函数的核心特性是拥有独立的词法作用域,内部定义的变量默认不会泄露到外部作用域,而普通裸表达式执行时会直接使用当前所在的作用域,没有独立的封装空间。
底层逻辑总结
二者完全是两个维度的概念:你写的所有lambda、函数定义语句,首先是语法层面的表达式/语句,求值之后会得到一个值层面的函数对象。简单说:
函数是某一类表达式求值后得到的、可调用的特殊值,表达式是能产出值的代码结构,二者是「生产结果」和「生产方式」的关系。
对应你的示例补充说明
; Scheme 示例对应解释 (display "hello") ; 普通表达式,求值后执行打印,返回未指定的空值 ((lambda () (display "hello"))) ; 先对lambda () ... 表达式求值得到匿名函数,再加括号调用这个函数 (define hi (lambda () (display "hello"))) ; 把lambda表达式的求值结果(函数)绑定到变量hi,hi就是具名函数
# Python 示例对应解释 >>> print ('hello') # 普通表达式,求值后执行打印,返回None >>> lambda: print ('hello') # lambda表达式,求值得到匿名函数,交互环境会打印函数对象地址 >>> hi = lambda: print ('hello') # 将lambda表达式求值得到的函数绑定到变量hi
内容的提问来源于stack exchange,提问作者David542
相关产品推荐
相关产品推荐

