编程起步:(三)功能还是函数,这是一个问题

目录:

不同于英文,俄语常用单词有“天空蓝”和“海洋蓝”,你可以理解成浅蓝与深蓝。俄语母语者也因此比英语母语者更能区分蓝色深浅。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

练习题:

  1. 如果去掉“交叉相乘”function形式的交叉相乘 =,输入到控制台,会发生什么?
  2. function形式的“交叉相乘”分行。
  3. let有个类似的词,叫const
    1. 如果将let 交叉相乘 = (x, y, z) => x * y + y * z + z * xlet改成const,会发生什么?
    2. 在控制台输入const 交叉相乘1 = (x, y, z) => x * y + y * z + z * x后,再输入交叉相乘1function形式,会发生什么?
      交叉相乘 = function (x, y, z) = {
        return x * y + y * z + z * x;
      }
      
    3. letconst的共同点是什么?不同点是什么?
    4. 请猜测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替换为yy => (y - 1) * ( y - 1)

  1. 你的语言影响你的思维吗?有趣的“俄罗斯蓝”案例给你答案 ↩︎ ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值