目录:
不同于英文,俄语常用单词有“天空蓝”和“海洋蓝”,你可以理解成浅蓝与深蓝。俄语母语者也因此比英语母语者更能区分蓝色深浅。1夸张地说,对于俄语母语者,浅蓝与深蓝的区别,可能跟蓝与紫的差不多。
如果你想更清晰地区分蓝色,最好了解多一些蓝色的词语,比对其中差别。甚至,你可以去了解十六进制颜色,直接区别不同颜色。比如本文引文1的蓝,对应的十六进制颜色是#9ab6cc
。
如果你想更清晰地理解一个概念,最好了解多一些与它相关的词语,并细心剖析。
对“函数”这个概念来说,你知道“函数”这个词本身什么意思吗?“功能”这个词呢?
对x => x * x
来说,“函数”强调了它含(函,文言文)有x
这个变量(数),也就是强调了输入;“功能”则强调目的、隐含调用。还有人将它表述为“过程”(procedure),侧重于如何处理输入、生成输出。
在英文业界中,大部分人用function,少部分人用procedure。前者对应的中文翻译几乎都是“函数”,那为何这个系列一开始要用“功能”呢?因为“函数”这个名字太文言文,以至于很少有人愿意花点精力弄懂它的字面意思,甚至直接被劝退了。此外,这个系列不打算告诉你“正确”答案,因为编程中有很多这种用不同名词表述同一概念的情况。真知要靠你自行打磨。
总而言之,不论是“函数”、“功能”还是“过程”,都在解释这个概念的不同方面。这不是文字游戏,甚至在相同编程语言中,就有不同表达方式。以“交叉相乘”为例:
// 一直在用的
let 交叉相乘 = (x, y, z) => x * y + y * z + z * x
// 分行。注意结果用`return`返回。过程越来越复杂时,分行能方便阅读(当然,这里没必要)
交叉相乘 = (x, y, z) => {
let xy = x * y;
let yz = y * z;
let zx = z * x;
return xy + yz + zx;
}
// `function`形式
交叉相乘 = function (x, y, z) = {
return x * y + y * z + z * x;
}
不仅要研究表述,而且要深入到概念。听别人讲解、自己做练习,都是打磨概念的方式。
可能你会想起“玫瑰不叫玫瑰,依然芳香”,前文也引用过这句话,说明“变量的名字是什么含义,对机器不太重要”。但请你记住,如果玫瑰叫“牛粪花”,那人们总会不由自主地将玫瑰跟牛粪关联在一起。对于看你代码的其他人、甚至明天的你、下个月的你,变量的名字对都是有帮助的。
如果某种语言有特定词语表述某种概念,那么谈论这种概念就会更频繁,也更容易。1
练习题:
- 如果去掉“交叉相乘”
function
形式的交叉相乘 =
,输入到控制台,会发生什么? - 为
function
形式的“交叉相乘”分行。 let
有个类似的词,叫const
,- 如果将
let 交叉相乘 = (x, y, z) => x * y + y * z + z * x
的let
改成const
,会发生什么? - 在控制台输入
const 交叉相乘1 = (x, y, z) => x * y + y * z + z * x
后,再输入交叉相乘1
的function
形式,会发生什么?交叉相乘 = function (x, y, z) = { return x * y + y * z + z * x; }
let
跟const
的共同点是什么?不同点是什么?- 请猜测
const
的字面意思,然后搜索验证。
- 如果将
编程起步这章到此结束,如果你认真练习了的话,主要磨炼了函数一词背后的概念。这些应当是编程最常用到的东西,甚至不编程的人也要关注一个任务的输入跟输出是什么。
上篇部分练习参考
上一篇是编程起步:(二)告诉机器一个函数
输入为函数
一节的思考题
call
对应之前讲的哪个概念?- 调用
call((x, y) => x + y, (4, 5))
符合语法么?如果符合,请逐步求值并验证;如果不符合,要怎样修改call
或调用方式?- 不符合
- 可改为
call(call(x => y => x + y, 5), 4)
。(习题有提示)
输入与输出都是函数
一节的思考题
- 如何消去
compose
并简化compose(x => x * x, y => y - 1)
- 内函数是
y => y - 1
,外函数是x => x * x
; - 因为初始输入是先流经内函数的,所以考虑将外函数的
x
替换为y
:y => (y - 1) * ( y - 1)
。
- 内函数是