书名:Python编程基础教程
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 [印度] H.巴辛(H.Bhasin)
译 李 军
责任编辑 陈冀康
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
Simplified Chinese translation copyright ©2020 by Posts and Telecommunications Press
ALL RIGHTS RESERVED
Python Basic by H.Bhasin
ISBN:978-1-683923-53-4
Copyright ©2019 by Mercury Learning and Information LLC.
本书中文简体版由Mercury Learning and Information LLC公司授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。
版权所有,侵权必究。
本书是Python编程方面的入门教程。全书共20章,通过浅显易懂的语言和丰富实用的示例,介绍了对象、条件语句、循环、函数、迭代器、生成器、文件处理、字符串处理、面向对象范型、类、继承、运算符重载、异常处理、数据结构、栈、队列、链表、二叉搜索树等编程知识,并介绍了NumPy、Matplotlib等库的应用。
本书不仅适合Python初学者阅读,也适合高等院校计算机相关专业的学生参考。
如今,Python已经是非常热门的编程语言。实际上,Python语言已经有三十多年的历史了。Python是吉多·范·罗苏姆(Guido Van Rossum)在20世纪80年代后期开发的一种功能强大的、过程式的、面向对象的编程语言。Python之所以很流行,主要归功于它的简单性和健壮性,当然,还有很多其他的因素,本书也会详细介绍。
在作者看来,Python是一种值得学习的语言。学习Python不仅会激发你去用最简单的方式完成高度复杂的任务,而且还会打破传统编程范型的藩篱。Python是能够改变你的编程方式,进而改变你看问题的角度的一种语言。
本书是面向初学者的一本Python基础教程。全书共20章和5个附录。各章的主要内容如下。
第1章介绍了Python语言的历史,阐述了学习Python编程的重要性及特点、Python的应用领域,并且介绍了Anaconda的安装步骤。
第2章介绍了变量、运算符、关键字和对象,说明了如何使用数字和分数,讨论了字符串、列表和元组,以及它们的相关操作。
第3章介绍了如何在程序中使用条件语句。
第4章分别介绍了while和for循环及用法。
第5章介绍了模块化编程的思想以及如何定义函数,还讲解了作用域和递归的概念。
第6章主要介绍迭代器、生成器和列表解析。
第7章介绍文件的处理,讲解了Python中用于文件操作的各种函数。
第8章介绍了字符串的概念及其重要性,讲解了字符串运算符、操作字符串的内建函数,展示了如何使用字符串解决问题。
第9章介绍并比较了过程式范型、模块式范型和面向对象范型,引入了类的概念,介绍了类的设计和面向对象编程的基础知识。
第10章进一步介绍了类和对象的关系,讲解了在Python中如何创建类、继承类和使用对象,还涉及成员函数、实例、类变量、构造函数和析构函数等概念。
第11章重点介绍继承的概念,包括继承和组合之间的差异、继承的类型、self和super的作用,以及抽象类的概念。
第12章介绍了重载的概念,包括运算符重载、构造函数重载以及实现运算符重载的各种方法,展示了对复数和分数实现运算符重载的方法。
第13章介绍了异常处理,涉及try/except的用法、手动抛出异常等。
第14章介绍了数据结构的概念,介绍了栈、队列、树和图等典型的数据结构,以及算法、迭代算法、递归算法等概念,说明了冒泡排序、选择排序和合并排序等各种排序方法。
第15章主要讲解栈和队列这两种数据结构,介绍了如何使用动态表来实现栈,介绍了后缀表达式、前缀表达式和中缀表达式,以及各种表达式之间的转换,还展示了栈和队列的应用。
第16章介绍了链表,涉及如何向给定的链表插入项以及从中删除项,展示了如何使用链表实现栈和队列。
第17章主要介绍二叉搜索树的特征,并且实现了一个BST的插入、搜索和遍历。
第18章介绍Python用于数学计算的NumPy库,讲解了如何使用Numpy创建一维和多维数组以及实现数组的各种操作。
第19章介绍了Matplotlib库,展示了如何用它创建线图、曲线图以及绘制三维图形。
第20章关注图像处理,介绍了图像处理、裁剪等概念,讲解如何从图像提取信息,以及执行旋转、变换和缩放等操作。
附录A介绍了Python中的多线程。附录B介绍了正则表达式在Python中的用法。附录C给出了实践练习和编程问题。附录D给出了实践练习的选择题。附录E给出了各章练习的选择题的答案。
本书适合Python编程的初学者学习,也适合高等院校计算机专业的师生参考、阅读。在异步社区(epubit.com)本书的网页上,提供了本书的配套代码,供读者下载和使用。
本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关资源和后续服务。
本书为读者提供源代码。要获得以上配套资源,请在异步社区本书页面中单击,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎读者将发现的问题反馈给我们,帮助我们提升图书的质量。
如果读者发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入勘误信息,单击“提交”按钮即可。本书的作者和编辑会对读者提交的勘误进行审核,确认并接受后,将赠予读者异步社区的100积分(积分可用于在异步社区兑换优惠券、样书或奖品)。
我们的联系邮箱是contact@epubit.com.cn。
如果读者对本书有任何疑问或建议,请发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果读者有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线提交投稿(直接访问www.epubit.com/ selfpublish/submission即可)。
如果读者来自学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果读者在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请将怀疑有侵权行为的链接发邮件给我们。这一举动是对作者权益的保护,也是我们持续为读者提供有价值的内容的动力之源。
“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT技术图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT技术图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。
“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。
异步社区
微信服务号
学完本章,你将能够
艺术是人类创造力的一种表现,因此编程也是一种艺术。因此,编程语言的选择非常重要。本书介绍Python,这是一种能够帮助你成为伟大的艺术家的语言。图灵奖获得者、美国普度大学教授艾伦·佩利(A. J. Perlis)曾经说过:“如果一种语言不能对你思考编程的方式产生影响,那么这种语言是不值得学习的。”
Python是一种值得学习的语言。学习Python不仅会激发你用最简单的方式完成高度复杂的任务,还会打破传统编程范型的藩篱。Python是能够改变你的编程方式进而改变你看问题的角度的一种语言。
Python是吉多·范·罗苏姆(Guido Van Rossum)在20世纪80年代后期开发的一种功能强大的、过程式的、面向对象的编程语言。Python这个名字来自一个名为Monty Python的戏剧团体。Python当前应用于各种开发领域,包括软件开发、Web开发、桌面GUI开发、教育和科学计算应用开发。因此,它实际上涉足了所有的开发领域。Python之所以很流行,主要归功于它的简单性和健壮性。当然,还有很多其他的因素,本章也会介绍这些。
很多第三方的模块可以完成上述的任务。例如,基于Python的Django是一款非常流行的Web开发框架,追求干净而快速的开发,加上支持HTML、Emails、FTP等,Django因此成为Web开发的不错选择。
第三方库也可以用于软件开发。其中,最典型的例子就是用于构建控件的Scions。结合第三方库的功能和支持,Python也可以大量用于GUI开发和移动应用开发,例如,Kivy可以用于开发多触点的应用程序。
Python还用于科学计算和分析。SciPy用于工程和数学,IPython用于并行计算。从事统计和机器学习领域的读者将会发现这些库非常有用并且易于使用。SciPy提供了和Matlab类似的功能,并且能够用于处理多维数组。图1.1概括了Python的应用领域。
图1.1 Python的一些应用领域
本章介绍Python编程语言。本章按照如下的顺序讲解:1.2节介绍Python的特点,1.3节介绍编程范型,1.4节介绍Python的发展历史和应用前景,1.5节介绍Anaconda的安装,1.6节是本章小结。
如前所述,Python是一种简单但功能强大的编程语言。Python是可移植的。它拥有内置的类型和功能众多的库,并且它是免费的。本节将简单介绍Python的特点和功能。
Python很容易学习和理解。实际上,如果你有某种语言的编程背景,你会发现,Python优雅而简洁。去掉了花括号和圆括号使Python代码更加简短易懂。此外,Python中的一些任务很容易实现。例如,要交换两个数字,用Python语句(a, b) = (b, a)
很容易实现。
学习某种新的东西可能是一项耗费精力且复杂的任务。然而,Python的简单性大大降低了学习它的难度。虽然学习Python中的高级功能可能会有点复杂,但是这值得投入精力。用Python实现的项目也很容易理解。Python代码简洁而高效,因此易于理解和管理。
在大多数的项目中,测试新的技术要进行很多修改,并且要重新编译和重新运行。这使测试代码成为一项困难而耗时的任务。在Python中,很容易运行代码。实际上,我们在Python中运行的是脚本。
在本章稍后,你将会看到,Python还为用户提供了一种可交互的编程环境,可以在其中独立地运行命令。
Python的语法很简单,这使得学习和理解编程很容易。根据大多数人的经验,Python最吸引人的3个特点就是简单、短小和灵活。
如果你从事一个较大的项目,可能会有一个较大的团队,那么可能某些团队成员擅长其他的编程语言。这可能会导致在核心的Python代码中要嵌入一些以其他语言编写的模块。Python允许甚至支持这么做。
对于管理和对象相关的内存,Python有自己的方式。当在Python中创建一个对象的时候,把内存动态地分配给它。当对象的生命周期结束的时候,其占用的内存会被收回。Python的内存管理使程序更加高效。
在后面的各章中,我们将会看到,Python拥有内置的对象类型。这使任务很容易完成并且易于管理。此外,Python可以很好地处理这些和对象相关的问题。
在Python中,完成任务变得很容易。这是因为大多数常见的任务(实际上,有些任务并不是太常见)已经用Python中内置的库完成了。例如,Python拥有能够帮助用户开发GUI的库、编写移动应用程序的库、实现安全功能的库,甚至有读取MIR图像的库。在后面的各章中,我们将会看到,库和辅助工具甚至能够使得模式识别这样的复杂任务很容易完成。
用Python编写的程序可以在几乎所有已知的平台上运行,如Windows、Linux或Mac平台。Python自身就是用C编写的。
Python并不是专有的软件。任何人都可以下载各种各样可用的Python编译器。此外,在发布用Python开发的代码的时候,不会有任何的法律问题。
在过程式编程语言中,程序实际上是按照顺序执行的一组语句。程序所拥有的唯一的可选择性(术语叫作可管理性),就是将其划分为较小的模块。例如,C就是一种过程式编程语言。Python支持过程式编程。本书前8章将介绍过程式编程。
Python主要关注一个类的实例。类的实例叫作对象。类是对要解决的问题有重要意义的一个现实的或虚拟的实体,它具有鲜明的边界。例如,在负责学生管理的一个程序中,“student”可能是一个类。我们可以通过方法来创建类的实例并完成要实现的任务。Python是一种面向对象的语言。本书第9~13章将介绍面向对象编程。
Python也支持函数式编程。此外,Python支持数据不可变性、尾调用优化等。拥有函数式编程背景的开发人员应该听说过这些术语。函数式编程超出了本书的讨论范围。然而,本书后面各章会讨论上面提到的这些特性。
介绍完Python的特点,我们现在来看看Python的发展历史和应用前景。本节简短地介绍Python的发展历史和应用前景,并且激励读者去学习和使用这门语言。
Python是使用C编写的。它是由吉多·范·罗苏姆(Guido Van Rossum)发明的。这里提醒一下读者,Python这门语言和蟒蛇或蛇没有任何关系。这种语言的名字来自一部名为Monty Python’s Flying Circus的喜剧,而这是吉多·范·罗苏姆最喜欢的喜剧之一。许多人认为Python有趣的地方在于富有灵感。
Python之所以易于学习,是因为其核心相当精练。Python之所以如此简单,也是因为开发者期望能够发明一种简单的、易于学习而功能强大的语言。
由于一群专业人士致力于为世界提供一种容易而强大的语言,Python得到了持续的改进和完善。随着这门语言的发展,出现了很多Python兴趣团体和论坛。Python的修改可通过Python增强项目(Python Enhancement Project,PEP)的形式来提出。Python软件基金会(Python Software Foundation,PSF)具体负责这项工作。
Python用于完成很多的任务,其中,最重要的一些任务如下所示:
如果你使用的是UNIX或Linux系统,那么你不需要安装Python。这是因为在UNIX和Linux系统中,Python通常是预先安装好的。然而,如果你使用的是Windows系统,那么你需要下载Python。一旦决定下载Python,请查找它的最新版本。读者需要注意确保所下载的版本不是alpha版或beta版。下一节将简单介绍下载开源的发布版软件Anaconda的步骤。
很多针对Python的开发环境可供使用,其中的一些如下:
要安装Anaconda,请先访问其官方网站并选择相应的安装程序(Windows或Mac OS或Linux版)。本节将介绍在Windows系统上安装Anaconda的步骤。
首先,必须选择安装程序(32位的或64位的)。然后,在所选的安装程序上单击并下载.exe文件。安装程序会要求你将其安装到默认的位置。你也可以提供一个新的位置。在安装的过程中,你可能需要关闭防病毒软件。图1.2到图1.6展示了详细的安装步骤。
图1.2 安装程序的欢迎界面,要求用户关闭所有运行的应用程序然后单击Next按钮
图1.3 同意Anaconda3 4.3.0 (32-bit)的许可协议
图1.4 选择要为个别用户还是所有用户安装Anaconda
图1.5 选择安装到哪个文件夹
图1.6 决定是否要将Anaconda添加到path环境变量中,以及是否要将Anaconda
注册为默认的Python 3.6版本
接下来,安装过程就开始了。安装结束后,会出现图1.7和图1.8所示的界面。
图1.7 安装完成后出现此界面
图1.8 用户可以选择在云上共享笔记本
一旦安装了Anaconda,就可以打开Anaconda并运行脚本了。图1.9展示了Anaconda的导航界面。从各种可用的选项中,可以选择适合你的选项。例如,可以打开QtConsole并运行命令/脚本。图1.10展示了QtConsole的界面。这里写入的命令你现在可能还看不懂,等到学习后面几章的时候就一目了然了。
图1.9 Anaconda的导航界面
图1.10 QtConsole
在继续学习之前,你必须先记住Python和其他语言的一些不同之处。以下几点可以帮助你避免混淆。
Python语言的核心内容很少,因此很容易学习。此外,有些内容几乎是所有语言中都有的,如if/else
、循环和异常处理等。
本章介绍了Python及其特点。Python支持3种编程范型,即过程式编程、面向对象编程和函数式编程。本章为学习后面的内容打下了一个基础。本章还明确了本书中的代码需要在Python 3.X上运行。
PEP(Python Enhancement Project):表示Python增强项目。
PSF(Python Software Foundation):表示Python软件基金会。
1.Python可以继承如下 语言创建的类。
(a)只有Python
(b)Python、C++
(c)Python、C++、C#和Java
(d)以上都不对
2. 发明了Python。
(a)Monty Python
(b)Guido Van Rossum
(c)Dennis Richie
(d)以上都不对
3.Monty Python是 。
(a)Python编程语言的创始人
(b)英国的喜剧团体
(c)美国乐队
(d)Dosey Howser的兄弟
4.在Python中, 库和工具。
(a)不支持
(b)支持但并不鼓励
(c)支持并鼓励
(d)支持(只有PSF的那些才支持)
5.Python拥有 。
(a)内置的对象
(b)数据类型
(c)以上都对
(d)以上都不对
6.Python是一种 。
(a)过程式语言
(b)面向对象语言
(c)函数式语言
(d)以上都对
7.由于没有数据类型,因此一段Python代码适用于各种对象。这称为 。
(a)动态绑定
(b)动态类型
(c)动态领导
(d)以上都不对
8. 是自动内存管理。
(a)自动给对象分配内存
(b)在生命周期结束的时候收回内存
(c)以上都对
(d)以上都不对
9.PEP的全称是 。
(a)Python Ending Procedure
(b)Python Enhancement proposal
(c)Python Endearment Project
(d)以上都不对
10.PSF的全称是 。
(a)Python Software Foundation
(b)Python Selection Function
(c)Python Segregation Function
(d)以上都不对
11.Python能用于 开发。
(a)GUI
(b)Web脚本
(c)游戏
(d)以上都对
12.使用Python能够进行 。
(a)系统编程
(b)基于编程的组件开发
(c)科学计算编程
(d)以上都对
13.Python用在 中。
(a)Google
(b)Raspberry Pi
(c)Bit Torrent
(d)以上都对
14.Python用在 中。
(a)App Engine
(b)YouTube共享
(c)实时编程
(d)以上都对
15.PyPy和IDLE两种程序中更快的是 。
(a)PyPy
(b)IDLE
(c)两者一样快
(d)取决于任务
1.写出使用Python的3个项目的名称。
2.说明Python的几种应用领域。
3.Python是什么类型的编程语言(过程式、面向对象或函数式)?
4.什么是PEP?
5.什么是PSF?
6.谁负责管理Python?
7.Python是开源软件还是专有软件?
8.Python能够支持什么语言?
9.说明Python的发展历史。
10.说出几种Python编辑器。
11.Python有哪些特点?
12.和其他语言相比,使用Python的优势有哪些?
13.什么是动态类型?
14.Python有数据类型吗?
15.Python和Java有何不同?
[1] 部分选择题的正确答案不止一个。—— 编辑注
学完本章,你将能够
为了能够用Python编写程序,程序员可以使用Anaconda(1.5节介绍了其安装过程),也可使用IDLE,还可以从网上下载并安装它。IDLE有一个专门为编写Python程序而设计的编辑器。
如前所述,Python是一种解释类型的语言,因此我们并不需要编译每一段代码。程序员可以在命令提示符后输入命令并且查看输出。例如,当在命令行中输入2+3的时候,将会得到
>>2+3
5
实际上,我们可以在命令行中执行加法、减法、乘法、除法和求幂运算。可以使用*运算符执行乘法运算,使用/运算符执行除法运算,使用**运算符进行求幂运算,使用%运算符来进行模除运算。如果前一个数字比后一个数字大,模除运算符将求得余数;否则,它返回前一个数字作为输出。这些运算符的计算结果如下所示。
>>> 2*3
6
>>> 2/3
0.6666666666666666
>>> 2**3
8
>>> 2%3
2
>>> 3%2
1
>>>
在上面的示例中,Python解释器用来执行命令。这称为脚本模式(script mode),用于代码较少的情况。尽管在命令行中可以执行简单的命令,但是复杂的程序要在文件中编写。可以按照下面的步骤,创建一个文件(如图2.1所示)。
图2.1 Python程序文件
(1)在Python主界面中,选择File→New。
(2)将文件另存为calc.py。
(3)在文件中写入代码(见程序清单2.1)。
程序清单2.1 calc.py
print(2+3)
print(2*3)
print(2**3)
print(2/3)
print(2%3)
print(3/2)
(4)进行调试并运行程序。将会显示如下输出。
>>>
5
6
8
0.6666666666666666
2
1.5
>>>
相反,我们要在命令提示符后写入Python calc.py来执行这个脚本。要退出IDLE,选择File→Exit,或者在命令提示符后输入exit()
函数。
为了保存值,需要使用变量(variable)。Python赋予用户操作变量的能力。随后,这些变量将帮助我们使用这些值。实际上,Python中的一切都是一个对象(object)。本章将重点介绍对象。每个对象都有一个标识(identity)、一个类型(type)和一个值(value,由用户给定的值或默认值)。在Python中,标识指向地址并且是不能够修改的。类型可以是如下的任何一种。
后面的各节将会介绍这些类型。
and
、del
、from
、not
、while
、as
、elif
、global
、else
、if
、pass
、yield
、break
、except
、import
、class
、raise
、continue
、finally
、return
、def
、for
和try
。+
、−
、*
、/
、%
、**
和//
。=
、+=
、−=
、*=
、/=
、%=
、**=
和//=
。or
、and
和not
。<
、<=
、>
、>=
、!=
或< >
,以及==
。本章介绍Python中的基本数据类型。本章按照如下顺序讲解:2.2节介绍Python编程和基本数据类型,2.3节介绍字符串,2.4节介绍列表和元组,2.5节是本章小结。
前面已经介绍了数据类型的重要性。要理解和处理内置数据类型还有一个原因,通常,内置数据类型是用户自己所开发的较大的类型的一个固有的部分。
Python提供的数据类型不但功能强大,而且能够嵌套到其他的类型之中。本章后面将会介绍嵌套列表的概念,它实际上是列表中的一个列表。Python为用户提供了字典数据类型,它使映射更加容易且高效,这也证明了数据类型的强大。
数字是最简单的数据类型。Python中的数字包括整数、浮点数、分数和复数。表2.1给出了数字的类型及其说明。数字所支持的运算如表2.2所示。
表2.1 数字
数字的类型 |
说明 |
---|---|
整数 |
没有任何小数部分 |
浮点数 |
有小数部分 |
复数 |
拥有实部和虚部的数字 |
小数 |
具有固定的精度 |
分数(有理数) |
有一个分子和一个分母 |
集合 |
数学集合的抽象 |
表2.2 数字所支持的运算符
数字的类型 |
说明 |
---|---|
+ |
加法 |
– |
减法 |
* |
乘法 |
** |
求幂 |
% |
模除 |
除了上面的这些之外,Python实际上还解决了C和C++的问题,并且能够计算非常大的整数。现在,让我们来看一下如何使用这些运算符。例如,假设需要计算一个数的平方根,那么导入math
并使用math.sqrt()
是一种解决方案。下面一节介绍了一些最重要的函数。
1.ceil
ceil用于将一个给定的数字向上取整到大于或等于这个数字的、最近的整数。例如,2.678向上取整的结果是3。
>>> import math
>>>math.ceil(2.678)
3
That of 2 is 2.
>>>math.ceil(2)
2
>>>
2.copysign
copysign用于将第2个参数的符号赋给第1个参数,作为执行该函数的结果返回。
math.copysign(x, y)
//返回以带有y的符号的x的值
在支持带符号的0的平台上,copysign (1.0, − 0.0)
将返回−1.0。
3.fabs
fabs用于求一个数的绝对值。也就是说,如果这个数是正数,就返回它自身;如果这个数是负数,就返回它的相反数。
在Python中,fabs (x)
函数负责完成这个任务。fabs (x)
返回x
的绝对值。
>>>math.fabs(-2.45)
2.45
>>> math.fabs(x)
//返回x的绝对值
4.factorial
x
的阶乘定义为从1到这个数值的数字的连乘。也就是说,
factorial(x) = 1 × 2 × 3 × … × x
在Python中,这个任务通过factorial函数math.factorial(x)
来完成。
它返回数值x
的阶乘。此外,如果给定的数字不是一个整数或者是一个负数,将会触发一个异常。
5.floor
floor用于将一个给定的数字向下取整到小于或等于这个数字的、最近的整数。例如,2.678向下取整的结果是2,2向下取整的结果也是2。
>>> import math
>>>math.floor(2.678)
2
>>>math.floor(2)
2
>>>
Python还为程序员提供了处理分数和小数的能力。程序清单2.2展示了分数和小数的用法。
程序清单2.2 Fraction.py
from fractions import Fraction
print(Fraction(128, -26)) print(Fraction(256))
print(Fraction())
print(Fraction('2/5'))
print(Fraction(' -5/7'))
print(Fraction('2.675438 '))
print(Fraction('-32.75'))
print(Fraction('5e-3'))
print(Fraction(7.85))
print(Fraction(1.1))
print(Fraction(2476979795053773, 2251799813685248))
from decimal import Decimal
print(Fraction(Decimal('1.1')))
输出如下。
-64/13
256
0
2/5
-5/7
1337719/500000
-131/4
1/200
4419157134357299/562949953421312
2476979795053773/2251799813685248
2476979795053773/2251799813685248
11/10
在Python中,字符串是包含了字符的一个预定义的对象。Python中的字符串是不可变的。也就是说,一个字符串的值一旦确定就是不能修改的。然而,随着我们深入学习,还将会介绍上述假设的例外情况。首先,让我们来看包含了值“Harsh”的一个字符串。
name = 'Harsh'
通过在命令提示符后输入这个对象的名称(在这里是name),可以显示字符串的值。
>>>name
Harsh
也可以使用前面提到的print
函数来显示这个值。
print(name)
可以使用索引来显示字符串中一个特定位置的值,语法如下所示。
<name of the String>[index]
这里要说明的是,第一个位置的索引是0。因此,name[0]
将会输出该字符串的第1个字母,也就是“H”。
print(name[0]) H
负值的索引将会指向位于字符串末尾之前的第n个位置的字符。以上面的字符串为例,name[-2]
将会得到“s”。
print(name[-2])
s
通过调用len
函数,可以得到字符串的长度。len(str)
将会返回字符串str的长度。例如,len(name)
将会返回5,因为'Harsh'有5个字符。
也可以使用如下方式输出一个给定字符串的最后一个字符。
print(name[len(name)-1])
当对字符串使用+
运算符的时候,它会将字符串拼接起来。例如,“Harsh”+“arsh”将会返回“Harsharsh”:
name = name + 'arsh'
print(name) Harsharsh
在连接之后,如果要输出第1个字母和倒数第2个字母,可以使用如下代码:
print(name[0])
print(name[-2])
print(name)[len(name)-1-2]
H
s
s
字符串的+
运算符将一个给定的字符串拼接第一个参数指定的次数。例如,3+name将会返回“HarsharshHarsharshHarsharsh”。完整的代码如程序清单2.3所示。
程序清单2.3 String.py
name = 'Harsh'
print(name)
print(name[0])
print(name[-2])
print(name[len(name)-1])
name = name + 'arsh'
print(name)
print(name[0])
print(name[-2])
print(name[len(name)-1])
输出如下。
H s h
Harsharsh
H s h
>>>
字符串的分片指的是删除一个字符串的某一部分。例如:
>>>name = 'Sonam'
>>>name
'Sonam'
在这里,如果要提取出第1个字符之后的部分,可以使用[1:]。
>>> name1=name[1:]
>>> name1
'onam'
以相同的方式,可以像下面这样来提取该字符串前两个字母之后的部分。
>>>name = name[2:]
>>>name
'nam'
现在,通过在前面添加“man”来修改该字符串。
>>>name = "man"+name
>>>name
'mannam'
注意,我们无法按照提取前两个字母之后的部分相同的方式,来提取最后两个字母之前的部分。观察如下的输出,就理解这里所说的意思了。
>>>name = name[:2]
>>>name
'ma'
>>>name = "man manam"
要完成提取最后两个字母之前的部分这个任务,应该在分片的时候使用负值索引。
>>>name
'manmanam'
>>> name2 = name[:-2]
>>> name2
'man man'
>>>
注意,当我们写下如下的代码的时候,我们实际上没有修改这个字符串。
name = 'Hello' + name
实际上,我们创建了一个新的字符串,它将'Hello'和name中存储的值拼接了起来。当我们试图修改字符串中一个特定字符的值的时候,将会产生一个错误,把这一点联系起来看,就能够理解字符串的不可变性了。
>>>name='Anupam'
>>>name
'Anupam'
>>>name[2]='p'
Traceback (most recent call last):
File “<pyshell#17>”, line 1, in <module>
name[2]='p'
TypeError: 'str' object does not support item assignment
>>>
在Python中,列表是对象的集合。正如Mark Lutz(Learning Python, Fifth Edition的作者)所说的:“列表是Python语言所提供的最通用的序列。”和字符串不同,列表是可变的。也就是说,列表中一个特定位置的元素是可以修改的。在处理同构和异构的序列的时候,列表很有用。
列表可以是如下几种情况之一。
例如,如下authors列表拥有元素“Harsh Bhasin”“Mark Lutz”和“Shiv”。可以使用通用的print
函数输出这个列表。在程序清单2.4中,第2个列表包含一个数字、一个字符串、一个浮点数和一个字符串。“list 3”是一个空列表,“listoflist”包含一个列表作为其元素。
程序清单2.4 Lists.py
authors = ['Harsh Bhasin', 'Mark Lutz', 'Shiv']
print(authors)
combined =[1, 'Harsh', 23.4, 'a']
print(combined)
list3= []
print(list3)
listoflist = [1, [1,2], 3]
print(listoflist)
输出如下。
============ RUN C:/Python/Chapter 2/Lists.py ===========
['Harsh bhasin', 'Mark Lutz', 'Shiv']
[1, 'Harsh', 23.4, 'a']
[]
[1, [1, 2], 3]
>>>
可以使用索引来访问列表的一个元素。如代码清单2.5所示,例如,如果list1包含[1, 2, 3],那么list 1[1]包含“2”,且list 1[−1]包含“3”。
程序清单2.5 List2.py
list1 = [1, 2, 3]
print(list1[1])
print(list1[-1])
输出如下。
=========== RUN C:/Python/Chapter 2/List2.py ============
2
3
>>>
列表也可以包含其他的列表。第4章将介绍这一主题。列表也支持分片操作。
元组包含可以单独处理或作为一组处理的元素。可以使用标准的print()
函数输出元组(如(x, y))。通过将元组赋值给一个元组,可以访问这个元组的元素,如程序清单2.6所示。元组也可以包含异构的元素。例如,在程序清单2.6中,tup2与tup3包含一个字符串和一个整数。
程序清单2.6 tuple.py
tup1= (2, 3)
print(tup1)
(a, b) = tup1
print('The first element is ',a)
print('The second element is ',b)
tup2=(101, 'Hari')
tup3=(102,'Shiv')
(code1, name1)=tup1
(code2, name2)=tup2
print('The code of ', name1,' is ',code1,'\nThe code of ',name2, ' is ',code2)
输出如下。
(2, 3)
The first element is 2
The second element is 3
The code of 3 is 2
The code of Hari is 101
在处理诸如交换这样的操作的时候,元组特别有用。Python中的交换就像是把(a, b)赋值给(b, a)那样简单。下面通过示例介绍如何使用元组来交换两个数字。
示例2.1:编写一个程序,使用元组交换两个数字。
解答:具体代码如程序清单2.7所示。
程序清单2.7 swap.py
print('Enter the first number\t:')
num1= int(input())
print('Enter the second number\t:')
num2= int(input())
print('\nThe numbers entered are ',num1,' & ', num2)
(num1, num2) = (num2, num1)
print('\nThe numbers now are ',num1,' & ', num2)
>>>
输出如下。
2
Enter the second number :
3
The numbers entered are 2& 3
The numbers now are 3& 2
>>>
元组的两个特点如下。
tup1 = (2, 3)
tup1[1] = 4
would raise an exception.
>>> tup1= (1,2)
>>> tup2=(3,4)
>>> tup3= tup1+tup2
>>> tup3
(1, 2, 3, 4)
>>>
在程序中,指令是发送给计算机让其执行一项任务的。为了能够做到这一点,运算符要在所谓的“对象”上进行运算。本章介绍了Python中的各种对象,并且概述了能够作用于对象的运算符。对象可以是内置的,或者是用户定义的。实际上,可以对其进行操作的任何内容都是对象。
本章第1节介绍了Python中的各种内置对象。熟悉C语言的读者一定已经对过程式语言有一定的认识了。在C中,程序划分为可管理的模块,每个模块执行一项具体的任务。将较大的任务划分为较小的部分,这使各个部分更容易管理,并且更容易调试Bug。使用模块还有很多的好处,其中的一些好处在第1章中介绍过。
这些模块包含一组语句,而这些语句等同于指令(或者是注释而不是指令)。这些语句可能包含表达式,在表达式中是运算符作用于对象。如前所述,Python允许用户定义自己的对象。第10章会讨论这些内容。本章则重点介绍内置的对象。
在C(或者C++)中,我们不但需要小心地使用内置类型,而且要留意与分配内存、数据结构等相关的问题。然而,Python让用户不必担心这些问题,因此可以专注要完成的任务。使用内置数据类型使事情变简单了,而且效率更高。
None:表示没有值。
数字:Python有3种类型的数字,分别是整数、浮点数和复数。
序列:表示元素的有序集合。Python中有3种类型的序列,分别是字符串、元组和列表。
1.以下程序的输出是 。
>>> a = 5
>>> a + 2.7
>>> a
(a)7.7
(b)7
(c)以上都不对
(d)抛出一个异常
2.以下程序的输出是 。
>>> a = 5
>>> b = 2
>>> a/b
(a)2
(b)2.5
(c)3
(d)以上都不对
3.以下程序的输出是 。
>>> a = 5
>>> b = 2
>>> c = float (a)/b
>>> c
(a)2
(b)2.5
(c)3
(d)抛出一个异常
4.以下程序的输出是 。
>>> a = 2
>>> b = 'A'
>>> c = a + b
>>> c
(a)67
(b)60
(c)以上都不对
(d)抛出一个异常
5.以下程序的输出是 。
>>> a = 'A'
>>> 2*A
(a)'AA'
(b)2A
(c)A2
(d)以上都不对
6.以下程序的输出是 。
>>> a = 'A'
>>> b = 'B'
>>> a + b
(a)A + B
(b)AB
(c)BA
(d)以上都不对
7.以下程序的输出是 。
>>> (a, b) = (2, 5)
>>> (a, b) = (b, a)
>>> (a, b)
(a)(2, 5)
(b)(5, 2)
(c)(5, 5)
(d)以上都不对
8.以下程序的输出是 。
>>> a = 5
>>> b = 2
>>> a = a + b
>>> b = a - b
>>> a = a - b
>>> a
(a)5
(b)2
(c)以上都不对
(d)抛出一个异常
9.以下程序的输出是 。
>>> a = 5
>>> b * b = a
>>> b
(a)2.7
(b)25
(c)以上都不对
(d)抛出一个异常
10.以下程序的输出是 。
>>> (a, b) = (2, 3)
>>> (c, d) = (4, 5)
>>> (a, b) + (c, d)
(a)(6, 8)
(b)(2, 3, 4, 5)
(c)(8, 6)
(d)以上都不对
11.在选择题10给出的条件下,(a, b) – (c, d)的结果是 。
(a)(6, 8)
(b)(2, 3, 4, 5)
(c)(8, 6)
(d)以上都不对
12.在选择题10给出的条件下,(a, b)*(c, d)的结果是 。
(a)(6, 8)
(b)(2, 3, 4, 5)
(c)(8, 6)
(d)以上都不对
13.以下程序的输出是 。
>>> a = 'harsh'
>>> b = a[1: len(a)]
>>> b
(a)arsh
(b)hars
(c)harsh
(d)以上都不对
14.以下程序的输出是 。
>>>a = 'harsh'
>>>b = [-3, len (a)]
(a)a[−3: len(a)]
(b)arsh
(c)harsh
(d)以上都不对
15.以下程序的输出是 。
>>>a = 'tar'
>>>b = 'rat'
>>>2*(a + b)
(a)tarrattarrat
(b)rattarrattar
(c)tarratrattar
(d)以上都不对
1.编写一个程序来交换两个数字。
2.要求用户输入一个点的坐标,求这个点和原点之间的距离。
3.要求用户输入两个点的坐标(x坐标和y坐标),求这两个点之间的距离。
4.要求用户输入3个点的坐标,判断它们是否在一条线上。
5.在编程实践4中,如果这3个点不在一条直线上,那么判断它们构成的三角形的类型(等边三角形、等腰三角形或非等边三角形)。
6.在编程实践5中,判断三角形是否是直角三角形。
7.在编程实践4中,求出三角形中各个角的角度。
8.要求用户输入两个点的坐标,判断这两个点到原点的距离是否相等。
9.在编程实践8中,计算两个点与原点的连线之间的夹角。
10.要求用户输入4个点的坐标,并且按照它们到原点之间的距离升序排列。
11.在编程实践10中,按照4个点的x坐标升序排列它们。