课程介绍
2017年末,Python 在国务院《新一代人工智能发展规划的通知》中被列入教学大纲,一时风头无两。Python 因其在人工智能领域的先天优势,深受欢迎,不难预见,它在未来将大有可为。两年前,因项目需要,作者首次接触 Python,从此便一发不可收,基于 Python 完成了多个项目的开发。一路走来,深感书本与实践脱离之痛,市面上种类繁多的编程辅导书,大都力求面面俱到,动辄数百页,难免令初学者望而生畏。鉴于此,作者推出了本达人课,试图以一种对话的形式,带领读者走进 Python。
本课程是一个系列的 Python 教程,目标是带领读者快速掌握 Python 要义,进而上手实战。
课程从 Python 开发环境搭建开始,随后介绍了 Python 的基础知识和基本概念,包括列表、元组、字符串、字典以及各种语句。
然后,循序渐进地介绍了一些相对高级的主题,包括抽象、异常、文件、GUI,网络编程,爬虫等。
此后,探讨了如何将 Python 与数据库、网络、Java 语言、Shell 脚本等工具结合使用。
最后,课程将结合实际应用场景带领读者完成两个小程序的设计和实现。
本课程是作者在学习工作中总结而成,内容循序渐进,语言表述生动,可读性强,认真读完这个系列文章,有助于初学者夯实基础,同时又能帮助程序员提升技能。
应书澜,毕业于 C9 高校,研发出身,曾在阿里巴巴、上海电气、浙能集团、华为等企业的重要项目中担任技术负责人和设计师,现专注于中间件技术。
课程内容
导读:Python 简史
在正式学习 Python 之前,我们应该对以下内容有所了解。
Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/),是一种面向对象的解释型计算机程序设计语言,由荷兰人 Guido van Rossum 于1989年发明,第一个公开发行版发行于1991年。
Python 命名的由来颇具感性色彩,1989年圣诞节期间,在阿姆斯特丹,Guido 为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为 ABC 语言的一种继承。之所以选中 Python(意为大蟒蛇)作为该编程语言的名字,是因为他是一个叫 Monty Python 的喜剧团体的爱好者。
若有人问我 Python 最大的特点是什么,我会毫不犹豫的告诉他:简单易学,功能强大。作为一款纯粹的自由软件,Python 有很多优点:
Python 诞生至今已经成为最受欢迎的程序设计语言之一。自2004年以后,Python 的使用率一直呈线性增长。根据 TIOBE 编程语言社区发布的2018年1月排行榜,Python 已经超过 C# 跃居热门编程语言的第四位。
由于 Python 语言的简洁性、易读性以及可扩展性,在国外用 Python 做科学计算的研究机构日益增多,一些知名大学已经采用 Python 来教授程序设计课程。例如卡耐基梅隆大学的编程基础、麻省理工学院的计算机科学及编程导论就使用 Python 语言讲授。众多开源的科学计算软件包都提供了 Python 的调用接口,例如著名的计算机视觉库 OpenCV、三维可视化库 VTK、医学图像处理库 ITK。而 Python 专用的科学计算扩展库就更多了,例如十分经典的科学计算扩展库:NumPy、SciPy 和 Matplotlib,它们分别为 Python 提供了快速数组处理、数值运算以及绘图功能。因此 Python 语言及其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。
未来是人工智能的时代,有理由相信 Python 将发挥更大的作用。经过多年的演进,人工智能发展进入了新阶段。为抢抓人工智能发展的重大战略机遇:
当前,Python 已经成为人工智能领域最流行的编程语言,而人工智能的火热又反过来促进了 Python 的发展。在国家层面力量的大力推动下,Python 普及的速度定将大大加快,无论是作为辅助工具还是跟随时代步伐,学习 Python 都是很有意义的。
两年前,因项目需要,作者首次接触 Python,从此便一发不可收,基于 Python 完成了一系列项目的开发。一路走来,深感书本与实践脱离之痛,市面上种类繁多的编程辅导书,大都力求面面俱到,动辄数百页,难免令初学者望而生畏。鉴于此,作者写了本课程,试图以一种简明的形式,带领读者走近 Python。
第01课:Python 开发环境搭建及预备知识
如果读者已经搭建了 Python 开发环境,可跳过本章第一部分,但需要注意,本课程列举的实例代码中部分有中文注释,有些集成开发环境可能不支持中文注释,因此,运行本课程实例时请注意将注释去掉。另外,如果读者觉得搭建开发环境比较繁琐,可采用 Python 自带的 IDLE 作为开发环境,安装方法请访问:《Python3入门笔记》。
开发 Python 的 IDE 有很多,本文介绍基于 Eclipse+PyDev+Python 搭建开发环境的方法。
Eclipse 是一款基于 Java 的可扩展开发平台。其官方下载中包括 J2EE 方向版本、Java 方向版本、C/C++ 方向版本、移动应用方向版本等诸多版本。除此之外,Eclipse 还可以通过安装插件的方式进行诸如 Python、Android、PHP 等语言的开发。本文将要介绍的就是使用 Eclipse 与 PyDev 插件,安装 Python 开发环境的方法。
OS:Windows 7
Python:3.6.2
Java:8u31
Win7 32位,Mac OS 操作系统同下述安装方法。
软件下载
Eclipse 下载
我们可以进入 Eclipse 官网下载界面下载 Eclipse 软件。在该页面,可以看到针对不同开发需求的 Eclipse 版本,本文采用的是 Eclipse IDE for Java and DSL Developers。目前,最新的版本是 Eclipse Oxygen.2 (4.7.2) Release,为2017年10月放出的版本。另外,还需要注意的是,需要根据自己的操作系统选择正确的系统位数(32/64bits)。
PyDev 离线下载
我们可以在 PyDev 项目下载页面看到一些有价值的信息:
Eclipse 安装
这里要注意,Eclipse 安装需要 Java 环境,如果还没有安装 Java 环境,请先去下载安装 JDK(点击这里)。
Eclipse 实际上是一个基于 OSGI 框架的软件,在 Windows 系统上无需安装,只需要将其解压,双击打开 eclipse.exe 即可。在 Mac OS 上则有所不同,需要双击 .dmg 文件安装。在第一次运行时,会要求你输入工作路径,你可以自定义也可以接受默认路径。
PyDev 插件安装
Eclipse 插件的安装方式有离线和在线两种,本文介绍在线安装方法。
打开 Eclipse,选择“Help”->“Install New Software”。在弹出的对话框中,点击 Add 按钮,添加新的安装源,如下图所示。
在 Location 处填写安装源的网址:http://www.pydev.org/updates/(很多博客中写的是http://pydev.org/updates),这个地址并非一成不变,因此,最好到官网确认一下。确认方法在上面“软件下载”小节中已有说明。
此外,需取一个名字填写在 Name 处,比如我这里写的是 PyDev。把“connect all update sites during install to find required software”的勾选去掉,否则在安装新插件时会联网寻找所有可能的更新站点搜索,导致安装时间不可预估,并可能导致安装失败。确定后可以看到一个 Pending 过程,然后得到如下图所示的插件,一般来说,我们只需选择 PyDev 即可,这里我两个都安装了(不推荐):
勾选后,点击 Next 进行安装。不过,由于网络的原因,这种方法安装 PyDev 极有可能失败,提示网络连接错误等。
Python 安装
Python 的安装比较简单,前往 Python 官网下载安装包。进入官网之后,官网会根据你的计算机操作系统推荐 Python 安装包的版本,如下图所示,你可以根据推荐下载最新的安装包,需要注意的是,Python 目前有 Python2 和 Python3 两个大版本,差异显著,本课程基于 Python3 编写,因此,请读者选择 Python3.X 安装包,具体内容安装步骤可参考博文《Python3 入门笔记——Windows 安装与运行》。
PyDev 插件配置
安装好 PyDev 插件后,并不能正常使用,还需要配置 Python 的解释器。
打开Eclipse,选择“Window” -> “Preferences”(如果是 Mac,则同时按下 Command 和 ,
键唤出 Preference),找到“PyDev”,选择其中的“Interpreter” –> “Python”。点击“New”,添加一个系统里已有的 Python 解释器的路径(根据自己安装的路径确定)。确定后会经过短暂的处理,得到它的 Libraries、Buildins 等。当然,还可以根据自己的编程习惯对 PyDev 进行一些其他的配置,这里就不再说了。
创建一个 Python 项目
前面就已经配置好了 Python 的开发环境,下面新建一个项目,来测试一下,确实可以运行。
点击“File” -> “New” -> “Other”,找到“PyDev”,选择“PyDev Project”,点击“Next”。取一个项目名称,比如 helloPython,此外,还可以选择 Python 的语言版本和解释器版本,如下图所示:
点击“Finish”,完成项目创建。然后你会进入 PyDev 视图,进行 Python 开发。这里,我们就写一个最简单的程序,进行测试。右键项目的 src 目录,选择“New” -> “PyDev Package”,创建一个 Python 包,此处也命名为 helloPython。再右键该 package,“New” -> “PyDev Module”,此处也命名为 helloPython。双击打开 helloPython.py,添加如下代码。
if __name__ == '__main__': print("hello world!")
右键项目,选择“Run As” -> “Python Run”,或 Ctrl+F11 运行项目。此时,可以在下方的 Console 窗口,看到项目的运行结果:hello world!。
编程语言
编程语言(Programming Language),是用来定义计算机程序的形式语言。它是一种被标准化的交流技巧,用来向计算机发出指令。计算机语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。
解释
上面的定义读起来比较晦涩,下面我通俗的解释一下。
在人类发展史上,一般将文字的出现视为文明的标志,无论是汉语,英语还是法语,它们都是人类交流沟通的工具。文字使得人类之间的沟通和交流变得有章可循,极大的提高了信息传播的效率。自计算机诞生之后,人们一直希望给计算机赋予语言的特性,使计算机像人一样的沟通,而编程语言则可看作人与计算机之间“交流沟通”的工具,它使得人类和计算机之间的高效交流得以实现。
高级编程语言
在实践中,人们意识到人和计算机直接“交流”相当困难,计算机能够直接理解的语言是0和1构成的机器码,而这种机器码并不符合人类的认知习惯,因此,高级编程语言应运而生。
何为高级呢?指的是符合人类的理解习惯和思维方式,远离计算机底层。高级编程语言(如 Java,Python)使得人们能够以相对容易的方式将期望计算机执行的指令表达成文。但是,这种高级语言写成的“文章”,计算机是无法直接理解的,因此,还需要一个“翻译”,将人们编写的高级语言按照规则翻译成计算机能够理解的机器语言。根据编程语言的不同,这里的“翻译”也有显著区别。关于人与计算机之间的“交流”,简略的示意图如下:
与 Java 和 C++ 差别显著
学习过 C/C++、Java 的读者一定还记得定义变量的方法,如下例子,定义 a、b、c、d 四个变量,其数值类型分别为 int、double、long、float,定义变量的时候,我们需要“显式”的声明变量的类型,以便在内存中为该变量开辟空间,不同的数据类型占用的内存空间是不同的,所以必须要声明。
int a;double b;long c;float d;
与 C++ 和 Java 不同,Python 中变量没有类型,更谈不上声明变量类型,变量只是对象的引用,而 Python 的所有类型都是对象,包括函数、模块、数字、字符串、列表、元组、字典等等。
如下所示,定义变量 a 并赋值,同一个变量在同一段程序中三次被赋值不同的类型,之所以能如此操作,就是因为变量没有类型,它可以指向任何类型,单从这一点来看,Python 与 C++、Java 差别是很明显的。
# -*- coding: UTF-8 -*a = 12print("a=", a)a = "ABCDE"print("a=", a)a = 1 + 4jprint("a=", a)
执行结果:a= 12a= ABCDEa= 1+4j
本课程实例的说明
为了便于读者更好的理解,本课程列举了很多程序实例,其中部分程序涉及中文注释,另外,为了直观的展现程序执行的结果,课程中的实例大量使用 print 语句将结果打印到控制台,便于读者观察。
关于本课程的实例风格,这里举一个简单的例子:
# -*- coding: UTF-8 -*#自定义函数,求两个数的和def add(a, b): return a + b;#直接调用内建函数pow(x,y),计算x的y次方print('10的3次方 = %d' %pow(10,3))print('1 + 2 = %d' %add(1,2))执行结果:10的3次方 = 10001 + 2 = 3
特别说明
上面例子中,有两点需要解释一下。
# -*- coding: UTF-8 -*
:Python 默认是以 ASCII 作为编码方式的,如果在自己的 Python 源码中包含了中文(或者其他非英语系的语言),即使你把自己编写的 Python 源文件以 UTF-8 格式保存了,运行时仍可能会报错:SyntaxError: Non-ASCII character '\xe5' in file XXX.py on line YY, but no encoding declared;
解决办法:在每一个包含中文或其它语言注释的 Python 脚本文件的第一行,加入以下声明:
# -*- coding: UTF-8 -*-
#
“#”表示注解,在代码中输入它的时候,它右边的所有内容都将被忽略,注解是极为有用的,不仅有助于别人理解自己的代码,也可以提示自己。
通过命令运行 Python 脚本
上面的例子中,我们运行 Python 脚本都是通过 Eclipse IDE(集成开发环境)完成的,事实上运行程序的方法很多,对于 Python 语言而言,我们可以直接以命令的方式运行。
Windows 系统:
进入 Python 脚本 test.py 所在路径下,键入命令:Python test.py。
注意:Python 首字母大写。
Linux 或 Unix 系统:
进入 Python 脚本 test.py 所在路径下,键入命令:python test.py。
注意:Python 首字母小写。
第02课:数字和运算符
Python 提供了三种数字类型,即 int(整型),float(浮点型),complex(复数)。
需要注意的是,Python3 已经废弃了 Python2 的 Long(长整型),在 Python3 中,int 的大小没有限制,可以作为 Long 使用。
数字类型转换
Python 的三种数字类型可以进行相互转换,转换方式为:数字类型+圆括号,如下实例:
a = 123b = 3.1415926print("int(b)=",int(b))print("float(a)=",float(a))print("complex(a)=",complex(a))print("complex(a,b)=",complex(a,b))
执行结果:
int(b)= 3float(a)= 123.0complex(a)= (123+0j)complex(a,b)= (123+3.1415926j)
常用的数学函数
Python 提供了丰富的数学函数以降低编程实现的难度,本节将介绍一些常用的函数。
import math#求绝对值:abs(x)print("abs(-12)=",abs(-12))#向上取整:ceil(x)print("ceil(3.1415)=",math.ceil(3.1415))#向下取整:floor(x)print("floor(3.678)=",math.floor(3.678))#四舍五入:round(x)print("round(3.678)=",round(3.678))#乘方运算:pow(x,y),x的y次方print("pow(3,4)=",pow(3,4))#求平方根:sqrt(x)print("sqrt(144)=",math.sqrt(144))
执行结果:
abs(-12)= 12ceil(3.1415)= 4floor(3.678)= 3round(3.678)= 4pow(3,4)= 81sqrt(144)= 12.0
计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Python 也提供了一套丰富的运算符来满足各种运算需求。
Python 运算符大致可分为7种,即算术运算符、比较运算符、赋值运算符、逻辑运算符、位运算符、成员运算符以及身份运算符。
算术运算符
对算术运算,大家并不陌生,常用的加减乘除就是算术运算。不过,在编程语言里,算术运算的符号特殊一些,Python 中的算术运算有7种:加(+)、减(-)、乘( * )、除(/)、取模(%)、幂运算( ** )和取整预算(//)。以下通过实例演示算术运算符的用法。
#初始化测试数据X = 24Y = 5Z = 0#分别进行7种算术运算Z = X + Y print("X + Y =", Z)Z = X - Y print("X - Y =", Z)Z = X * Y print("X * Y =", Z)Z = X / Y print("X / Y =", Z)Z = X % Y print("X % Y =", Z)Z = X ** Y print("X ** Y =", Z)Z = X // Y print("X // Y =", Z)
执行结果:
X + Y = 29X - Y = 19X * Y = 120X / Y = 4.8X % Y = 4X ** Y = 7962624X // Y = 4
比较运算符
比较无处不在,大于、小于、等于、不等于……和 C/C++、Java 等编程语言一样,Python 也提供了6种比较运算符:>(大于),<(小于),==(等于),!=(不等于),>=(大于等于),<=(小于等于)。比较运算的结果是一个布尔值,True 或者 False,如下实例:
#初始化测试数据X = 24Y = 5#分别进行7种比较运算print("X == Y:", X == Y)print("X != Y:", X != Y)print("X > Y:", X > Y)print("X < Y:", X < Y)print("X >= Y:", X >= Y)print("X <= Y:", X <= Y)
执行结果:
X == Y: FalseX != Y: TrueX > Y: TrueX < Y: FalseX >= Y: TrueX <= Y: False
赋值运算
在前文的实例中已经用到赋值运算,如 X = 25,就是一个最简单的赋值运算,“=”就是最简单的赋值运算符。将简单的赋值运算与算术运算结合,Python 形成了丰富的赋值运算符:+=、-=、=、/=、%=、*=、//=。实例如下:
#初始化测试数据X = 2Y = 3#分别进行7种赋值运算Y = X print("Y = X, Y =", Y)Y += X print("Y += X, Y =", Y)Y -= X print("Y -= X, Y =", Y)Y *= X print("Y *= X, Y =", Y)Y /= X print("Y /= X, Y =", Y)Y **= X print("Y **= X, Y =", Y)Y //= X print("Y //= X, Y =", Y)
执行结果:
Y = X, Y = 2Y += X, Y = 4Y -= X, Y = 2Y *= X, Y = 4Y /= X, Y = 2.0Y **= X, Y = 4.0Y //= X, Y = 2.0
逻辑运算
所谓逻辑运算,就是:与、或、非。Python 中3种逻辑运算符分别为:and(与),or(或),not(非),逻辑运算的结果是布尔值:True 或者 False。
如下实例:
#初始化测试数据X = 2Y = 3Z = 5#分别执行3种逻辑运算print("X>Y and XY and XY or Z :", X>Y or X
执行结果:
X>Y and XY or Z : TrueX
位运算
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。Python 中有6种位运算符:
>>
:右移动运算符,把 >>
左边的运算数的各二进位全部右移若干位,>>
右边的数指定移动的位数;<<
:左移动运算符,运算数的各二进位全部左移若干位,由 <<
右边的数指定移动的位数,高位丢弃,低位补0。举个例子:a=21,b=6,将两个数转换为二进制形式进行位运算。
a = 0001 0101b = 0000 0110a&b = 0000 0100a|b = 0001 0111a^b = 0001 0011~a = 1110 1010a<<2 = 01010100a>>2 = 0000 0101
成员运算
除了上文介绍的5种运算符,Python 还支持成员运算符。介绍成员运算符之前,我们需要提前了解一个概念:数据结构,如字符串、列表、元组、字典。在接下来的章节中我们将详细介绍这些基础的数据结构。字符串、列表、字典,它们就像一个集合,其中包含若干元素,这些元素就是集合的成员;对于一个给定的元素,它有可能在一个给定的集合中,也可能不在,Python 中采用成员运算符来判断元素是否属于成员,成员运算的结果为布尔值,True 或者 False。
如下实例:
#初始化一个字符串和列表temp1 = "ABCDEFG"temp2 = [4,2,3,5,8,9]a = "CDE"b = 5c = "CDF"print("a in temp1?", a in temp1)print("b in temp2?", b in temp2)print("c in temp1?", c in temp1)
执行结果:
a in temp1? Trueb in temp2? Truec in temp1? False
身份运算符
身份运算符用于比较两个标识符所引用对象的存储单元,计算结果为布尔值,包含两个运算符:is 和 is not,分别用于判断两个标识符是否引用自一个对象。关于存储单元的比较,涉及到对内存模型的理解,本节不做详述,留到后面章节介绍。
第03课:字符串、列表和栈
第04课:元组、字典、集合与队列
第05课:条件、循环及其它语句
第06课:抽象之函数
第07课:抽象之类
第08课:错误和异常
第09课:模块和标准库
第10课:文件和流
第11课:数据库与网络编程
第12课:图形用户界面
第13课:实战之用 Python 写一个抢票软件
第14课:实战之用 Python 写一个简易爬虫
阅读全文: https://gitchat.csdn.net/column/5ad56a79af8f2f35290f6535?utm_source=blog0717_ysl