本书专门针对Python新手量身定做,涵盖了Python 3 实际开发的重要知识点,内容包括:Python语言的类型和对象、操作符和表达式、编程结构和控制流、函数、序列、多线程、正则表达式、面向对象编程、文件操作、网络编程、邮件收发、数据库操作等,提供Python爬虫、数据处理项目范例,各章还安排了调试、问题解答、温故知新、牛九小试等内容,以帮助读者学会处理程序异常、解答学习困惑、巩固知识、学以致用。
本书通俗易懂、示例丰富、代码可读性及可操作性强。非常适合Python 3.x初学者、想学习和了解Python 3的程序员,也可作为Python网课、培训及大专院校教学用书。
第2章开启Python之旅
本章主要介绍Python的基础知识,为后续章节学习相关内容做铺垫。
2.1认识程序
旅行前,我们要先熟悉地名,知道去哪里旅行,将会经过哪里。学习编程语言也一样,在学习之前要先了解程序、调试、语法错误、运行错误、语义错误等知识。
2.1.1程序
我们都知道,出门旅行肯定要选择交通工具,现在常用的交通工具有飞机、火车、轮船、汽车等,我们会根据自己的喜好和一些其他因素选择对应的交通工具。
编程语言也一样,我们选择一门编程语言就相当于选择一种交通工具,那么,编程语言的“交通”工具是什么呢?是程序。
程序是指根据语言提供的指令按照一定逻辑顺序对获得的数据进行运算,并最终返回给我们的指令和数据的组合。在这里,运算的含义是广泛的,既包括数学计算之类的操作(如加减乘除),又包括寻找和替换字符串之类的操作。数据依据不同的需要组成不同的形式,处理后的数据也可能以另一种方式体现。
程序是用语言写成的。语言分高级语言和低级语言。
低级语言有时叫机器语言或汇编语言。计算机真正“认识”并能够执行的代码,在我们看来是一串0和1组成的二进制数字,这些数字代表指令和数据。早期的计算机科学家就是用这些枯燥乏味的数字编程。低级语言的出现是计算机程序语言的一大进步,它用英文单词或单词的缩写代表计算机执行的指令,使编程的效率和程序的可读性都有了很大提高,但它仍然和机器硬件关联紧密,不符合人类的语言和思维习惯,而且要想把用低级语言写的程序移植到其他平台,就必须重写。
高级语言的出现是程序语言发展的必然结果,也是计算机语言向人类的自然语言和思维方式逐步靠近和模拟的结果。由于高级语言是对人类逻辑思维的描述,用高级语言写程序会感到比较自然,读起来也比较容易,因此现在大部分程序都是用高级语言写的。
高级语言设计的目的是让程序按照人类的思维和语言习惯书写,是面向人的,而不是面向机器。我们用着方便,机器却无法读懂,更谈不上运行。所以,用高级语言写的程序必须经过“翻译”程序的处理,将其转换成机器可执行的代码,才能运行在计算机上。如果想把高级语言写的程序移植到其他的平台,只需在它的基础上做少量更改就可以了。
高级语言翻译成机器代码有两种方法,即解释和编译。
解释型语言是边读源程序边执行。高级语言就是源代码。解释器每次会读入一段源代码,并执行它,接着再读入并执行,如此重复,直到结束,图2-1显示了解释器的结构。这个有点类似在乡村里搭乘公交,只要碰到路上有人等公交,就停下来载人。
编译型语言是将源代码完整的编译成目标代码后才能执行,以后在执行时不需要再编译。图2-2显示了一个编译器的结构,这个有点类似我们乘坐的直达车,所有要乘车的人都从起点上车,中途不再搭载其他乘客。
图2-1解释型语言的执行方式
图2-2编译型语言的执行方式
2.1.2调试
每当远游时,司机肯定要做几件事情,如检查发动机是否正常、检查油箱、检查各项安全系统和液压系统等,为的是尽可能减少在路途中发生意外情况。
我们编程也是一样的,需要经常做检查。有一些问题编译器会帮助我们检查出来,问题查出后,简单的可以直接解决,对于稍微复杂的,需要通过调试来解决。
程序是很容易出错的。程序错误被称为bug,查找bug的过程称为调试(debugging)。我们在第1章中已经介绍过一个很简单的调试示例。
2.1.3语法错误
在生活中有时会碰到这样的情况,你本应买今天去某地的火车票,已经买好了,但当进站检票时,系统告诉你票不是今天的,这时你才发现购买车票时输错了日期。
程序中这种错误比生活中出现的次数多很多,称为语法错误(syntaxerrors)。Python程序在语法正确的情况下才能运行,否则解释器会显示一条错误信息。语法指的是程序的结构和此结构的规则。比如第1章的('Hello,world!'),括号中的单引号是成对的,执行时才能正确执行。如果输入('Hello,world!)或(Hello,world!')就会报错,这属于语法错误。
我们在阅读文章或听人讲话时,可以容忍大多数语法错误,不过Python并不如此宽容。程序中只要出现一处语法错误,Python就会显示错误信息并退出,从而无法通过编译。就如我们进站,一旦票不满足进站要求,就无法进入一样。
在编程生涯的开始阶段,可能每踏出一步都会碰到大量语法方面的错误,随着经验的增加,犯错会减少,踩过坑后,后面遇到类似的坑就能快速应对了。
2.1.4运行错误
我们可能在奔跑的交通工具内愉悦地欣赏着远途的风景,但此时交通工具突然慢慢停下来了,并且司机对大家宣布说,交通工具抛锚了。例如,出现轮胎破损、没油了、发动机坏了、撞车事故等。
在Python中经常会遇到类似的错误,称之为运行时错误(runtimeerrors)。
即使是看起来完美无缺的程序,在运行的过程中也会出现错误。有人说,计算机不是善于精确计算吗?确实如此。不过错的不是计算机,而是我们人类。计算机说到底是人类设计的,是我们所用的工具,和电视机、汽车从本质上来说是一样的。鉴于现在计算机软硬件的理论水平、工业制造水平、使用者的水平等一些内在、外在的因素,出现错误并不稀奇,且程序越复杂,出现异常的概率越大。异常的种类很多,如内存用尽、除数为零的除法等都可能导致异常。Python为了把错误的影响降至最低,提供了专门的异常处理语句。
运行时错误一般在代码量偏多时才容易遇到。
2.1.5语义错误
经常乘坐交通工具,难免有乘错车的情况出现,比如你本应该乘坐801路车,却坐上了802路车,结果到达了不同的地方。
在Python中经常会发生类似的问题,此类问题称为语义错误(semanticerrors)。
程序即使有语义错误,也能正常运行,不会产生任何错误信息,但得到的结果和我们预料的不一致。发生这种错误一般是我们对语句的运行机制了解得不够透彻,自以为它应该如此运行,实际上却不是这样。还有可能是你解决问题的思路本身就是错的,写的程序当然是错的。
查找语义错误并不像我们坐错了车那么容易,它可能需要你根据结果进行推理,不过推理的过程没有那么简单易行,需要查看程序输出,并尝试弄明白到底做了什么。
……
目 录
第1章 进入Python 3.5的精彩世界 1
1.1 Python的起源 2
1.2 Python的应用场合 3
1.3 从2.7到3.5,Python的新特性 5
1.4 如何学习Python 6
1.5 Python环境构建 7
1.5.1 在Windows系统中安装Python 7
1.5.2 在Linux和UNIX系统中安装Python 14
1.5.3 在Mac OS系统中安装Python 17
1.5.4 其他版本 18
1.6 从hello word开始 18
1.7 调试 19
1.8 问题解答 20
1.9 温故知新,学以致用 21
第2章 开启Python之旅 22
2.1 认识程序 23
2.1.1 程序 23
2.1.2 调试 24
2.1.3 语法错误 24
2.1.4 运行错误 24
2.1.5 语义错误 25
2.2 数据类型 25
2.2.1 整型 25
2.2.2 浮点型 27
2.2.3 复数 28
2.2.4 数据类型转换 28
2.2.5 常量 29
2.3 变量和关键字 29
2.3.1 变量 29
2.3.2 变量名称 33
2.4 语句 34
2.5 表达式 35
2.6 运算符和操作对象 36
2.6.1 什么是运算符和操作对象 36
2.6.2 算术运算符 36
2.6.3 比较运算符 38
2.6.4 赋值运算符 39
2.6.5 位运算符 40
2.6.6 逻辑运算符 41
2.6.7 成员运算符 42
2.6.8 身份运算符 43
2.6.9 运算符优先级 43
2.7 字符串操作 45
2.8 注释 49
2.9 调试 50
2.10 问题解答 50
2.11 温故知新,学以致用 51
第3章 列表和元组 52
3.1 通用序列操作 53
3.1.1 索引 53
3.1.2 分片 54
3.1.3 序列相加 57
3.1.4 乘法 58
3.1.5 成员资格 59
3.1.6 长度、最小值和最大值 60
3.2 列表 60
3.2.1 更新列表 61
3.2.2 嵌套列表 65
3.2.3 列表方法 65
3.3 元组 74
3.3.1 tuple函数 75
3.3.2 元组的基本操作 75
3.3.3 元组内置函数 76
3.4 列表与元组的区别 77
3.5 调试 78
3.6 问题解答 79
3.7 温故知新,学以致用 79
第4章 字符串 81
4.1 字符串的基本操作 82
4.2 字符串格式化 83
4.2.1 字符串格式化符号 83
4.2.2 字符串格式化元组 85
4.3 字符串方法 87
4.3.1 find()方法 87
4.3.2 join()方法 88
4.3.3 lower()方法 89
4.3.4 upper()方法 90
4.3.5 swapcase()方法 91
4.3.6 replace()方法 91
4.3.7 split()方法 92
4.3.8 strip()方法 92
4.3.9 translate()方法 93
4.4 调试 94
4.5 问题解答 95
4.6 温故知新,学以致用 95
第5章 字典 96
5.1 字典的使用 97
5.2 创建和使用字典 97
5.2.1 dict函数 98
5.2.2 字典的基本操作 98
5.2.3 字典的格式化字符串 100
5.2.4 字典和列表的区别 100
5.3 字典方法 101
5.3.1 clear()方法 101
5.3.2 copy()方法 102
5.3.3 fromkeys()方法 103
5.3.4 get()方法 104
5.3.5 key in dict方法 105
5.3.6 items()方法 105
5.3.7 keys()方法 105
5.3.8 setdefault()方法 106
5.3.9 update()方法 107
5.3.10 values()方法 107
5.4 调试 108
5.5 问题解答 108
5.6 温故知新,学以致用 109
第6章 条件、循环和其他语句 110
6.1 使用文本编辑器 111
6.2 import的使用 113
6.2.1 import语句 113
6.2.2 使用逗号输出 116
6.3 别样的赋值 116
6.3.1 序列解包 116
6.3.2 链式赋值 118
6.3.3 增量赋值 118
6.4 语句块 119
6.5 条件语句 119
6.5.1 布尔变量的作用 120
6.5.2 if语句 121
6.5.3 else子句 122
6.5.4 elif子句 123
6.5.5 嵌套代码块 124
6.5.6 更多操作 124
6.5.7 断言 127
6.6 循环 128
6.6.1 while循环 128
6.6.2 for循环 129
6.6.3 循环遍历字典元素 131
6.6.4 迭代工具 132
6.6.5 跳出循环 134
6.6.6 循环中的else子句 136
6.7 pass语句 137
6.8 牛刀小试——猜字游戏编写 138
6.9 Python程序调试 140
6.10 问题解答 141
6.11 温故知新,学以致用 141
第7章 函数 142
7.1 调用函数 143
7.2 定义函数 145
7.3 函数的参数 147
7.3.1 必须参数 148
7.3.2 关键字参数 149
7.3.3 默认参数 149
7.3.4 可变参数 153
7.3.5 组合参数 155
7.4 执行流程 155
7.5 形参和实参 156
7.6 变量作用域 157
7.6.1 局部变量 157
7.6.2 全局变量 159
7.7 有返回值和无返回值函数 161
7.8 为什么要有函数 163
7.9 返回函数 163
7.10 递归函数 166
7.11 匿名函数 169
7.12 偏函数 171
7.13 牛刀小试——经典排序之快速排序实现 172
7.14 调试 173
7.15 问题解答 174
7.16 温故知新,学以致用 174
第8章 面向对象编程 176
8.1 理解面向对象 177
8.1.1 什么是面向对象编程 177
8.1.2 面向对象术语简介 177
8.2 类的定义与使用 178
8.2.1 类的定义 178
8.2.2 类的使用 178
8.3 深入类 179
8.3.1 类的构造方法 179
8.3.2 类的访问权限 184
8.4 继承 189
8.5 多态 192
8.6 封装 196
8.7 多重继承 197
8.8 获取对象信息 199
8.9 类的专有方法 202
8.10 牛刀小试——出行建议 207
8.11 调试 209
8.12 问题解答 209
8.13 温故知新,学以致用 210
第9章 异常 211
9.1 什么是异常 212
9.2 异常处理 212
9.3 抛出异常 213
9.4 捕捉多个异常 215
9.5 使用一个块捕捉多个异常 216
9.6 捕捉对象 217
9.7 全捕捉 217
9.8 异常中的else 218
9.9 自定义异常 219
9.10 finally子句 220
9.11 异常和函数 222
9.12 bug的由来 223
9.13 温故知新,学以致用 223
第10章 日期和时间 224
10.1 日期和时间 225
10.1.1 时间戳 225
10.1.2 时间格式化符号 225
10.1.3 struct_time元组 226
10.2 time模块 227
10.2.1 time()函数 227
10.2.2 localtime([secs])函数 227
10.2.3 gmtime([secs])函数 228
10.2.4 mktime(t)函数 228
10.2.5 asctime([t])函数 229
10.2.6 ctime([secs])函数 229
10.2.7 sleep(secs)函数 230
10.2.8 clock()函数 230
10.2.9 strftime(format[, t])函数 231
10.2.10 strptime(string[, format])函数 232
10.2.11 三种时间格式转化 232
10.3 datetime模块 232
10.4 日历模块 236
10.5 牛刀小试——时间大杂烩 237
10.6 调试 242
10.7 温故知新,学以致用 242
第11章 正则表达式 244
11.1 认识正则表达式 245
11.2 re模块 247
11.2.1 re.match函数 247
11.2.2 re.search方法 247
11.2.3 re.match与re.search的区别 248
11.3 贪婪模式和非贪婪模式 249
11.4 替换 250
11.5 编译 250
11.6 温故知新,学以致用 251
第12章 文件操作 252
12.1 打开文件 253
12.1.1 文件模式 254
12.1.2 缓冲 255
12.2 基本文件方法 255
12.2.1 读和写 256
12.2.2 读写行 258
12.2.3 关闭文件 260
12.2.4 文件重命名 261
12.2.5 删除文件 262
12.3 对文件内容进行迭代 262
12.3.1 按字节处理 262
12.3.2 按行操作 263
12.3.3 使用fileinput实现懒加载式迭代 264
12.3.4 文件迭代器 264
12.4 StringIO函数 264
12.5 序列化与反序列化 265
12.5.1 一般序列化与反序列化 266
12.5.2 JSON序列化与反序列化 267
12.6 调试 269
12.7 问题解答 269
12.8 温故知新,学以致用 270
第13章 多线程 271
13.1 线程和进程 272
13.1.1 进程 272
13.1.2 线程 272
13.1.3 多线程与多进程 272
13.2 使用线程 273
13.2.1 全局解释器锁 273
13.2.2 退出线程 274
13.2.3 Python的线程模块 274
13.3 _thread模块 274
13.4 threading模块 277
13.5 线程同步 282
13.6 线程优先级队列 284
13.7 线程与进程比较 287
13.7.1 线程切换 287
13.7.2 计算密集型与IO密集型 288
13.7.3 异步IO 288
13.8 调试 289
13.9 问题解答 289
13.10 温故知新,学以致用 290
第14章 发送和接收电子邮件 291
14.1 电子邮件介绍 292
14.2 发送邮件 293
14.2.1 SMTP发送邮件 293
14.2.2 发送HTML格式的邮件 296
14.2.3 发送带附件的邮件 297
14.2.4 发送图片 298
14.2.5 同时支持HTML和Plain格式 300
14.2.6 加密SMTP 301
14.3 POP3接收邮件 302
14.3.1 POP3下载邮件 302
14.3.2 解析邮件 303
14.4 调试 305
14.5 问题解答 305
14.6 温故知新,学以致用 306
第15章 网络编程 307
15.1 网络编程初识 308
15.2 TCP/IP简介 308
15.3 网络设计模块 309
15.3.1 Socket简介 309
15.3.2 socket模块 309
15.3.3 socket对象(内建)方法 311
15.4 TCP编程 312
15.4.1 客户端 312
15.4.2 服务器 315
15.5 UDP编程 319
15.6 urllib模块 322
15.6.1 GET请求 322
15.6.2 POST请求 323
15.7 调试 324
15.8 问题解答 325
15.9 温故知新,学以致用 325
第16章 操作数据库 326
16.1 数据库介绍 327
16.2 Python数据库API 327
16.2.1 全局变量 328
16.2.2 异常 328
16.2.3 连接和游标 329
16.2.4 类型 330
16.3 数据库操作 331
16.3.1 数据库连接 331
16.3.2 创建数据库表 332
16.3.3 数据库插入 333
16.3.4 数据库查询 334
16.3.5 数据库更新 335
16.3.6 数据库删除 337
16.4 事务 338
16.5 调试 339
16.6 问题解答 339
16.7 温故知新,学以致用 340
第17章 项目实战——爬虫 341
17.1 了解爬虫 342
17.2 爬虫的原理 342
17.3 爬虫常用的几种技巧 343
17.3.1 基本方法 343
17.3.2 使用代理服务器 343
17.3.3 cookie处理 344
17.3.4 伪装成浏览器 344
17.3.5 登录 345
17.4 爬虫示例——抓取豆瓣电影Top250影评数据 345
17.4.1 确定URL格式 346
17.4.2 页面抓取 346
17.4.3 提取相关信息 347
17.4.4 写入文件 348
17.4.5 完善代码 348
17.5 本章小结 351
第18章 项目实战——数据分析 352
18.1 数据持久化 353
18.2 模块化 357
18.2.1 数据库操作模块化 357
18.2.2 文件生成模块化 360
18.2.3 邮件发送模块化 361
18.3 数据分析的实现 365
18.4 项目小结 369
附录 370
A.1 数学函数 371
A.2 随机函数 371
A.3 三角函数 371
A.4 Python字符串内建函数 372
A.5 列表方法 373
A.6 字典内置方法 374
A.7 正则表达式模式 374
结束语 376