表达式与函数之间的差异
Differences between Expression vs Function
表达式和函数在形式上有什么区别?我通过观察知道其中的区别,但我正在寻找对它的透彻理解。例如,显示一些来自 Scheme 或 Python:
的示例
; scheme
(display "hello") # expression
((lambda () (display "hello"))) # unnamed lambda
(define hi (lambda () (display "hello"))) # named lambda
# python
>>> print ('hello')
>>> lambda: print ('hello')
>>> hi = lambda: print ('hello')
在我的初步思考中,我认为不同之处在于:
- 一个函数有一个名字并且可以被引用(虽然一个表达式可以赋值给一个变量?)
- 函数可以带参数(表达式可以吗?)
- 一个函数可以有一个 scope/encapsulation 并包含多个语句。
您可能在这里将苹果与橙子进行比较。 表达式是一种句法形式。它是代码的一部分,描述了代码是如何解析的。 a + b
和 print(x)
是表达式,a
、b
和 x
也是表达式。表达式通常由更小的表达式组成,通常有几层深。
另一方面,A 函数 关注的是语义,而不是句法。这是一个运行时值。有人可能会说
lambda x: x + 1
是一个函数。为了完全正确,我会说这些字母被解析为一个表达式,当 被 Python 解释器计算 时,它会产生一个函数。但这太啰嗦了,所以我们通常会跳过中间人,只说 lambda 是 一个函数。
将表达式赋值给变量是没有意义的。如果我写 x = 1 + 1
,我不会将 表达式 1 + 1
分配给变量。我将计算一加一的结果分配给该变量。另一方面,如果我写 x = lambda: 2
,那么我实际上是将 函数 分配给变量 x
。函数存在于运行时;表达式纯粹是一个解析结构。
如果你在纯 FP 的上下文中考虑它,它不允许副作用(因此不需要语句),那么函数只是一个具有特定类型的值(A -> B).表达式是一些符号的组合,可以减少到一个值。
考虑以下示例:
a = 1 + (2 * 3);
b = a * 10;
add1 = x -> x + 1;
applyTwice = f -> x -> f(f(x))
add2 = applyTwice(add1)
a、b、add1、applyTwice 和 add2 都是已定义的名称,用于保存由特定表达式计算的值。前两个表达式分别减少为7和70,后三个为函数值。最后一个,add2,是通过一个表达式定义的,该表达式减少为一个函数值。
关于您提出的观点:
- 一个函数有一个名字并且可以被引用(虽然一个表达式可以赋值给一个变量?)
大多数语言都允许您为名称分配任何表达式。
- 函数可以带参数(表达式可以吗?)
与非函数不同,函数有参数。如上所述,表达式可以简化为函数值。
- 一个函数可以有一个 scope/encapsulation 并包含多个语句。
函数体本质上只是一个表达式,尽管它包含引用函数参数的未绑定变量。语句会让人分心 - 某些语言还允许您将一系列语句的结果分配给非函数变量,例如:
result = {
a = f();
b = g(a);
h(b);
}
(即 h(b) 的 return 值赋给结果)
首先回答您的问题:
- 一个函数有一个名字并且可以被引用(虽然一个表达式
可以分配给一个变量?)
--- 是的,可以将表达式分配给变量,但与函数不同,您不能使用参数调用表达式。
- 函数可以带参数(表达式可以吗?)
--- 不,表达式不能带参数。
- 一个函数可以有一个 scope/encapsulation 并包含多个语句。
-- 正确
函数式编程 (FP) 都是关于表达式的,因为在 FP 中一切都归结为表达式。
函数在 FP 中用作对象。也就是说,它们通常以与其他变量几乎相同的方式在程序中传递。
例如 - Python 提供了几个函数,可以使用函数式方法进行编程,例如函数 map(aFunction, aSequence)
此函数应用一个 Python 函数,aFunction 到 aSequence 的每个成员。表达式:
L = map(eggs, spam)
print L
在 L 中返回一个新列表(在本例中与垃圾邮件相同)。
表达式和函数在形式上有什么区别?我通过观察知道其中的区别,但我正在寻找对它的透彻理解。例如,显示一些来自 Scheme 或 Python:
的示例; scheme
(display "hello") # expression
((lambda () (display "hello"))) # unnamed lambda
(define hi (lambda () (display "hello"))) # named lambda
# python
>>> print ('hello')
>>> lambda: print ('hello')
>>> hi = lambda: print ('hello')
在我的初步思考中,我认为不同之处在于:
- 一个函数有一个名字并且可以被引用(虽然一个表达式可以赋值给一个变量?)
- 函数可以带参数(表达式可以吗?)
- 一个函数可以有一个 scope/encapsulation 并包含多个语句。
您可能在这里将苹果与橙子进行比较。 表达式是一种句法形式。它是代码的一部分,描述了代码是如何解析的。 a + b
和 print(x)
是表达式,a
、b
和 x
也是表达式。表达式通常由更小的表达式组成,通常有几层深。
A 函数 关注的是语义,而不是句法。这是一个运行时值。有人可能会说
lambda x: x + 1
是一个函数。为了完全正确,我会说这些字母被解析为一个表达式,当 被 Python 解释器计算 时,它会产生一个函数。但这太啰嗦了,所以我们通常会跳过中间人,只说 lambda 是 一个函数。
将表达式赋值给变量是没有意义的。如果我写 x = 1 + 1
,我不会将 表达式 1 + 1
分配给变量。我将计算一加一的结果分配给该变量。另一方面,如果我写 x = lambda: 2
,那么我实际上是将 函数 分配给变量 x
。函数存在于运行时;表达式纯粹是一个解析结构。
如果你在纯 FP 的上下文中考虑它,它不允许副作用(因此不需要语句),那么函数只是一个具有特定类型的值(A -> B).表达式是一些符号的组合,可以减少到一个值。
考虑以下示例:
a = 1 + (2 * 3);
b = a * 10;
add1 = x -> x + 1;
applyTwice = f -> x -> f(f(x))
add2 = applyTwice(add1)
a、b、add1、applyTwice 和 add2 都是已定义的名称,用于保存由特定表达式计算的值。前两个表达式分别减少为7和70,后三个为函数值。最后一个,add2,是通过一个表达式定义的,该表达式减少为一个函数值。
关于您提出的观点:
- 一个函数有一个名字并且可以被引用(虽然一个表达式可以赋值给一个变量?)
大多数语言都允许您为名称分配任何表达式。
- 函数可以带参数(表达式可以吗?)
与非函数不同,函数有参数。如上所述,表达式可以简化为函数值。
- 一个函数可以有一个 scope/encapsulation 并包含多个语句。
函数体本质上只是一个表达式,尽管它包含引用函数参数的未绑定变量。语句会让人分心 - 某些语言还允许您将一系列语句的结果分配给非函数变量,例如:
result = {
a = f();
b = g(a);
h(b);
}
(即 h(b) 的 return 值赋给结果)
首先回答您的问题:
- 一个函数有一个名字并且可以被引用(虽然一个表达式
可以分配给一个变量?) --- 是的,可以将表达式分配给变量,但与函数不同,您不能使用参数调用表达式。 - 函数可以带参数(表达式可以吗?) --- 不,表达式不能带参数。
- 一个函数可以有一个 scope/encapsulation 并包含多个语句。 -- 正确
函数式编程 (FP) 都是关于表达式的,因为在 FP 中一切都归结为表达式。
函数在 FP 中用作对象。也就是说,它们通常以与其他变量几乎相同的方式在程序中传递。
例如 - Python 提供了几个函数,可以使用函数式方法进行编程,例如函数 map(aFunction, aSequence)
此函数应用一个 Python 函数,aFunction 到 aSequence 的每个成员。表达式:
L = map(eggs, spam)
print L
在 L 中返回一个新列表(在本例中与垃圾邮件相同)。