1)这是教学的第5课
2)在专栏里,可以找到之前的课程
3)持续更新,关注不迷路
4)有问题请留言,有问必答
1)如何把一个复杂问题变简单?
2)构建信息模型的时候,为什么要用类这个概念?
3)上一课超时空链接( )
用Python “编写一个虚拟的地球”?小白遇到这个问题,真的是脑袋里一片空白,但训练有素的老手,此时此刻脑袋里面已经有画面感了。
在第三课里,我们提到,专业的程序员、软件工程师在遇到具体问题时,会立马想到下面两个问题:
1)我要如何利用编程语言,来存储、组织、构建这些问题的关键信息?
2)这些信息我存储好了,我要如何用编程语言来操作它们?
我们先集中精力考虑第一个问题,如何构建信息?那面对第一个问题,我们又要如何下手?
同样此时小白还是脑袋一片空白,老手脑袋里已有了画面感。
老手脑袋里有画面感,是因为他们掌握了一种在设计软件时经常用的方法,它有很多种名字,我把它叫做“拆大象”。
这种方法的核心思想就是,把一个很大的任务,或者概念,按照某一个明显区分点,一级一级的慢慢拆分。这个方法的两个要点:
1)找一个或多个明显区分点
2)毫不留情的“拆大象”
比如:
“我下午要做一顿丰盛的晚饭”,可以按照做饭的流程,把这个大的任务拆解成:
1)买菜任务
2)两个荤菜任务
3)两个素菜任务
4)煮一个汤任务
5)煮米饭任务
6)背景音乐任务
7)售后服务任务(洗碗)
等等。
同理:
我们可以把“编写一个虚拟的地球”的构想,按照地理知识,将其拆解成环境,生物,时间。我把这叫做第一级拆分,如下图:
继续:
我们可以对环境、生物、这两个类别继续“拆大象”,环境可以拆解为大气、水等等。生物可以拆解为微生物、植物、动物等等。我把它叫做第二级拆分,如下图:
其实我们可以这样一直拆解下去,直到我们绞尽脑汁无法再拆解为止,在这里我们拆到第二级就可以了,毕竟要留点篇幅来讲解具体的Python代码。
无论在编程领域,还是在生活中,很多巨大的问题我们都可以通过“拆大象”把它变得具体清晰起来。比如下面这个问题,各位小伙伴你们会怎么拆?
“如何赚取人生的第一桶金?”
可以在留言区相互交流,让我看到你们的脑洞!
通过“拆大象”的方法,我们有了一些思路后,可以开始撸撸袖子敲代码了。
我们先通过Pycharm来创建一个Python项目,项目就叫做 “ welcome come to my word ”,意思就是 “欢迎来到我的世界”,如下图:
新建一个Python文件,叫做 word 准备开始撸代码!
还记得在前面的课程中说过,变量是编程语言用来组织信息的工具。变量在编程语言里,就是用来存放信息的。(相关课程链接: )
现在我们就用变量把,刚才“拆大象”分析的结果敲出来。如下图:
上面的代码,是根据“拆大象”的分析图,把第二层级的信息用一般的变量保存起来,把第一层的信息和地球这个信息用Python里面的列表数据结构组织起来。
第28~34行,通过列表的*.append()方法,把变量添加到列表里。关于变量和数据结构列表的概念、使用在第三课里有说明,并且会在后续课程深入的介绍。在第37行,用 print 这个Python内置的方法,把earth这个变量打印到屏幕上。
这个时候我们运行程序,可以看到如下的效果。
通过上面的代码,虚拟地球基本的数据结构出来了。但马上,我们会发现哪里不对?
1)水有好多种,比如海水、河流等他们性质不一样,这个该怎么模拟 ?
2)动物有很多种,这个我们要如何来模拟 ?
这个时候,Python 里“字典”这样的数据结构就要登场了。
字典
字典是一个很抽象,很重要的数据结构,简单高效粗暴的理解,字典可以让我们把一堆属性存储在一个变量里,我们复制一份 word 代码到 word_2 里,然后改进一下如下图:
我们把关于水的变量进行了一个细分,比如雨水(water_rain),海水(water_sea),河流(water_river)。它们有相同的属性。分别是“type”水的类型、“vol”水的量,“salt”水的盐度。
在Python里用大括号对 “{}”,来描述一个字典。在大括号对里,用双引号 “ ” 包裹一个字符串来定义一个字典的属性,再在属性冒号“:”的后面,来定义这个属性的值,每个属性用逗号“,”隔开。
属性的值可以是数字、字符、布尔等基础信息类型(查看第三课,了解信息的基本类型),也可以是一个列表,或者字典,比如我们可以改进一下water_sea 这个变量,给他一个位置信息,使用字典的嵌套来写代码,如下图:
可以看到,字典属性 “location”,其实也是一个字典,能明白字典嵌套这样的用法,你的任督二脉就被打通了。我们在实际工作中就可以组织更复杂的数据了。
看到这里有些小伙伴会问,是不是字典的定义都是要写成很多行?其实在字典里,也可以把代码写成一行,如下图:
这是灵活的,只是写成多行,代码看起来舒服一些。
完善了一下虚拟地球的数据结构后,我们可以在Pycharm的Python交互器里,操作一下这些变量。我们先启动Pycharm里的Python交互器,如下图:
然后输入下面的代码:
From word_2 import water_sea:
这行代码的意思是从 word_2 的代码文件里面导入 water_sea 这个变量。这个变量就是我们用字典数据类型保存海水的信息。
water_sea.get(“type”)
这行代码的意思,就是在使用 water_sea 这个字典变量里的 get() 方法,来查看 “type” 这个属性里面是什么数据。
用同样的套路可以查看我们之前为虚拟地球创建的所有变量信息,大家可以自己操作一下熟悉一下这些套路。
我们同样可以用字典的 “套路” 来组织保存虚拟地球生物的信息,如下图代码:
然后把这些信息,全部加入到 biology(生物) 这个列表变量里,如下图:
现在我们的虚拟地球,有了一些海水、河流、空气、张三、李四、还有一只叫闹闹的猫了。但我们要做的虚拟地球是要有上万人,上百种动物,各种各样的环境,并且这些元素能互动,在我们的虚拟地球里能看到物种的进化,和环境的改变等等。
那么假如我们要创建10000个人,是不是上面的套路,我们要执行10000遍?
难道这就是程序员掉头发的原因吗?
这就是程序员加班的源头吗?
有毅力的小伙伴,完全可以这样做!但编程语言的世界里,给我们提供了更好的方法和工具。
这些方法和工具更适合我们来组建一个虚拟地球的数据,而不是仅仅用变量、列表、字典来组建。我们来看看,我们该如何改进?
类:“埋了那么多伏笔,终于我该登场了!!!”
类的概念,我们在第3课为大家介绍过了(课程链接: )。
简单粗暴高效的理解,类就是一个“模板”。举个例子,我们的基因就是我们的模板。父母年轻时,通过基因的交换形成新的基因序列,我们就按照这个序列生长出来。
基因就是类,我们就是基因的执行,也就是编程领域类这个体系里另外一个重要的概念,实例。
我用人类基因来比喻类这个概念还有一个用意,就是我们基因里都继承了来自父母的基因,类同样有继承的概念!也就是说,好的程序代码是可以 “繁殖后代” !这是不是很神奇?
关于类的继承,我们在这一课就会让大家体验,在之前,我们先看一下如何在类这个概念下,重新考虑如何组织之前我们通过“拆大象”分析出来的结果。
重新回顾一下,我们之前的分析结果:
新建一个文件,word_3.py,然后敲入下面的代码,它们就是使用 类(class)这个概念在 python 里面为虚拟地球构建环境的模板(环境Class):
我们来解读一下这段代码。
第一行 class Env: 的意思是使用class 这个保留关键字,在 Python 里面定义了一个叫做 Env的类。这里有一个细节,Env 为什么不是 env。
在类的定义时,Env,env效果是一样的。但在编程规范里,类的名称首字母建议用大写,这些约定俗成的规则有自己的道理,就像广东人喜欢被叫靓仔一样,在合适的场景下面我会为大家说明。
下面的 3~5 行是一个类的注释说明,通常程序员和软件工程师在设计编写类代码的时候,都会在这里对类的用途进行一个说明,方便其他伙伴查阅。
第6~9行就是定义了这个类的变量,也叫做类的属性,这种描述方法有点像字典的描述的方法。我们从代码可以看到,这个类定义了4个变量,他们分别时用来描述这个类的type(类型)、state(状态)、unit(单位)、desc(描述)属性的。
定义好了类,我们要如何使用呢?
打开 Pycharm 里的 Python 交互器,然后敲入下面代码。
From word_3 import Env:
的意思是,导入word_3 里,Env这个类。
water = Env():
根据Env这个类模板创建一个实际的对象(类的实例),叫做water。
后面四行代码,是给water这个对象设置相应的属性值。
上面就是类的创建,和类的使用(类的实例化)的例子,其实类的概念和使用,没那么复杂,听懂给我点个赞吧。
Env 这个类是一个很抽象的东西,只有四个属性。水也属于环境,但水这个环境,只用这四个属性是不够的的,还需要地理位置,和具体的名称,比如“大西洋”等。这样的类我们可以用下面的代码来设计:
从逻辑上我们可以这样理解 Env 其实是包含了 Water的。
我们从代码里,可以看到 Water 这个类,比 Env 这个类多了四个属性,它们分别是 name、salt、longitude、latitude。并且 type、state、unit、desc这四个属性和Env的是一样的。
假如我们要再创建一个类,叫做 Drinks(饮料),它在逻辑上可以被Water包含,所以在创建Drinks的时候,会有和Water一样的属性。
如果你细品,你会发现这里面已经有一点 “继承” 的味道了。Drinks 集成了一些 Water 的属性、Water 继承了一些 Env 的属性,就像我们继承了祖先的一些基因一样。
好吧,是时候该说 “类的继承这个概念了”,我们把 word_3 这个文件复制一份,改名为 word_4,然后在原来两个类的基础上使用继承这个工具,代码如下:
大家有没有发现和之前没有用继承概念的代码有什么不同?
在第13行代码,创建 Water 这个类的时候,在Water后面增加了(Env)。这种用法在Python里面的意思是,Water这个类继承自 Env 这个类。
我们可以打开Python交互器,敲入如下代码:
首先导入word_4这个文件里的 Water 这个类。然后 Water() 创建一个对象(实例化一个类),把它放到 w 这个变量里面。在用Python内部的dir()命令,查看这类里有什么东西?
上图红色下划线,就是这类的属性(其他的比如__int__后续的课程会为大家详细讲解),我们发现在定义 Water 的时候,type、state、unit、desc这四个属性,是没有被定义的,如下图:
虽然没有定义,但是通过 Water(Env) 继承的操作,Water 集成了 Env 的所有属性。这种操作不但让我们代码少写了很多,逻辑上也让 Water,和 Env 的关系更清晰了,在这段代码里Env 是 Water 的父类,Water 是Env 的子类。
这就是继承的妙用。继承除了可以 “传承” 属性外,还可以 “传承” 方法,方法下一节课为大家介绍。
好了,了解了类,和类的继承后,我们在回顾一下这张图:
然后再根据这张图来,用类和类的继承,来重新构建我们虚拟地球的模板,代码如下:
上面的代码,反映了下面的这张类关系图:
细心的小伙伴会发现,这个类的关系图和我们用“拆大象”方法做的分析图少了一个“时间”。时间是一个很特殊的存在,它凌驾于所有的物理规则之上。
所以后面我们让虚拟地球“启动”起来的时候,会深度的为大家讲解编程语言里面,时间的定义和用法。
另外,类的设计是很讲究的,有专门的类图,也叫做ER图,后面的课程会教大家怎么用ER图来设计功能强大的类。
我们已经把这个虚拟地球的几大要素用类的概念组织起来了,针对软件开发中,我们要面对的第一个问题,“我们要如何组织信息”? 已经有了一些框架性的思路。
在用 “拆大象” 的方法去分析 “编写一个虚拟的地球” 问题的时候,大家会发现,每个人的想法都会不一样。
我是按照我自己对宇宙地球的理解来拆分问题的,也许你会按照其他的思路来。这里不存在对错,反而我觉得充满了可能性。
如果你想到了更有趣的 “视角” 或 “拆大象” 的思路,可以在留言区和大家分享,这也是一个相互学习的过程。
目前的 “模型” 只是一个大框架,离我们对虚拟地球的要求还很远。下一课,我们会用Python各种各样的数据结构和变量类型来更细致刻画我们的虚拟地球,并且引入另外一个重要思想,如何愉快高效的组织我们的项目文件。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved