阅读 71

用Python3开发简单应用——兽人之袭

Python 是使用最广泛的动态编程语言之一。它支持一组丰富的包、图形用户界面(Graphical User Interface,GUI)库和Web框架,让你能够构建出高效的跨平台应用。它是一种理想的快速应用开发语言。如此快速的开发通常会带来一些问题,容易导致代码的整体质量、性能和扩展性的降低。本文将会告诉你处理此类情况的方法,并帮助你开发出更好的Python应用。

本文是摘自《Python应用开发实战》的导言部分,这是一个对Python编程的回顾。正因如此,希望你最好已掌握一些关于Python语言的知识,同时也了解面向对象编程(Object Oriented Programming,OOP)的概念。

​点击链接购买纸书

下面是本文内容的组织结构:

我们将从安装的先决条和搭建合适的Python开发环境开始。

为了给本书余下的部分定下基调,下一节将会对本书的高奇幻主题做一个简要介绍。

接下来是我们的第一个程序。这是一个简单的基于文本的奇幻游戏,它是一个Python脚本。

我们会给游戏增加一些复杂度,然后使用简单的函数开发出游戏的改善版本。

接下来,我们会逐渐给游戏增加更多的特性,并用面向对象的概念重新设计代码。

最后会简要提及Python的抽象基类(Abstract Base Class,ABC)。

代码解释会稍显冗余。有经验的读者可以跳过这些例子直接进入下一章,但要确保你已理解本书的主题,并复习一下ch01_ex03.py文件中的代码。


1.1 重要提示

在阅读本文余下的部分之前,让我们先来了解一些事项。如果你尚未了解,你应该阅读前言,其中记录了以下大多数事项:

每章都有各自的一组Python源文件。尽管我们会讨论大部分代码,但是要保证你的手上有相关源文件。

源代码可以从Packt Publishing的网站上进行下载。请参照前言中相关说明。

本书中的示例代码兼容Python 3.5.1版本。支持代码包也提供兼容Python 2.7.9的文件。

正如前文提到的,本书需要读者熟悉Python语言基础,并了解面向对象编程概念。

本书使用一个有趣的、基于文本的游戏主题作为工具来解释应用开发过程的各个方面,但是这本书本身并不是关于游戏程序开发的!

本书通常不提供练习题目(如果有的话)的解决方案。

本书中提供一些外部链接(Uniform Resource Locator,URL)可供读者进行扩展阅读。随着时间推移,某些链接可能会失效。如果出现这种问题,请尝试使用恰当的关键字到网上去搜索。


1.2 安装的先决条件

要确保已经安装了必要的软件。表1-1总结了本章和后续需要的一些基本工具。下一节中会有更详尽的安装说明。

表1-1 安装软件​

​在接下来的章节中,我们需要安装一些其他的依赖软件。Python包管理器(pip)将会完成这项琐碎的工作。

你已经安装了Python的必要环境或者你已经知道如何安装了吗?如果是,那么请你跳过接下来的安装说明,直接进入本书的主题章节,开始真正的实践内容。

安装Python

安装Python有两种方法。你可以使用官方发行版本的Python或者任何一种可免费获取的捆绑发行版本。

1.方法1——官方发行版本

对于Linux或Mac用户来说,你的系统中可能已经安装了Python。如果没有,你可以使用系统中的包管理器进行安装。Windows用户可以通过Python官方网站下载Install Python来安装Python 3.5,如图1-1所示。​

图1-1

如上面的安装截屏所示,在安装过程中,请确保选中“Add Python 3.5 to PATH”的选项。你也可以访问Python的官方网站来下载特定平台的发行版本。

2.方法2——捆绑发行版本

有很多Python免费发行版本,这些版本捆绑了很多实用的包,包括pip和IPython。表1-2总结了一些最流行的Python发行版本,其中包括官方发行版本。

表1-2 Python发行版本​

​3.Python安装位置

让我们简单说说Python的安装位置,以及如何确保在你的终端窗口中

python

是一个可用的命令。当然,事情可能会因情况不同而各异,这取决于你的安装位置和你选择的Python发行版本。

Python的官方文档页面有丰富的关于在不同平台上安装Python的信息。一旦你有超出本书所涵盖内容的需求时,可以参考官方网站给你提供进一步的帮助。

类UNIX操作系统

在类UNIX操作系统如Linux中,典型的默认安装路径通常是/usr/bin/python 或者/usr/local/bin/python。

如果你使用系统中自带的包管理器安装Python,那么在终端窗口中是可以使用命令Python或者Python 3的。如果命令不可用,你需要更新系统环境变量PATH,使其包含Python的可执行文件路径。例如,你的系统中有Bash shell,在用户目录下的.bashrc文件中增加如下配置:​

​用你的Python实际安装路径来替换/usr/bin。

Windows操作系统

在Windows操作系统中,典型的Python默认安装路径如下: C:\Users\name\AppData\ Local\Programs\Python\Python35-32\ python.exe。用你的Windows用户名替换name。根据安装文件和操作系统的不同,Python的安装路径也可能是Python 35-64。正如前面提到的,在安装的时候,你需要选择“Add Python 3.5 to PATH”,以保证Python或python.exe自动被识别为命令。另外,你也可以重新运行安装文件并选中该选项。

4.验证Python安装

打开终端窗口(或者是Windows操作系统中的命令提示符)并输入下面的命令来验证Python的版本。只有安装了Python并且该命令在终端窗口中是可用命令时,那么该命令才会生效。否则,需要指定Python可执行文件的全路径。例如,在Linux上,如果Python安装在/usr/bin下,你可以这样指定/usr/bin/python:​

 注意,上面的命令行中的$符号属于终端窗口,它并不是命令本身的一部分。也就是说,实际的命令只是python -V。在Linux的终端窗口中,对普通用户来说$或%是一个提示符。对root用户(管理员)来说,提示符是#。类似的,在Windows系统中,对应的符号是>。你要在这个符号的后面输入实际的命令。

如果我们运行上述命令,下面是一个可能的输出示例:​

​5.安装pip

pip是一个软件包管理器,它使得从官方的第三方软件库PyPI中安装Python包变得十分简单。pip在Python 2的2.7.9以上版本,以及Python 3的3.4以上版本中已经安装好了。如果你使用其他版本的Python,可以在https://pip.pypa.io/en/stable/installing中找到安装说明。

在Linux操作系统下,pip和Python可执行文件的默认位置是相同的。例如,如果Python安装在/usr/bin/python,那么pip的路径应该是/usr/bin/pip。在Windows操作系统下,pip.exe通常默认安装在如下位置:C:\Users\name\AppData\Local\Programs\Python\Python35-32\ Scripts\pip.exe。正如前文提到,用你的Windows用户名替换路径中的name。根据安装文件和操作系统的不同,Python的安装路径也有可能是Python 35-64。

6.安装IPython

这是一个可选的安装。IPython是一个增强版的Python解释器。如果你使用的发行版本没有捆绑它,那么你可以使用以下命令进行安装:​

​安装完成后,在终端中输入ipython就可以启动IPython的交互shell。Anaconda Python 3.5发行版的IPython shell截图如下。

通常,使用Jupyter Notebook来书写和分享交互程序是非常方便的。它是一个Web应用程序,可以在交互环境下编写带有富文本、图片、函数等内容的Python代码。欲获取更多详情,请访问该项目的主页。Jupyter Notebook可以通过以下方式进行安装:

7.选择集成开发环境

选择IDE进行开发是个人的喜好问题。简单来说,IDE是一个旨在加快应用程序开发的工具。它通过对开发人员最常用的工具的集成,从而让他们能够来快速编写出高效的代码。Python安装时带有一个叫作IDLE的程序。这是一个基础的Python IDE,可供你入门时使用。对于高级的开发,你可以从众多免费的或商业的工具中选择一个。任何一款优秀的Python IDE至少都具有以下几个特点:

具有代码自动完成和语法高亮功能的代码编辑器。

具有可以浏览文件、项目、函数和类的代码浏览器。

具有可以交互识别问题的调试器。

集成版本控制系统,例如Git。

你可以尝试从一款免费的IDE开始。下面列出部分流行的IDE。如果你只对简单的源代码编辑器感兴趣,可以浏览https://wiki.python.org/moin/PythonEditors,表1-3提供了一些可供选择的编辑器。

表1-3 可选的IDE​

1.4 本书的主题

你读过诸如《指环王》或托尔金的《霍比特人》等奇幻小说吗?或者说看过根据这些小说改编的电影吗?那么,好,这是一本高奇幻的、托尔金式的关于Python应用开发的书籍。

更多关于J.R.R.托尔金的作品,请访问相关网站。高奇幻一词通常被用来代表交替虚幻世界中的一些列奇幻主题。

这本书带你来到一个虚构的世界,在那里你将开发一个基于上述主题的文本游戏。是的,即使在这个想象的世界里,你仍然可以继续成为一个开发人员!在阅读本书的过程中,将会有很多许多虚构的人物陪伴着你。当你学习Python开发的不同方面时,这些人物会跟你对话,问问题,提出新的功能,甚至与敌人打架。

应该指出的是,本书不是关于游戏应用程序开发的。本书只是使用一个简单的基于文本的游戏作为一种媒介,来学习Python开发的各个方面。

说一句题外话,如果你有兴趣玩一个高奇幻主题的游戏,那么你有相当多的选择。在诸多开源的项目中,《韦诺之战》是评价最高的、免费的、高奇幻主题的回合制策略游戏。请访问该游戏官网查看更多详情。

了解本书人物

让我们来认识一下本书各章节中那些会一直陪伴你的想象中的人物,参见表1-4。

表1-4 人物说明​

Foo先生

Foo先生是一个人类骑士,一个被描绘成守护着南部平原的大骑士。他是本书中的主要人物,并会在本书中一直与我们进行交谈​

兽人骑士

兽人是一个类似人类的想象中的动物。在这里,他被描绘成一个敌方的士兵。兽人的坐骑是一种类似于野猪的动物。在本章中,你就将遇到这个生物​

精灵骑士

精灵是一种超自然的神灵。精灵通常骑在一匹小马上。他被描绘成一个友好的伙伴。你会在第6章中遇到精灵先生​

仙子

仙子是拥有与生俱来的魔力而且十分聪明的仙女。她的魔法只在第7章(详见O(log n))中使用过一次,用来寻找她的魔法盒。你会在第6章中第一次遇到仙子​

侏儒

侏儒是一种矮小的、类似人类的神话中的存在。他被描绘成为Foo山的“大侏儒”。他问了很多问题。从本书第6章开始的后半部分里,你会看到侏儒的身影有了这个有趣的主题作为一个工具,让我们通过简单的命令行应用程序开始我们的Python之旅。这将是一个基于文本的游戏。在接下来几章中会增加一些复杂度,随之而来的一些有趣的问题会不断给你带来挑战。这本书将向你展示如何优雅地处理这种情况。


1.4 简单的脚本——兽人之袭V0.0.1

我们已经安装了必要的工具和开发环境,现在是时候来编写我们的第一个Python程序了。这是一个简单的靠碰运气取胜的游戏,同时也是一个命令行游戏。随着本书内容的不断推进,我们会给游戏增加更多的复杂度,通过学习到的新技术来开发更加高效的程序。所以,准备行动吧!

1.4.1 游戏简介——兽人之袭v0.0.1

在人类和他们的敌人之间的战争中,兽人就是第一个到来的敌人。一支巨大的兽人军队正在向人类的聚集地进发。他们几乎摧毁了行进道路上的一切。人类不同种族的首领们联起手来击败他们最强大的敌人,来共同为他们的伟大时代而战斗。人们都被召集起来参加了军队。Foo先生,一个保卫南部平原的勇敢骑士,穿过一片未知的茂密森林,开始长途跋涉,向东部进发。两天两夜,他小心翼翼地穿过茂密的树林。在路上,他发现了一个小的孤立定居点。因为疲劳的原因,再加上要希望补充粮食储备,他决定绕道而行。当他走进村庄时,他看见了五个木屋,如图1-2所示。周围没有发现任何人。犹豫之后,他决定走进其中一间木屋……​

​1.4.2 问题说明

你正在设计一个简单的游戏,游戏中玩家需要为Foo先生选择一个木屋。这些木屋是随机被同伴或敌人占据的。同时,有些木屋仍有可能是空闲的。如果选择的是一个被敌人所占据的木屋,那么玩家就输掉比赛。如果是另外的两种场景,那么玩家就赢得比赛。

1.4.3 伪代码——0.0.1版本

现在游戏的目标已经明确了,请打开你最喜欢的编辑器,并记录下主要的步骤。通常这被称作伪代码。

当用户希望一直玩这个游戏时:

  • 打印游戏的任务;
  • 创建一个木屋的列表;
  • 在5个木屋中随机分配敌人、同伴或空闲类型;
  • 提示用户选择一个木屋的编号;
  • 如果选中敌人占据的木屋,打印“你输了”;
  • 否则,打印“你赢了”。

正如你所注意到的,代码的关键部分就是让同伴或者敌人随机占据木屋,并且保持剩下的木屋是未被占据的空闲状态。我们要如何实现呢?让我们用Python解释器来快速地解决这个问题。如果你安装了IPython,启动IPython解释器;否则,就通过在终端窗口中输入

python
命令来使用默认的Python解释器。首先,我们需要一个Python list来保存所有木屋占有者的类型。接下来,我们将使用内置 random模块并调用
random.choice
来从列表中随机取得一个元素。代码如下面的屏幕截图所示:​

​现在,我们只需要编写其他的条件代码即可。接下来,让我们来查看一下代码。

1.4.4 代码查看

从为本章提供的补充代码包中下载源代码文件

ch01_ex01.py
。文件扩展名
.py
表明它是一个Python文件。在Python编辑器或你选择的一款IDE中打开它。建议在阅读以下讨论时,请保持随时能查看该文件。通常能够浏览完整的代码会让你更容易且更好地理解它。观察下面的代码片段,它只是上文提到的文件中的
if __name__ == '__main__'
条件代码块中的一小部分。

如果你安装的是Python 2.7.9的话,支持代码包中有一个单独的Python 2.7.9兼容源代码文件。​

​让我们来看一下上面截图的代码片段。

前两行代码导入了两个内置模块,从而获得这些模块中提供的功能。 textwrap 模块为命令行中的消息提供了很好的格式打印功能。

if条件块 if __name__ == '__main__' ,只有当该文件作为一个独立的脚本运行时才会被调用。换句话说,如果在其他文件中导入此文件,那么在条件块中的代码将不会被执行。

现在,让我们看看这个条件块中的代码。首先,我们会初始化一些变量。如前面所示的那样, occupants 列表存储了木屋占有人的类型。

最后几行代码只是对终端窗口中打印的文本进行格式化。变量 dotted_line 是一个字符串,它是由72个连字符组成的一条长线。

代码中的ASCII转义序列是用来用粗体打印文本。序列\033[1m表示使用粗体文本,\033[0m表示返回到正常的打印样式。

接下来的几行代码主要是在控制台中打印关于游戏的进一步信息:​

​让我们看一看上面截图中的代码:

变量msg是一个非常长的变量。这也是textwrap被时常用到的地方。

使用textwrap.fill会让每行以72个字符长度的方式来对消息进行显示,长度是通过前面代码中定义的变量width来指定的。

现在,让我们来看看下面的while循环吧。

对于Python 2.7.9来说,在上面的第一个示例代码中唯一需要修改的是将调用内置函数input的地方替换成raw_input:​

​最外层的循环让玩家可以选择重新开始游戏。

通过使用 random.choice ,我们可以随机从 occupants 列表中挑选一个占有者,然后把它增加到小木屋的列表中。这个之前有过说明。

内置的

input
函数用一个整数来接受用户选择的一个小木屋编号。变量 idx 用来存储一个数字。

接下来,通过打印明细来表明占有者的信息。最后,根据与小木屋编号对应的列表项来确定赢家。需要注意的是,huts 列表的索引是从0开始的。因此,根据选定的小木屋编号 idx 来取得相应的列表项时,我们需要使用 idx-1 作为列表的索引。

1.4.5 运行兽人之袭v0.0.1

假设你的系统环境变量PATH中已经包含了Python(可能是Python或者Python 3)的话,那么可以通过以下方式在命令行运行该程序:​

​​仅此而已!请玩玩这个游戏,并尝试选择正确的木屋来解救Foo先生吧!下面的Linux终端窗口的快照显示了程序的运行情况:​

​本文摘自《Python应用开发实战》

《Python应用开发实战》

[美] 尼纳德·萨斯叶(Ninad Sathaye) 著 著

​点击链接购买纸书

用Python 3.5构建健壮的、可重用的、高效的应用程序 ;轻松奇幻的学习主线,解决Python开发中遇到的实际问题

本书使用一个生动有趣的、基于文本的游戏主题作为讲解内容来介绍Python应用开发过程的各个方面。全书共10章,涉及简单应用开发、模块化、打包和发布应用的代码、文档规范、单元测试、重构、设计模式、性能监测、性能优化、GUI应用、MVC框架等方方面面的软件开发知识和技能。

今日互动(限于微信端活动,活动地址:微信端点击参加

你认为Python时最简单的编程语言吗?为什么?截止时间6月1日17时,留言+转发本活动到朋友圈,小编将抽奖选出3名读者赠送纸书1本和2张e读版电子书优惠券,(留言点赞最多的自动获得一张)。

异步图书后台回复“5月新书”进入新书交流群,获得第一手新书信息

推荐阅读

2018年5月新书书单(文末福利)

2018年4月新书书单

异步图书最全Python书单

一份程序员必备的算法书单

第一本Python神经网络编程图书

​​​长按二维码,可以关注我们哟

每天与你分享IT好文。


在“异步图书”后台回复“关注”,即可免费获得2000门在线视频课程;推荐朋友关注根据提示获取赠书链接,免费得异步e读版图书一本。赶紧来参加哦!



点击阅读原文,立即购书

阅读原文​​​​