我的Python世界(txt+pdf+epub+mobi电子书下载)


发布时间:2021-08-03 11:38:06

点击下载

作者:程晨

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

我的Python世界

我的Python世界试读:

前言

Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。它具有丰富和强大的库,能够把用其他语言(尤其是C/C++)制作的各种模块很轻松地联结在一起。这两年,随着人们对人工智能的关注越来越多,大家学习Python的热情也日益高涨。Python在IEEE发布的2017年编程语言排行榜中高居首位。

我第一次接触Python还是在诺基亚的塞班时代,它是为数不多的能够在塞班上编程的语言,当时我的感受就是它比较容易理解,不过我还没有真正学习它,它就被大家遗忘了。经过多年的发展,目前Python的功能已经非常强大了,作为一种高级语言,它具有丰富的第三方库,官方库中也有相应的功能模块支持,覆盖了网络、文件、GUI、数据库、文本等大量内容。

Python可以在多种主流的平台上运行,现在有很多领域都采用Python进行编程。目前业内绝大多数大中型互联网企业在使用Python。

我现在也在针对青少年进行一些Python编程的教学工作,为了让大家对Python学习更感兴趣,我以学生比较喜欢的《Minecraft(我的世界)》游戏为载体,通过Python编程来与游戏中的玩家或方块互动,先后实现了“剑球”游戏、五子棋游戏以及像素图像扫描仪这几个项目,最后还实现了通过游戏控制Arduino等外部设备的功能。希望大家能够在游戏的过程中更加轻松地进入Python的世界。本书的内容

本书大体上可以分为前后两部分:前面主要是一些Python的基础知识,包括基本的程序结构(顺序、选择、循环)、字符串、列表、字典、元祖、对象、类库等,这部分内容有3章;后面的部分主要是结合《Minecraft》完成一些交互游戏,包括Mincraft代码入门、“剑球”游戏、五子棋游戏、像素图像扫描仪以及通过游戏控制外部设备的一个小例子,这部分内容有6章。本书面向的读者

目前市面上关于Python编程的书已经有不少了,不过大都是从编程语言的角度来介绍的。而本书以学生比较喜欢的《Minecraft》游戏为载体,所以应该更加简单易学。本书面向的是所有想学习Python语言的人,不过可能需要读者对于《Minecraft》游戏有一定了解,至少应该知道如何操作游戏中的玩家进行探险。

入门之后,大家可以再购买一些专业的Python书籍进行阅读,进一步学习与游戏开发、人工智能算法相关的内容。

为了更适合读者阅读,本书采用全彩印刷形式,这样后面的这些例子看起来会更加直观明了。这里要感谢人民邮电出版社的编辑在出版过程中付出的努力,最后还要感谢现在正捧着这本书的您,感谢您肯花费时间和精力阅读本书。由于时间有限,书中难免存在疏漏与错误,诚恳地希望读者批评指正,您的意见和建议将是我巨大的财富。程晨2018.31Python基础

Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。它具有丰富的和强大的库,能够很轻松地把用其他语言(尤其是C/C++)制作的各种模块联结在一起。这两年,随着对人工智能的关注越来越多,人们对Python的学习热情也越来越高涨。在IEEE发布的2017年编程语言排行榜中,Python高居首位。本书以《Minecraft(我的世界)》游戏为载体,希望能够引领大家更加轻松(Python本身就以简单易用著称)地进入Python的世界。1.1 Python的历史

Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年。他对这个叫作Python的新语言的定位是:一种介于C和shell之间,功能全面,易学易用,可扩展的语言。

这门语言之所以叫Python(巨蟒),是因为Guido van Rossum是电视喜剧《巨蟒组的飞行马戏团》(Monty Python's Flying Circus)的狂热爱好者。该剧是英国的喜剧团体巨蟒组(Monty Python)创作的系列超现实主义电视喜剧,1969 年首次以电视短剧的形式在 BBC 电视频道播出,共推出了 4 季共 45 集节目。随后喜剧团体巨蟒组的影响力从电视扩展到舞台剧、电影、音乐专辑、音乐剧等,被外国媒体认为在喜剧上的影响力不亚于披头士乐队在音乐方面的影响。它的6位成员都是来自牛津大学和剑桥大学的高材生。除去 Python,以流行文化命名的程序语言还有不少,比如 Frink语言的名字来自《辛普森一家》中的 Frink 教授。1.2 Python的发展

1991年,第一个Python编译器诞生。它基于C语言实现,并能够调用C语言的库文件。之后历经不断的换代革新,2004年Python到达了一个具有里程碑意义的节点——2.4版。6年后Python发展到2.7版,这是目前为止2.x版中使用较为广泛的版本。

2.7版不同于以往的2.x版,它是2.x版向3.x版过渡的一个桥梁,在最大程度上继承了3.x版的特性,同时尽量保持对2.x版的兼容性。

在Python的发展历程中,3.x版在2.7版之前就已经问世了。从2008年的3.0版开始, Python 3.x呈迅猛发展之势,版本更新活跃,一直发展到现在最新的3.6.4版。1.3 Python的优缺点1.3.1 Python的优点

Python有以下几个优点。

1. 简单优雅

这是Python的定位,使得Python程序看上去简单易懂,初学者容易入门,学习成本更低。但随着学习的不但深入,Python同样可以满足复杂场景的开发需求。引用一个说法, Python的哲学就是简单优雅,尽量写容易看明白的代码,尽量写更少的代码。

2. 开发效率高

Python作为一种高级语言,具有丰富的第三方库,官方库中也有相应的功能模块支持,覆盖了网络、文件、GUI、数据库、文本等大量内容。因此开发者无需事必躬亲,遇到主流的功能需求时可以直接调用。在基础库的基础上施展拳脚,可以节省你很多时间和精力,大大缩短了开发周期。

3. 无需关注底层细节

Python作为一种高级开发语言,在编程时无需关注底层细节(如内存管理等)。

4. 功能强大

Python是一种前端、后端通吃的综合性语言,功能强大。

5. 可移植性

Python可以在多种主流的平台上运行,开发程序时只要绕开对系统平台的依赖性,就可以在无需修改的前提下运行在多种系统平台上。1.3.2 Python的缺点

Python的缺点有以下几点。

1. 代码运行速度慢

因为Python是一种高级开发语言,不像C语言一样可以深入底层硬件,最大程度上挖掘、榨取硬件的性能,所以用它编写的程序运行速度要远远低于用C语言编写的程序的运行速度。另外一个原因是,Python是解释型语言,代码在执行时会被一行一行地翻译成CPU能理解的机器码,这个翻译过程非常耗时,所以很慢。而C程序是在运行前直接编译成CPU能执行的机器码,所以运行起来非常快。

不过这种慢对于不需要追求硬件高性能的应用场合根本不是问题,因为它们比较的数量级根本不是用户能直观感受到的!

2. 必须公开源代码

因为Python是一种解释性语言,没有编译、打包的过程。所以必须公开源代码。

总体来讲,Python的优点多于缺点,而且缺点在多数情况下不是根本性问题,所以现在很多领域都采用Python进行编程。下面我们就来看看Python所适用的领域。1.4 Python的适用领域

Python可应用于众多领域,具体可以分为以下几个方面。(1)云计算开发。Python是云计算领域最火的语言,典型应用代表为OpenStack。(2)Web开发。众多优秀的Web框架(如Youtube、instagrm、豆瓣等)均使用Python开发。(3)系统运维。各种自动化工具,如CMDB、监控报警系统、堡垒机、配置管理&批量分发工具等的开发均可用Python搞定。(4)科学计算、人工智能。据说用于人机围棋大战的AlphaGo就使用了Python进行开发。(5)图形GUI处理。(6)网络爬虫。现在很多网络爬虫,包括谷歌的爬虫都是使用Python开发的。

目前业内绝大多数大中型互联网企业在使用Python。1.5 Python的安装与使用

虽然本书主要使用的是Raspberry Pi(树莓派)上的Python,而它又是Raspberry Pi自带的,不涉及安装问题,但是Python并不是只能在Raspberry Pi或Linux中使用,在Windows中也可以使用。本节我们就来介绍一下在Windows中如何安装Python。1.5.1 Python的安装

首先,打开Python的官网,界面如图1.1所示。图1.1 Python官网

这个界面中心有一个黄色的按钮,单击这个按钮能够打开一个在线的控制台,如图1.2所示。图1.2 网页中的在线控制台

在这个控制台中,我们就能够初步地感受Python的应用,比如在这里输入copyright之后,控制台就会显示Python的版权信息。

控制台上方有一排选项按钮,将鼠标指针移动到Downloads上,就会弹出Downloads菜单下的选项,如图1.3所示,其中包含各个操作系统版本的Python的下载。

这里由于网页检测到现在使用的是Windows系统,所以在这些子选项的右侧会自动弹出Windws版Python的下载。图1.3 Downloads选项

这里选择Python 3.6.4或Python 2.7.14就可以直接下载了。我由于系统的问题下载了3.x版却安装不了,如图1.4所示,加上之后的程序也没有用到3.x版,我安装的是2.7.14版。图1.4 安装3.x版失败

2.7.14版的安装界面如图1.5所示,安装目录默认为C:\Python27\。图1.5 安装2.7.14版的Python1.5.2 Python的使用

安装完成后,软件会提供两个工具,一个是命令行形式的Python(command line),如图1.6所示,另一个是Python的集成开发环境IDLE,如图1.7所示。图1.6 Python(command line)图1.7 Python IDLE

这两个工具和Python主页上的控制台类似,都能够直观地与Python进行交互。只要在窗口中的>>>提示符后面输入Python命令即可。比如之前输入copyright,回车之后马上就能看到输出结果。当进行一些测试时,尤其是在你刚刚学习Python时,这样的操作非常有用。这两个工具是Python的解释器,前面我们说过Python是一种解释型计算机程序设计语言,就是说我们写的代码要通过解释器解释给计算机,让解释器告诉计算机要进行什么样的处理。解释器有点像日常生活中的翻译,假如我们和一个外国人对话,在双方都没有学过对方语言的情况下是无法正常沟通的,这就需要一个翻译,让翻译将我们说的话解释给对方。

这个解释器是实时的,我们每写一句代码,解释器都会马上翻译过来并反馈给我们执行结果。所不同的是,IDLE有一些菜单选项,集成了一些工具。本书之后的操作都是在IDLE中进行的。

计算是所有编程语言都会涉及的部分,Python也不例外。因此,在Python IDLE的提示符>>>之后输入123+456,回车后你就会在下一行看到结果(579),如图1.8所示。图1.8 在Python中计算1.5.3 编辑器

这两个工具是测试Python的好地方,却不是编写程序的地方,因为我们在其中输入的任何内容都会马上被处理,不会保存下来,而Python程序最好能保存在一个文件中,这样在执行相同的操作时就不需要重复输入这些内容了。一个文件可能包含了很多行编程语言命令,当你运行这个文件时,实际上就是运行了所有的这些命令。

IDLE顶端的菜单选项允许我们创建新文件。对应的操作是在菜单栏中选择File,然后单击New File,如图1.9所示。图1.9 File菜单中的New File

新建文件后会弹出一个空白的窗口(图见1.10),这就是Python的编辑器,是我们编写程序的地方,你可以将它看成一个文本编辑窗口(本质上就是一个文本编辑窗口,只是添加了对一些代码的颜色提示)。图1.10 新建文件窗口

在编辑器窗口中输入以下两行代码:print('Hello')print('World')

你会注意到编辑器中没有提示符>>>。这是因为我们在这里输入的命令不会马上执行,这些内容只是存储在文件里等待我们决定运行它们。如果你愿意,也可以使用记事本或其他文本编辑软件来编写这个文件,不过IDLE编辑器和Python整合得比较好,它对于Python语言的关键字会显示出不同的颜色,这样在你编写程序时就能起到辅助作用。上面两行代码在编辑器中的显示效果如图1.11所示。图1.11 关键字在编辑器中显示的颜色不一样

接下来,我们需要保存这个新建的文件,只有保存后,代码才能够运行。这里我将这个文件命名为hello.py,如图1.12所示。图1.12 保存文件名为hello.py

此时,如果想要运行程序查看运行结果,就需要在编辑器的Run(运行)菜单中选择Run Module(运行模块)。之后你就会在IDLE中看到程序的运行结果——输出两个单词Hello和World,它们各占一行,如图1.13所示。图1.13 程序输出结果

你在IDLE中输入的内容不会保存在任何地方;因此,如果你退出IDLE然后重新启动它,之前输入的所有内容都将丢失。

说明:之后的内容我们会尽量使用文本的形式,而不是截图的形式。如果是要在IDLE中输入的内容,会在前面加上提示符>>>,而结果将会出现在接下来的一行。如果你准备使用Raspberry Pi上的Python IDLE,那么可以先阅读一下第4章的前几节,然后再回来阅读下面的内容。1.6 关键字

Python是一种很纯净的语言,只保留了34个关键字,见表1.1。这些关键字是语言的核心,在编写程序时,我们通过关键字来构建整个程序的结构和逻辑。表1.1 Python中保留的关键字1.7 数字

数字处理是编程的基础,所以下面我们要开始进行一些数字操作,而进行这种操作的最好地方就是IDLE。

在Python IDLE中输入以下内容:>>> 45*240/36 + 11311

相比之前的那个加法的例子,这个运算其实不算复杂,不过,这个例子告诉了我们:

· 乘法运算的符号是*;

· 除号运算的符号是/;

· Python执行乘除运算要先于加减运算。

如果你想让某些部分优先运算,最保险的方式就是增加一对圆括号,比如:>>> 47*240/(36 + 11)240

这里使用的数字都是整数(在编程时通常称其为整型)。而如果我们愿意,还可以使用小数,在编程时,这样的数字被称为浮点数,因为数字中有一个浮动的小数点。1.8 变量

介绍了数字之后,下面再来说说变量。

变量可以理解为一个存放东西的盒子,盒子的名称就是变量名,而变量的值就是其中存放的东西。变量的赋值形式上有点像代数中用字符来代替数字。我们通过以下的命令开始:

>>> k = 9.0 / 5

这里,等号表示把一个数值赋给变量,即将某个东西放到盒子当中。变量名必须在左侧而且中间不能有空格;变量名的长度由你决定,甚至可以包含数字以及下划线(_)。不仅如此,变量还可以使用大写和小写字母。这些都是变量命名的规则;除此之外,还有一些约定。约定与规则的区别是:如果你不遵守规则,Python会提示你有错误,程序不能运行;如果你不遵守约定,你的程序的可读性可能会变差,但程序可以运行。

变量的约定是它们通常由表示变量含义的几个单词构成,由于中间不能有空格,所以这些单词是连在一起的,其中第一个单词的第一个字母是小写的,而后面的单词的第一个字母是大写的。这样的命名约定叫作驼峰命名法。除此之外,还有一种命名法是以小写字母开头,中间使用下划线将各个英文单词分隔开。

我们通过表1.2中的一些例子让你感受一下什么是规则,什么是约定。表1.2 变量命名

坚持按照约定来命名,这样会让其他的Python程序员更容易读懂你的程序,同时你自己也能更好地理解自己的程序。

如果你写了一些连Python都不懂的语句,就会得到一个错误提示信息。试着输入以下代码:>>> 2beOrNot2be = 1SyntaxError: invalid syntax

出错是因为你尝试定义的变量名以数字开头,这是不符合规则的。

回到之前的代码,当我们输入赋值语句之后回车,IDLE好像并没有什么反应,接下来的一行还是以提示符>>>开头,表示等待我们输入信息。这是因为赋值语句执行的操作是将一个数值赋给变量,这个操作并没有输出消息。如果我们想查看变量的值,只需要输入k就可以了,如下:>>> k = 9.0/5>>> k1.8

Python会记得变量k的值,这表示我们可以在其他表达式中使用这个变量。试试输入以下代码:>>> 20 * k + 3268.0

这里再进行运算时,我们直接使用了变量k,将其代入运算当中,得到的结果是68,此处显示68.0表示它是一个浮点数,因为k的值是一个浮点数。1.9 程序的基本结构

Python的运算功能我们就测试到这里,不过程序的运行只依靠计算还不够,还需要有逻辑结构。在程序执行的过程中,有3种基本结构:顺序、选择和循环,所有程序都可以由这3种基本结构组合而成。某些情况下要根据条件来决定执行哪块代码,这就需要使用选择结构来实现;某些情况下需要不断地重复执行某些代码,这就需要使用循环结构来实现。1.9.1 for循环

顺序结构很好理解,就是按照代码的顺序一步一步地执行。而在选择结构和循环结构之间,我们先来介绍循环结构。循环的意思就是让Python能够将一个任务执行一定次数或一直执行,而不是仅仅运行一次。在下面的例子中,你会在Python中输入多行命令。当你按一下回车键跳到下一行时,你会发现Python在等待。它没有马上运行你输入的命令是因为它知道你还没有写完。Python中以字符:结尾表示后面还有命令要写。

之后的代码前面会有一个缩进。在Python中没有大括号,代码的层次主要依靠缩进来实现。为了运行这两行程序,需要在第二行之后按两下回车键。>>> for x in range(1, 10):print(x)123456789>>>

我们能够看到虽然只写了两行,但却有9行数据输出。这段程序中用到了一个range函数,这个函数的功能是在一定范围内生成一段数字的列表,函数有两个参数,参数之间用逗号隔开,表示数字范围的起始与结束,在上面的例子中,这两个参数是1和10。由于数字的列表不包含结束的数字,所以上面输出的数字就是从1到9,而不是从1到10。

这段程序中另外一个要点就是用于循环的for命令,for命令由两部分组成。单词for之后必须跟一个变量名,在循环中,这个变量每次都会被赋予一个新值。因此,循环到第一次时,它的值就是1;循环到第二次时它的值是2,依此类推。单词in是和for配合使用的,在单词in之后,Python要求这部分是循环中各项的列表。这里这个列表就是从1到9的数字。

print命令同样需要一个参数,这个参数表示程序输出到IDLE的内容。这个循环,每一次都会打印x的值。1.9.2 if选择结构

了解了for循环结构,我们再来看看if选择结构。选择的意思就是让Python判断一个条件,只有条件成立,才会执行某一段代码。选择结构涉及比较与逻辑运算,将在下一节介绍,这里我们先简单地用True和False来表示。当Python告诉我们True或False,或者我们告诉Python条件是True或False时,实际上是在说“真”或者“假”,“成立”或者“不成立”,这种特殊的值叫作“逻辑值”。跟在if后的任何条件都会被Python转换为逻辑值(当然也可以直接在if后面跟一个逻辑值),以决定是否执行下一行代码。

尝试输入以下代码。>>> if True:print("welcome")welcome>>> if False:print("bye bye")>>>

这里的情况与上面的类似,if之后也是以冒号结束的,表示后面还有代码。而代码完成后,我们要按两下回车键才能够执行。通过操作你会发现,第一个if后面跟着True时,就会执行后面的代码,并输出welcome;而第二个if,由于后面跟的是False,所以后面的代码就不会执行。

上面的代码还能够用if……else……来完成,else表示“否则”,即条件成立时执行if后面的代码块,条件不成立时则执行else后面的代码块,具体代码如下:>>> if True:print("welcome")else:print("bye bye")welcome>>>

如果if后面的条件是变化的,那么当条件不成立时就会执行else中的内容。这样的结构中,同一时间,只可能打印两条信息中的一条。另外if结构还有一种变化是elif,就是else if的缩写,我们会通过具体的例子加以说明。1.9.3 比较

在程序中最直观的条件就是测试两个值是否相等,这要用到==。该符号属于比较运算符。我们用表1.3来展示一下不同的比较运算符。表1.3 比较运算符

比较运算的结果是一个True(真)或False(假)的“逻辑值”,你可以用这些比较运算符在IDLE中做几个测试,比如:>>> 7 > 3True

这里,相当于我们问Python:“7真的比3大吗?”Python回复说:“真”。现在让我们问问Python:“7是不是比3小?”>>> 7 < 3False

这次返回的就是False,如果将比较运算放在上面的代码中,则代码如下:>>> if 7<3:print("welcome")else:print("bye bye")bye bye>>>

这里由于if后面的值是False,所以最后的输出就是“bye bye”。1.9.4 逻辑运算

True或False的“逻辑值”并不只是能够表示条件是否成立,它们同样也能进行运算,这些逻辑值也可以像之前讲过的加减算术运算一样进行组合。不过True和True相加是没有意义的,“逻辑值”的运算不是加、减、乘、除,而是与、或、非,对应的逻辑运算符是and、or、not。逻辑运算符及对应的含义如表1.4所示。表1.4 逻辑运算符

大家可以尝试一下以下的操作。>>> True and TrueTrue>>> True and FalseFalse>>> True or FalseTrue>>> not TrueFalse>>>

这里当True和True进行“与”操作(and)时,返回的结果是True;True和False进行“或”操作(or)时,返回的结果也是True;而当True和False进行“与”操作(and)时,返回的结果是False;最后not True返回的结果就是False;同样,not False返回的结果就是True。

对于逻辑运算,我们通常采用真值表的形式来表示。“与”运算(and)和“或”运算(or)的真值表见表1.5和表1.6。表1.5 与运算(and)的真值表表1.6 或运算(or)的真值表1.10 掷骰子

了解了以上的内容后,本节我们来完成一个掷骰子的小程序。1.10.1 随机数

掷骰子需要用到一个随机数的概念,由于随机数相关的模块或函数本身并没有包含在Python当中,所以我们需要先将它们导入之后才能使用。导入要用到关键字import,本书的后面你会学到很多关于库的内容,现在大家可以尝试以下的内容。>>> import random>>> random.randint(1,6)5

这里的第一行是导入随机数random的模块或函数,这个操作是没有返回的显示内容的,所以直接出现了提示符>>>等待我们输入。而第二行我们使用了random的函数randint来生成一个随机数,这个函数有两个参数,表示随机数的范围,因为通常骰子有6个面,分别用点来表示6个数,所以这里随机数的范围是1~6。

上面的代码中生成的随机数是5,将第二行多输入几次,你应该可以获得1~6的不同随机数。1.10.2 重复掷骰子

下面我们来写一个程序模拟掷10次骰子。为了避免重复输入代码,我们将这些内容写在之前的hello.py文件中。完成后的代码如下。print('Hello')print('World')import randomfor x in range(1, 11):randomNumber = random.randint(1, 6)print(randomNumber)

这里由于range函数不会取参数中最大的一个值,所以如果要想循环10次,则参数需要是1和11,或者是0和10。

代码完成后在编辑器中的效果如图1.14所示。

保存代码后,从Run(运行)菜单中选择Run Module(运行模块),结果就会显示在IDLE中,如下。============================ RESTART: D:/hello.py ============================HelloWorld 4146335112>>>图1.14 重复掷骰子的程序1.10.3 掷两个骰子

为了增加一些变化,我们再多加一个骰子。而每次输出的信息则是两个骰子随机数之和。为此我们新建了一个变量total,用来存放两次骰子的值,对应代码如下。print('Hello')print('World')import randomfor x in range(0, 10):randomNumber1 = random.randint(1, 6)randomNumber2 = random.randint(1, 6)total = randomNumber1 + randomNumber2print(total)

对于两个骰子的情况,如果两个骰子掷出的数一样,这个概率相对而言是比较小的,我们希望程序能够有一个提示,这就需要用到if选择结构,即当两个数一样时,输出“double”信息。

对应的代码如下。print('Hello')print('World')import randomfor x in range(0, 10):randomNumber1 = random.randint(1, 6)randomNumber2 = random.randint(1, 6)if randomNumber1 == randomNumber2:print("double")total = randomNumber1 + randomNumber2print(total)

这里用if选择结构判断了randomNumber1和randomNumber2这两个值,如果两个值相等,则会执行之后的print函数;如果两个值不相等,就不会输出“double”信息。代码执行的效果如下。============================ RESTART: D:/hello.py ============================HelloWorld8double6double1087118double10114>>>1.10.4 大小判断

判断出两个骰子掷出的点数是否相等后,最后我们再来将两个数不一样时的数据进行一个大致的划分。我们要实现的功能是:如果两个数的和大于8,那么输出“big”;如果两个数的和小于等于8,但大于4,那么输出“not bad”;如果两个数的和小于等于4,那么输出“small”。

这里要注意,所有的这些判断都是在两个数不相等的情况下才进行的,对应的代码如下。print('Hello')print('World')import randomfor x in range(0, 10):randomNumber1 = random.randint(1, 6)randomNumber2 = random.randint(1, 6)total = randomNumber1 + randomNumber2print(total)#首先判断两个数是不是一样if randomNumber1 == randomNumber2:print("double")else:#如果不一样的话,再判断两个数之和的大小if total > 8:print("big")elif total > 4 and total <=8:print("not bad")else:print("small")

这段代码中,有几行是以#号开头的,表明这几行不属于代码,它们只是注释, Python会直接忽略以#号开头的代码行。注释不会影响程序的正常运行,但这样的额外内容能够增加程序的可读性。在Python中,单行注释用#开头,单独一行或者在代码后面通过#跟上注释均可,多行注释在首尾处用成对的三引号引用即可,可以是成对的3个单引号,也可以是成对的3个双引号。

另外,这段代码中我们还用到了elif,通过elif我们实现了一个3分支的选择结构。elif是else if的缩写,它的后面也需要跟一个条件,只有不满足第一个条件并满足第二个条件的情况才会执行其中的内容。所以如果这部分的判断写成以下样式也是可以的。#如果不一样的话,再判断两个数之和的大小if total > 8:print("big")elif total > 4 :print("not bad")else:print("small")

不过通常我们在程序中还是会按照完整的判断条件来写。最后一个else是指第一个条件和第二个条件都不满足的情况下才会运行其中的内容。

这样我们这个掷骰子的小程序就算完成了,需要说明的是在if选择结构中可以添加多个elif,以构成有更多分支的选择结构,如果大家感兴趣,可以自己尝试一下。1.11 While

另外一种循环命令是while,它与for循环稍有不同。while命令像if命令一样都要紧跟着一个条件,这个条件能够让循环持续执行。换句话说,只要条件为真,循环内的代码就会不断地重复执行。这意味着你要小心设定条件,要保证在某些情况下条件不会成立;否则,这个循环就会永无止境地运行下去了。

为了说明如何使用while,我们继续更改掷骰子的程序,这次我们不会限定掷骰子的次数,而是要等到丢出一对6时才停止。print('Hello')print('World')import randomrandomNumber1 = 0randomNumber2 = 0while not (randomNumber1 == 6 and randomNumber2 == 6):randomNumber1 = random.randint(1, 6)randomNumber2 = random.randint(1, 6)total = randomNumber1 + randomNumber2print(total)#首先判断两个数是不是相等if randomNumber1 == randomNumber2:print("double")else:#如果不相等,再判断两个数之和的大小if total > 8:print("big")elif total > 4 :print("not bad")else:print("small")

我们修改的主要位置就是循环的部分,将原来的for循环变为了while循环,其条件就是没有丢出一对6的情况下一直循环下去。

对于while循环来说,还有一种停止的方式,就是使用关键字break来跳出循环,此时while循环的条件就可以是True了。修改后的代码如下。print('Hello')print('World')import randomwhile True:randomNumber1 = random.randint(1, 6)randomNumber2 = random.randint(1, 6)total = randomNumber1 + randomNumber2print(total)#首先判断两个数是不是相等if randomNumber1 == randomNumber2:print("double")if randomNumber1 == 6:breakelse:#如果不相等,再判断两个数之和的大小if total > 8:print("big")elif total > 4 :print("not bad")else:print("small")

这个循环的条件被设定为永久为真,所以,循环会一直不断地重复,直到遇到break,而这种情况只有等到丢出一对6时才会发生。通过这两个变化,我们能够看到使用break实际上要比修改while循环的条件更简单,因为修改条件我们必须考虑到所有停止循环的条件,而使用break则要灵活得多。2字符串、列表和字典

了解了Python的一些基础知识,在本章中,你会首先尝试一下各种常用的数据,并给你的Python程序添加一些结构。然后你会把所学的一切放在一个简单的猜词游戏中。这是一种玩家通过询问单词中是否包含指定的字母来完成的猜词游戏。本章的结尾还有一个参考部分,这部分会列出数学、字符串、列表和字典方面所有你需要知道的最有用的内置函数。2.1 字符串2.1.1 字符串的定义

在编程方面,字符串(String)是程序中的一串字符(字母、数字或其他符号)的组合。在Python中,如果想用变量来保存一个字符串,你只需要使用普通的等号“=”赋值就可以了,不过与赋值数字变量不同的是,赋值字符串变量时需要将字符串用引号引起来,就像这样:

>>> bookName = "My Python World"

如果你想看到变量的内容,可以直接在IDLE里输入变量名,也可以像我们处理数字变量一样使用print函数。>>> bookName'My Python World'>>> print(bookName)My Python World

这两种方法输出的结果有一些细微的差别。如果只是输入变量名,Python会在输出结果的两端加上单引号,以表明输出结果是一段字符串。如果使用print命令,Python只会输出对应的内容。

注意:定义字符串时也可以直接使用单引号,双引号和单引号两者都可以,不过假如字符串当中本来就有一个单引号,那么定义字符串时就只能使用双引号了。2.1.2 字符串的方法

对于Python这样的面前对象的编程语言,字符串也是一个对象,这样的对象本身就有一些函数或方法。

例如你能通过下面的命令知道字符串中有多少个字符。>>> len(bookName)15

在Python当中,字符串还可以看作一个字符的数组,每一个字符都有自己的位置,我们的字符串变量bookName可以理解为表2.1所示的形式。表2.1 字符串变量

通过下面的命令就能知道特定位置是什么字符。>>> bookName[3]'P'

这里有两点需要强调:首先,数组中的参数要使用方括号而不是圆括号括起来;其次,位置是从0开始的,而不是从1开始的。所以如果你想知道字符串的第一个字母,需要输入以下命令。>>> bookName[0]'M'

如果输入的数字太大,超过了字符串的长度,可能会看到以下信息。>>> bookName[33]Traceback (most recent call last):File "", line 1, in bookName[33]IndexError: string index out of range>>>

这是一个错误提示信息,Python在告诉我们出了一些问题,我们最好仔细阅读这些提示信息,这样在编程时就能够更快地解决问题。这里信息中“string index out of range”部分表示字符串的索引值超出了字符串的长度。

你还可以截取一个长字符串中的一部分,如:>>> bookName[0:9]'My Python'

方括号内的第一个数字是截取字符串的起始位置,而第二个数字并不像你想象中的那样代表结尾位置,而是把结尾的位置加1。

接着尝试把World这个单词从字符串中取出来。如果你不指定中括号中的第二个数字,那么,就默认是字符串的最后一个字符。>>> bookName[10:]'World'

同样,如果不指定第一个数字,则默认是0。

最后,我们还可以用加号“+”把字符串连在一起,比如:>>> "welcome to "+bookName'welcome to My Python World'2.2 列表2.2.1 列表的定义

列表可以看作许多变量的排列,这里的变量值可以是数字,也可以是字符串,甚至可以是另外一个列表。上一节中的字符串也可以理解为一个字符的列表。下面这个例子会告诉你如何创建一个列表。注意这里列表也可以使用len方法。>>> numbers = [123, 34, 56, 321, 21]>>> len(numbers)5

定义列表时要是有方括号,表示具体的某一个列表中的变量时也要使用方括号,就像在字符串中我们可以用方括号表示字符串中某个位置的字符一样。和字符串操作类似,我们也可以从一个较大的列表中截取一小部分。>>> numbers[0]123>>> numbers[1:3][34, 56]

另外,你还可以使用等号“=”来给列表中的某一项赋予新值,比如:>>> numbers[0] = 1>>> numbers[1, 34, 56, 321, 21]

这样就把列表中的第一个项(0项)从123变成了1。

与处理字符串类似,你还可以用加号“+”把列表组合起来:>>> moreNumbers = [78, 9, 81]>>> numbers + moreNumbers[1, 34, 56, 321, 21, 78, 9, 81]2.2.2 列表的方法

如果你想将列表排序,可以使用sort方法,操作如下。>>> numbers.sort()>>> numbers[1, 21, 34, 56, 321]

如果你想从列表中移除一项,可以使用pop方法,如下面的代码所示。如果你不指定pop的参数,代码只会移除列表中的最后一项,同时返回它。>>> numbers[1, 21, 34, 56, 321]>>> numbers.pop()321>>> numbers[1, 21, 34, 56]

如果你在pop的参数中指定一个数,那么这个位置的内容就会被移除,举例如下。>>> numbers[1, 21, 34, 56]>>> numbers.pop(1)21>>> numbers[1, 34, 56]

同样,你也能在列表的指定位置插入某一项。insert函数有两个参数,第一个参数是插入的位置,而第二个参数是插入的内容。>>> numbers[1, 34, 56]>>> numbers.insert(1,90)>>> numbers[1, 90, 34, 56]

列表可以写成非常复杂的结构,可以包含其他列表,也可以混合不同的数据类型——数字、字符串以及逻辑值。我们以下面的这个列表来说明。>>> complexList = [123, 'hello', ['otherList',3 , True]]>>> complexList[123, 'hello', ['otherList', 3, True]]

这个列表中的第一项是一个数字,第二项是一个字符串,而第三项是另外一个复杂的列表。如果你想指定第三项中的某一项内容,可以采用操作二维数组的方式,如下:>>> complexList[2][2]True

这里指定了列表complexList中第三项(从0开始计算,所以方括号中是2)的第三项,即最后的那个“逻辑值”。2.3 函数

目前我们写的这些程序功能都比较单一,所以没必要过于规范,它们实现的功能很容易理解。不过随着程序不断增大,功能会越来越复杂,我们就有必要把程序分割成一个个叫作“函数”的单元。当我们再进一步学习程序的话,还将了解到可以通过类和模块将程序结构化。

之前我们用到的range和print其实是Python的内建函数。不论是什么程序,软件开发中最大的问题都是复杂性管理。优秀的程序员编写的软件有很强的可读性,易于理解,不需要太多的解释,几乎一看就懂。函数就是创建简单易懂的程序的关键,它能够在避免整个程序陷入混乱的前提下轻易地完成程序的修改。

函数可以看作一段执行固定功能的程序的集合。一个我们声明的函数能够在程序中的任何地方调用。函数执行完成后,程序会回到调用函数的位置继续往后执行。

举个列子,我们创建一个函数,函数的功能是接收一个字符串作为参数,然后在字符串的最后加上 please。新建一个文件输入以下内容,然后运行程序看看会发生什么。#定义函数def addWord(sentence):newString = sentence + ' please'return newStringprint(addWord('Seat down'))

函数以关键词def开头,后面跟着函数名,这就像之前给变量命名一样。之后的圆括号里是参数,如果参数的个数大于1,就需要用逗号隔开。第一行必须以冒号结尾。

第二行会有一个缩进,表示这是在函数内部,我们使用了一个叫作newString的新变量,用来保存传入的字符串以及后面添加的“ please”(注意please前面还有一个空格)。这个变量只能用于函数内部。

函数的最后一行是return命令,它指定了函数被调用时的返回值。它就像三角函数,如Sin一样,当你输入一个角度后会返回一个数字。在这里,返回的就是变量newString的值。

要调用这个函数时,只需要使用函数的名字并提供合适的参数即可。函数的返回值不是必需的,因为有些函数只是为了执行一些操作,而不是为了反馈什么。比如,我们可以写一个没什么实际价值的函数,它的功能就是按指定的次数反复打印“Hello”,内容如下。def say_hello(n):for x in range(0, n):print('Hello')say_hello(5)

如果你对以上两段程序都没什么疑问,我想你已经能够编写函数了,是不是觉得没那么复杂?2.4 猜词游戏2.4.1 游戏规则

在学习了函数的基本内容后,本节我们来完成一个猜词游戏。规则是:游戏开始时,程序会先选择一个单词,然后对应单词的字母数画几条短线,由玩家来猜这个词。玩家每次只能猜一个字母,如果猜的字母不包含在单词里,就算失误一次;如果猜的字母包含在单词中,就需要把猜到的字母写在对应的短线上。然后玩家再猜下一个字母,直到猜对单词或失误次数达到最大值,游戏结束。2.4.2 创建单词库

首先肯定要新建一个文件,然后在文件中建立一个单词的列表供程序选择,以下是建立字符串列表的工作。

words = ['chicken', 'dog', 'cat', 'mouse', 'frog']

然后我们创建一个函数随机地选择一个单词,代码如下。import randomwords = ['chicken', 'dog', 'cat', 'mouse', 'frog']def pickWord():return random.choice(words)print(pickWord())

多运行几次这个程序,看看能不能选择列表里的不同单词。random模块中的choice函数能随机地选出列表中的某一项。2.4.3 游戏结构

完成了单词库之后,就需要来完善一下游戏的结构了。

由于玩家在猜单词时是有次数限制的,所以我们先定义一个新变量guessTimes。这是一个整数变量,我们先设定可以猜14次,每猜错一次,变量就会减1。这种变量叫作全局变量,我们在程序的任何地方都可以使用它。

有了新变量,我们还需要写一个名为play的函数来控制游戏。根据游戏规则,我们是知道play是做什么的,只是暂时无法具体到细节。因此,我们在写play函数时可以先把一些需要用到的函数写出来,比如getGuess和processGuess,就像刚刚写的pickWord函数一样,内容如下。def play():word = pickWord()while True:guess = getGuess(word)if processGuess(guess, word):print('You win!')breakif guessTimes == 0:print('Game over!')print('The word was: ' + word)break

猜词游戏首先进行选词操作,然后是一个无限循环,直到单词被猜出(processGuess返回True)或是guessTimes 减少到0。每次经过循环,游戏都会让玩家猜一次。

目前这个程序还不能运行,因为函数getGuess和processGuess还没有实现。但是,我们可以先写一点简单的内容,让我们的play函数先运行起来。这些简单的功能可能会有一些输出的或反馈的信息。这里我写的内容如下。def getGuess(word):return 'a'def processGuess(guess, word):global guessTimesguessTimes = guessTimes - 1return False

getGuess中的内容是模拟玩家一直猜字母a,而processGuess中的内容是一直假设玩家猜错,这样guessTimes 就会减1,然后返回False,也就意味着玩家没猜对。

processGuess中的内容有些复杂,第一行告诉Python,guessTimes 是一个全局变量。如果没有这一行,Python会认为它是一个函数内部的新变量。然后函数中将guessTimes减1,最后返回Fales,意味着玩家没猜对。最终,我们会判断玩家是否猜中了单词。

此时完成后的代码如下。import random words = ['chicken', 'dog', 'cat', 'mouse', 'frog']guessTimes = 14def pickWord():return random.choice(words)def play():word = pickWord()while True:guess = getGuess(word)if processGuess(guess, word):print('You win!')breakif guessTimes == 0:print('Game over!')print('The word was: ' + word)breakdef getGuess(word):return 'a'def processGuess(guess, word):global guessTimesguessTimes = guessTimes - 1return Falseplay()

如果运行程序,你将得到如下结果。Game over!The word was: chicken>>>

此时因为很快用掉了14次猜词的机会,所以Python会告诉我们游戏结束了,同时输出正确的答案。2.4.4 完善函数

现在我们需要做的就是尽快完善这个程序,用实际的函数替换之前简单的内容。我们还是从getGuess开始,这个函数要求我们输入一个所猜的字母,然后将这个字母反馈出来供其他函数使用,另外我们希望在这个函数开始时能将现在猜词的情况显示出来,同时提示我们还有几次猜词的机会,完成后的内容如下。def getGuess(word):printWordWithBlanks(word)print('Guess Times Remaining: ' + str(guessTimes))guess = raw_input(' Guess a letter?')return guess

函数中首先要做的就是用函数printWordWithBlanks告诉玩家当前猜词的状态(比如c--c--n),这是另外一个我们需要完善的程序,然后告诉玩家还有几次机会。注意,因为我们希望在字符串“Guess Times Remaining:”之后显示数字(guessTimes),所以这里用str函数将数字变量转换成了字符串类型。

函数raw_input会把参数作为提示信息输出显示,然后返回用户输入的内容。注意这里因为用的是Python2.x,所以使用的是

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载