共计 3479 个字符,预计需要花费 9 分钟才能阅读完成。
“英语不好能不能学编程?”
“编程是不是对数学要求很高?”
时不时会在公众号后盾收到相似的疑难,即:数学 / 英语是否是学编程先决条件?
我感觉这个问题有点像,身高不高能不能打篮球一样。尽管对于职业篮球运动员来说,身高是十分要害的因素,但对于一般篮球爱好者,甚至一个篮球相干从业人员来说,这并不是非要不可的条件。放到编程上,数学和英语都很重要,但:
- 在入门阶段,你齐全不必在意这些,照着一本教程好好跟着模拟 就行
- 对于大部分的日常开发来说,中学水平的数学和英语水平曾经能够应酬 了
- 和身高这种先天条件不同,英语和数学是能够通过学习进步的 ,哪里有余补哪里呗。“ 以大多数人的致力水平之低,基本轮不到拼天才。”你能长期保持背背单词,看看书,就足以晋升本人。总是把 XX 不好挂在嘴上恐怕更多是在给本人找借口。
不过,有一项能力,的确是在学习编程初期就须要足够器重的。然而这一点,很多教程不会专门强调,相干书籍也往往假设你曾经把握,以至于很多学习者并没有意识到本人在此方面的单薄,为之后的学习留下隐患。我要说的就是:
逻辑
某种角度来说,逻辑可局部算作是数学,在高中数学课本中就有相干内容。这部分内容也恰好是咱们学编程时最须要理解的根底。
一、布尔代数
由 真(1)、假(0) 两种状态,以及 与(and)、或(or)、非(not) 三种根本运算组成。布尔代数看似简略,却与数字电路中开和关两种状态绝对应,是 计算机的逻辑根底。你可能据说过,电脑上的所有在外部都是由 0 和 1 所示意,那换句话说,计算机的所有行为,实质都是由布尔逻辑所实现的。
在编程语言中,布尔类型(bool)也是极为重要的存在。没有它,咱们就做不了条件判断,也就无从控制程序的执行。Python 的 if、while 语句都必须依赖布尔类型作为判断条件。
因而,即便你不想深刻学习逻辑,布尔代数的根本规定也是无论如何必须理解的。简略来说,就是上面这张“真值表”:
这些根本规定又会组合出更简单的逻辑,比方:
not (p or q) 等价于 (not p) and (not q)
(示例:“不是管理员或者会员”相当于“不是管理员且不是会员”)
理论开发中面临的逻辑判断简单多样,但归根结底还是会转化到最根本的这几个规定上。
思考题 1:如何用逻辑语言示意“通过流动注册的新用户或者充值超过 100 元的老用户,内部人员除外”
二、命题逻辑
真值惟一的陈述句叫做命题,不能分解成更简略的命题叫做原子命题。比方,“1+1=2”是原子命题,“所有猫都是白的”是原子命题(假命题),“存在外星人”也是原子命题(虽不能判断虚实,但后果必然惟一)。命题和逻辑运算相结合,又会产生更简单的逻辑。
比方 充沛必要条件。
如果命题 p 必然推出命题 q,那么 p 就是 q 的充分条件,q 就是 p 的必要条件,记作 p→q。
比方汉乐府的诗句“山无棱,天地合,乃敢与君绝”,用逻辑语言表达是怎么?
(山无棱 and 天地合) → 与君绝?
想一想是不是不大对劲?依据语义来看,“山无棱”、“天地合”是“与君绝”的 必要条件,如果“与君绝”为真,那必然存在“山无棱”和“天地合”,反过来却未必。所以正确的逻辑是:
与君绝 → (山无棱 and 天地合)
再比方 三段论。
①不把握根本的逻辑常识就无奈学好编程
②Python 是一种编程语言
所以,学好 Python 须要把握根本的逻辑常识
一个大前提加上一个小前提,能够推导出一个论断 。这是日常应用最多的论证模式,看似简略,但也总有人在这下面犯糊涂。举个 谬误的例子:
①有钱人都用 iPhone XS Max
②我用 iPhone XS Max
所以,我是有钱人
这些逻辑关系、推导过程与程序中的逻辑构造非亲非故。如果你对此不能放弃思路清晰,写出的代码很可能与预期有出入,或是在一些非凡状况下存在破绽。
思考题 2:一个每天签到领奖的小性能,在每天的 11~13 点和 18~20 点凋谢,普通用户每天能够支付一次,会员用户能够在每个时段别离支付一次。如何实现这段程序的逻辑构造?(我时常拿这个作为面试题,很多人都不能在短时间内给出正确的答案)
三、演绎
有时候,咱们并不能通过逻辑推导出必然的论断,但依然能够 通过一系列的教训和已有论断,找出其中根本遵循的法则。
比方:
①X 团队从来给所有成员都装备 Dell 笔记本作为工作电脑
②C 老师最近刚退出 X 团队
通过这两点,咱们能够推导出,C 老师很可能也应用 Dell 笔记本。
但你要分明 演绎的论断并不必然为真,如果遇到逻辑推理出的必然反例,即便再不合乎常理,演绎的论断也会被颠覆。
比方除了上述两点,咱们还晓得:
③C 老师签约了苹果公司代言
④苹果公司的代言人不得应用其余品牌的手机和笔记本
那么,上述“C 老师应用 Dell 笔记本”的论断便不成立。
尽管 演绎不是必然,但在解决问题时仍然重要。尤其在开发中遇到谬误须要 debug(调试)的时候,并不是所有谬误都能够间接从报错信息看出问题(比方 Python 开发时经常出现的乱码问题),这时如果有丰盛的教训和较强的演绎能力,效率会大大晋升。这也是资深程序员和高级程序员之间差距的重要体现。
当初网上的编程教程铺天盖地,不过呢,大家都喜爱写写怎么编个爬虫抓图片、抓数据之类,却很少有文章违心讲讲背地的思维过程。写了读者也不违心看,因为看不出什么成果,哪有调几个函数就出后果来得痛快。以至于你发现,照着例子也能写个一样的代码进去,然而一旦报错或者没有预期的后果,就齐全抓瞎了,只能把参数东改改西改改,重复运行,期待某一次奇观呈现。当前换个新的问题,仍然不晓得从何下手。
这就是因为并未了解程序背地的逻辑。我常在答疑群里说:遇到程序出错了不要去猜!要去做假如,再通过输入验证假如,最终定位问题所在。
文本只是一个引子,不可能让你对逻辑死记硬背。但后面讲的那些逻辑根底,任何一本《离散数学 》或者《 逻辑学 》的书上都有,而且仅仅是最开始的一小部分就很受用了。找一原本看一看。真想好好学编程,不要只局限于读网上的教程,这些都是他人嚼烂喂到你嘴里的。 如果你只能承受这样二次加工过的常识,而没有本人咀嚼的过程,那么你学习上的乳牙永远都掉不了。
理解逻辑学和思维具备逻辑性并不齐全等价。有人没学过逻辑,谈话做事一样很有逻辑性,而有的人尽管学过逻辑,也不过是当做数学公式在背,终日“逻辑思维”挂嘴边不代表做事就讲逻辑。
在网络上,你常常能够看到一些逻辑舛误,举几个常见的例子:
- 以偏概全:你说用 X 产品遇到了 Y 问题。有人就反驳说,我也用 X 产品,我身边人也用 X 产品,都没有问题,所以你肯定是成心黑。
- 关联当因果:某地区的人喜爱喝生牛乳,同时该地区人平均寿命高于周边地区,所以喝生牛乳能够祛病延年。
- 非黑即白:网上都在鞭挞某个产品窃听用户聊天,并且之前也有发垃圾广告的前科。你说窃听从技术上来说不事实,目前也短少明确证据。而后就有人认为你不一起喷,你就是水军、洗地、舔狗。
- ……
相似的不讲逻辑充斥着网络。这两天,网上很多人说“不买华为就是不爱国 ”,对此任正非专门回应说: 不要鼓动民族情绪,不能把买华为与爱国简略等同起来。其实无需任总发话,这句话自身从逻辑上来说就是谬误的。
不买华为→不爱国 ,这个命题在逻辑上应 等价于它的逆否命题 : 爱国→买华为,也就是说爱国的人就肯定会买华为。你这让拿着小米、OPPO、VIVO 的爱国同胞们情何以堪。显然,爱不爱国并不禁网友定义,只有存在一个爱国但未购买华为的人,这句话在逻辑上就不成立。
咱们的四周有很多偏见、歧视的观点,还有很多喜爱争执的“杠精”,归根结底,你会发现这些人都有一个独特的特色:逻辑凌乱。比方,之所有有人会有性别歧视、地区歧视,就是因为以偏概全地由一些特例而对整体作出推论。而反过来,有些人没有被公司录用,就归因是本人的性别或籍贯受到了歧视,就又是另一种谬误的逻辑。而偷换概念、颠倒因果、动机推测,更是杠精们喜爱滥用的逻辑舛误。
为什么总有些人议论观点时不讲逻辑?假设一个人要么懂逻辑,要么不懂逻辑。懂逻辑但不讲逻辑,阐明他带有某种目标而刻意为之;而不懂逻辑,却还要跟人强词夺理,阐明他欠缺认知能力且不自知。所以说,不讲逻辑还硬扛的人,不是__,就是__。(欢送对号入座)
不仅仅是在编程上,如果咱们更考究逻辑,这个世界的矛盾就会少很多。即便没通过专门的学习和训练,只有放弃谦虚,学会聆听,以容纳的心态看待不同的声音,多去思考一下对方的观点,从不同的角度看问题,你的逻辑就会更齐备。
否则,当你发现网络上全是不讲逻辑的舆论时,就不想再发表任何观点了。
—-
PS:留个作业:
这是『知乎』和『王者光荣』的百度指数,王者光荣高的时候,知乎就低,所以是不是说:如果人们不打王者光荣,就会都来上知乎呢?[手动狗头]