专栏名称: 数据与算法之美
用数据思维解决意想不到的问题!
目录
相关文章推荐
51好读  ›  专栏  ›  数据与算法之美

Python难懂?买一次西瓜就懂了!

数据与算法之美  · 公众号  · 算法  · 2018-04-18 17:47

正文


什么是code?


code就就是一种语言,一种计算机能读懂的语言。计算机是一个傻*,他理解不了默认两可的任何东西。比如,你让你老公去买个西瓜,你老公会自己决定去哪里买,买几个,找个搞活动打折的买,总之,你给他钱,他就给你买回来让你吃到爽的西瓜。但是,你想让计算机买一个西瓜?你要告诉他:去门口的鲜丰水果店买,买沙瓤无子西瓜,若旁边的店打折,就去旁边的店买。总之,你不能让计算机做任何决定,你要清楚的告诉他所有情况下的所有的行为。而code,就是你和计算机交流的语言,或者说是对计算机的命令。


我们就把计算机理解为一个人,这个人很死板,只能按照你给他的详细命令进行工作。而这个人工作速度特别特别快,并且保证工作结果都是正确的。


编程语言其实不重要,重要的是要明白如何和计算机交流,明白了这个也就能看懂代码了。



编程 = 算法 + 数据结构


python就是一种和计算机交流的语言,这种语言单词(关键字)不多,规则也少。下面所有的内容都基于python。


1、判断


当你命令计算机做一件事情的时候,这件事情可能分一些情况进行处理。

判断通常涉及到的关键字有:if , else, elseif, and, or,,=,<=,>=,==


比如,你让计算机买西瓜,希望买到打折的西瓜,不打折的话你就不吃了。


if  水果店打折:

买西瓜

else:

不买了


通过这个命令,计算机变得更智能了一些,他可以根据情况执行你的命令。


水果店不打折你就吃不到西瓜,你不开心。那么,我们让计算机更智能一些。假如西瓜打折,就买西瓜;不打折的话让计算机跟老板讲价,老板同意打折,就买西瓜;不同意,不吃了;


if  水果店打折:

买西瓜

else:

与老板讲价

if 讲价成功:

买西瓜

else:

不吃了。


虽然和老板讲价一般都能讲成功,但是有的老板给力给打五折,有的老板只给打九折。你就想了,若老板打五折,我就买两个,今天吃一个,明天吃一个。若老板不给力,打折不到五折,就买一个,今天先吃,明天再说。


if  水果店打折:

买西瓜

else:

与老板讲价

if 打折成功 and 打折力度<=5:

买两个西瓜

elseif 打折成功 and 打折力度 > 5:

买一个西瓜

else:

不吃了。


此外,有没有发现,打着成功这段代码其实也可以写成:


if 打折成功:

if 打折力度<=5:

买两个西瓜

else:

买一个西瓜

else:

不吃了。


由此可见,计算机也不是完全的一成不变,只要你给他的命令他能理解并且不会默认两可,他都可以完成工作。


and的意思代表且,or的意思代表或。and和or的顺序不同,结果也不同,可以通过括号来说明判断条件的优先级。


a==b是比较a和b是否相等的意思,而=代表赋值。赋值的含义,我在下面的变量章节介绍。


2、循环


python中涉及到循环的关键字包括:for…in… ,while,break,continue


上面的例子我们已经让电脑成功的可以根据不同的情况去水果店买西瓜了,但是若老板不打折,你就吃不到西瓜了。这时,你就想了,咱们小区门口有三家水果店,分别是鲜丰水果、四季水果和路边摊,一家不打折不代表三家都不打折啊,所以你希望电脑可以去三家都去看看,挑一家打折的店买西瓜。


for 水果店 in (鲜丰水果、四季水果和路边摊):

if 水果店 打折:

买西瓜

break(循环结束)

else:

啥都不做

带西瓜回家


循环的意义在于,可以用电脑对不同的对象执行相同的命令。


介绍下break,break的意思就是结束循环。比如,这段代码中的break表示,我们一旦买了西瓜,那么就带西瓜回家。


3、变量


现在是时候介绍’变量’这个重要的东西了。


我们依然把电脑理解为帮我们工作的一个人,那么作为一个人,他需要有记忆力,而我们就可以通过变量去控制、利用计算机的记忆力。


变量可以理解为计算机的一个记忆单元,计算机拥有极好的记忆力,所以,可以随心所欲的使用,用完了就扔,需要了就要。(当然,说随心所欲是不严谨的,但是你可以理解为随心所欲)


那为什么叫变量呢,就是因为可以改变。为什么要改变呢?比如我们都有自己的年龄,我今年18,明年就19了。所以,’年龄’在我的记忆里是每年改变的。


变量对应的一个东西叫常量,在我的记忆力,我的老婆是江江同学。而这个’老婆’这个记忆单元在我的脑子里是不会变的,她永远都是江江同学。常量你现在可以不用理解,我写主要是为了秀恩爱。


现在,计算机又要去买西瓜了。不过这次,你希望计算机可以在三个水果店中,找到一个打折力度最大的水果店去买水果。


之前所有水果店的最大折扣 = None

之前给最大折扣的水果店 = None

for 水果店 in (鲜丰水果、四季水果和路边摊):

当前水果店折扣 = 老板给的折扣

if 当前水果店折扣 < 之前所有水果店的最大折扣:#4折比5折力度大

之前所有水果店的最大折扣 = 当前水果店折扣

之前给最大折扣的水果店 = 水果店


去 之前给最大折扣的水果店 买一个西瓜


以上有以下几个记忆单元:


  • 之前所有水果店的最大折扣

  • 之前给最大折扣的水果店

  • 当前水果店折扣

  • 水果店 注意,for a in b,a也是一个变量,他在每次执行的时候都是b中的当前执行的一个元素。


这里需要介绍一些概念:


  • None 在python中表示空,表示这个记忆单元现在啥都没有。比如在我情窦初开时,脑海中就已经有了情人这个记忆单元,我一直在寻找,但遇到你之前一直没有找到,所以那段时间这个记忆单元里面一直是空。

  • 赋值符号:=。 注意,在计算机语言里面,一个’=’号表示赋值,两个等号’==’表示比较前后元素。赋值的意思是,把后面的元素,放到前面的变量里面。


变量的作用域


作用域这个东西非常重要,但是真心不想讲,因为没办法结合现实的例子,不过还是大体说明下。


还是刚才的例子,我加了行号,并且我使用-代表空格,表示代码的缩进。


1 之前所有水果店的最大折扣 = None

2 之前给最大折扣的水果店 = None

3 for 水果店 in (鲜丰水果、四季水果和路边摊):

4 ---当前水果店折扣 = 老板给的折扣

5 ---if 当前水果店折扣 < 之前所有水果店的最大折扣:#4折比5折力度大

6 ------之前所有水果店的最大折扣 = 当前水果店折扣

7 ---之前给最大折扣的水果店 = 水果店

8 去 之前给最大折扣的水果店 买一个西瓜


你看这个例子可能纳闷,为什么要先给’之前所有水果店的最大折扣’、’之前给最大折扣的水果店’这两个变量赋值为None呢。就是因为作用域问题。


你看这个程序,每行代码的缩进都是不一样的。变量作用域可以理解为:一个变量,只有在其第一次出现的地方的缩进,以及缩进更多的代码里面,才有效。我们第1、2行的变量,就可以用于3-8行,因为这些代码的缩进都在1、2行的后面。而第四行的变量’当前水果店折扣’,只在5、6、7行有效


1  A = None

2  ————B = None

3  ————..

4  ————————C = None

5  ————————..

6  ————D = None

7  ————..

8  ————————..

9  ————————..

10 ..

11 ..


再举个例子,ABCD是变量,..代表某些代码。A的作用域就是1-11行,即1-11行都可以使用A。B的作用域是2-9行,C的作用域只有4-5行,注意,8-9行就不能再使用C了,虽然他的缩进和4、5行一样,作用域遇到第一个不能用缩进行代码即结束。D的作用域就是6-9行。


4、函数


看懂以上几节,大概应该明白计算机如何执行代码的了。


而函数和模块,和之前的介绍不太一样。之前是介绍如何让计算机工作,是面向计算机的。而这一节,是面向人的,是如何让我们写给计算机的代码看起来更加简洁、明了。函数和模块都是对代码结构的优化,否则一个稍微大点的项目,一大坨代码,计算机看得懂人看不懂,不利于管理和交流。


首先说函数。函数是一系列代码的集合,用函数一般是有几个原因:







请到「今天看啥」查看全文