5:Python编程入门,动手做个虚拟地球——让代码繁殖后代

5:Python编程入门,动手做个虚拟地球——让代码繁殖后代

首页模拟经营虚拟动物家庭游戏更新时间:2024-04-30
敲黑板

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