Python中文网

Python可以这样学

cnpython750

Python可以这样学这本书,是由清华大学出版社在2017-01-01月出版的,本书著作者是 董付国 著,此次本版是第1次印刷发行, 国际标准书号(ISBN):9787302456469,品牌为清华大学, 这本书的包装是16开平装,所用纸张为胶版纸,全书共有512页字数78万7000字, 是一本非常不错的Python编程书籍。

此书内容摘要

《Python可以这样学》共分16章,对Python内部工作原理进行了一定深度的剖析,99%以上的案例代码使用Python 3.5.1实现,也适用于Python 3.4.x(除少数几个新特性之外)和*新版本Python 3.5.2以及Python 3.6.0,极个别案例使用Python 2.7.11实现(同样适用于其他版本Python 2.7.x,包括*新的Python2.7.12),适当介绍了Python代码优化、系统编程和安全编程的有关知识,满足不同层次读者的需要。另外,书中通过小提示、小技巧、注意拓展知识等形式介绍了更多的内容,全部内容远比章节目录所显示的要多,需要认真阅读才能真正领会其中的奥妙。

本书适合作为Python程序员的开发指南,也可以作为高等院校计算机专业、软件工程专业等专业的Python教材,还可以作为Python爱好者的指导用书。


关于此书作者

董付国,副教授。自2000年参加工作以来,先后讲授过汇编语言、C/C++/C#、Java和Python等多门编程语言,以及计算机组成原理、计算机网络、数据库原理、数据结构、操作系统、计算机安全、网络安全、计算机图形学、数字图像处理、游戏策划等多门课程,出版《Python程序设计》、《Python程序设计基础》、《Python程序设计(第2版)》系列教材,开发过多套涉及不同领域的管理系统,在国内外高水平学术期刊与会议上发表论文40余篇,其中近30篇被EI检索。学习工作之余*大的爱好是打太极拳。

编辑们的推荐

信息量大、案例丰富、实用性强。全书包含近200个案例和上千段代码,涉及Python基本语法和数据类型,以及GUI、网络应用、数据库、密码学、科学计算与可视化、大数据、图形图像处理等多个领域的开发,书中一些代码进行简单拼凑就可以满足实际工作中需要的很多功能。深度与广度兼顾。剖析Python编程模式,通过小提示、小技巧、注意、拓展知识等形式适当介绍标准库的工作原理、内置函数的高级用法以及代码优化和安全编程知识,同时还补充了很多扩展库的小应用,满足不同层次读者需要。语言轻松愉快,寓教于乐。以Python知识和应用为主线,偶尔穿插一点太极拳论、道德经、易经、古诗词和其他一些文学作品中的名言名句和小故事,部分题目还给出了非常幽默的答案。注释量大。书中几乎每段重要代码都配有相关的注释,让读者能够在*短时间内理解代码的编写思路和要点,大幅度缩短阅读和学习时间。

Python可以这样学图书的目录

第1章Python基础1
1.1Python是一种什么样的语言1
1.2Python开发环境2
1.2.1百家争鸣的繁荣景象2
1.2.2IDLE简单使用6
1.3变量、运算符与表达式9
1.3.1Python变量与内置数据类型9
1.3.2常用内置函数15
1.3.3运算符与表达式21
1.3.4人机对话基本接口25
1.4模块安装与使用28
1.4.1安装Python扩展库28
1.4.2模块导入与使用30
1.4.3编写自己的模块和包32
第2章Python序列35
2.1列表与列表推导式36
2.1.1列表创建与删除36
2.1.2列表常用方法38
2.1.3列表推导式46
2.1.4切片50
2.2元组与生成器推导式54
2.2.1元组54
2.2.2生成器推导式55
2.3字典57
2.3.1字典创建和元素添加、修改与删除57
2.3.2访问字典对象的数据59
2.3.3案例精选61
2.4集合63[1]〖2〗Python可以这样学[1]目录〖2〗2.4.1集合基础知识63
2.4.2集合操作与运算64
2.4.3案例精选67
2.5序列解包69
第3章程序控制结构与函数设计71
3.1选择结构71
3.1.1条件表达式71
3.1.2选择结构的几种形式73
3.1.3案例精选79
3.2循环结构82
3.2.1for循环与while循环的基本语法82
3.2.2break与continue语句83
3.2.3循环代码优化技巧84
3.2.4案例精选86
3.3函数设计与使用90
3.3.1基本语法91
3.3.2函数参数不得不说的几件事94
3.3.3变量作用域99
3.3.4lambda表达式102
3.3.5案例精选104
第4章面向对象程序设计122
4.1基础知识122
4.1.1类的定义与使用122
4.1.2私有成员与公有成员123
4.1.3数据成员125
4.1.4方法126
4.1.5属性129
4.1.6继承131
4.1.7特殊方法与运算符重载134
4.2案例精选135
4.2.1自定义数组135
4.2.2自定义矩阵141
4.2.3自定义队列147
4.2.4自定义栈151
4.2.5自定义二叉树154
4.2.6自定义有向图157
4.2.7自定义集合158
第5章字符串与正则表达式165
5.1字符串165
5.1.1字符串格式化的两种形式168
5.1.2字符串常用方法171
5.1.3案例精选186
5.2正则表达式190
5.2.1正则表达式语法与子模式扩展语法190
5.2.2re模块方法与正则表达式对象193
5.2.3案例精选199
第6章文件与文件夹操作206
6.1文件对象常用方法与属性207
6.2文本文件操作案例精选209
6.3二进制文件操作案例精选217
6.3.1使用pickle模块读写二进制文件217
6.3.2使用struct模块读写二进制文件219
6.3.3使用shelve模块操作二进制文件220
6.3.4使用marshal模块操作二进制文件220
6.4文件与文件夹操作221
6.4.1标准库os、os.path与shutil简介221
6.4.2案例精选227
第7章异常处理结构、代码测试与调试252
7.1异常处理结构252
7.1.1异常是什么252
7.1.2Python内置异常类层次结构254
7.1.3常见异常处理结构形式255
7.2代码测试262
7.2.1doctest263
7.2.2单元测试264
7.3代码调试270
7.3.1使用IDLE调试270
7.3.2使用pdb调试273
阶段性寄语278
第8章数据库应用开发279
8.1使用Python操作SQLite数据库279
8.1.1Connection对象280
8.1.2Cursor对象281
8.1.3Row对象284
8.2使用Python操作其他关系型数据库285
8.2.1操作Access数据库285
8.2.2操作MS SQL Server数据库286
8.2.3操作MySQL数据库288
8.3操作MongoDB数据库290
第9章网络应用开发293
9.1计算机网络基础知识293
9.2Socket编程295
9.2.1UDP编程296
9.2.2TCP编程298
9.2.3网络嗅探器300
9.2.4多进程端口扫描器302
9.2.5代理服务器端口映射功能的实现305
9.2.6自己编写FTP通信软件308
9.3域名解析与网页爬虫313
9.3.1网页内容读取与域名分析313
9.3.2网页爬虫315
9.3.3scrapy框架316
9.3.4BeautifulSoup4318
9.4网站开发323
9.4.1使用IIS运行Python CGI程序323
9.4.2Python在ASP.NET中的应用325
9.4.3Flask框架简单应用327
9.4.4django框架简单应用328
第10章多线程与多进程333
10.1多线程编程334
10.1.1线程创建与管理336
10.1.2线程同步技术339
10.2多进程编程346
10.2.1进程创建与管理347
10.2.2进程间数据交换347
10.2.3进程同步技术350
第11章大数据处理351
11.1大数据简介351
11.2MapReduce框架352
11.3Spark应用开发356
第12章图形编程与图像处理361
12.1图形编程361
12.1.1绘制三维图形361
12.1.2绘制三次贝塞尔曲线364
12.1.3纹理映射365
12.1.4响应键盘事件368
12.1.5光照模型369
12.2图像处理372
12.2.1pillow模块基本用法372
12.2.2计算椭圆中心375
12.2.3动态生成比例分配图376
12.2.4生成验证码图片377
12.2.5gif动态图像分离与生成379
12.2.6材质贴图380
12.2.7图像融合381
12.2.8棋盘纹理生成383
第13章数据分析与科学计算可视化384
13.1扩展库numpy简介384
13.2科学计算扩展库scipy393
13.2.1数学、物理常用常数与单位模块constants394
13.2.2特殊函数模块special395
13.2.3信号处理模块signal395
13.2.4图像处理模块ndimage397
13.3扩展库pandas简介401
13.4统计分析标准库statistics用法简介405
13.5matplotlib407
13.5.1绘制正弦曲线408
13.5.2绘制散点图408
13.5.3绘制饼状图410
13.5.4绘制带有中文标签和图例的图410
13.5.5绘制图例标签中带有公式的图411
13.5.6使用pyplot绘制,多个图形单独显示412
13.5.7绘制三维参数曲线413
13.5.8绘制三维图形414
13.5.9使用指令绘制自定义图形416
13.5.10在tkinter中使用matplotlib417
13.5.11使用matplotlib提供的组件实现交互式图形显示419
13.5.12根据实时数据动态更新图形421
13.5.13使用Slider组件调整曲线参数422
第14章密码学编程425
14.1经典密码算法425
14.1.1恺撒密码算法425
14.1.2维吉尼亚密码427
14.1.3换位密码算法428
14.2安全哈希算法429
14.3对称密钥密码算法DES和AES432
14.4非对称密钥密码算法RSA与数字签名算法DSA433
14.4.1RSA433
14.4.2DSA435
第15章tkinter编程精彩案例436
15.1用户登录界面436
15.2选择类组件应用438
15.3简单文本编辑器441
15.4简单画图程序445
15.5电子时钟449
15.6简单动画451
15.7多窗口编程454
15.8屏幕任意区域截图456
15.9音乐播放器458
15.10远程桌面监控系统462
第16章课堂教学管理系统设计与实现466
16.1功能简介466
16.1.1教师端功能466
16.1.2学生端功能467
16.2数据库设计468
16.3系统总框架与通用功能设计469
16.4数据导入功能473
16.4.1学生名单导入473
16.4.2题库导入473
16.5点名与加分功能475
16.5.1在线点名475
16.5.2离线点名与加分477
16.6随机提问功能480
16.7在线收作业功能482
16.7.1学生端482
16.7.2教师端483
16.8在线自测与在线考试功能485
16.8.1学生端486
16.8.2教师端488
16.9信息查看功能490
16.10数据导出功能492
16.11其他辅助功能493
16.11.1防作弊功能493
16.11.2服务器自动发现功能493
16.11.3Word版试卷生成功能494
结束语496
附录A本书中例题清单497
附录B本书中插图清单503
附录C本书中表格清单507
附录D本书中拓展知识摘要清单508
参考文献513

部分内容试读

Python并不是一门新语言,它由Guido van Rossum于1989年年底开始设计,并于1991年推出第一个公开发行版本,比Java早4年。Python推出不久就迅速得到各行业人士的青睐,经过20多年的发展,已经渗透到统计分析、移动终端开发、科学计算可视化、系统安全、逆向工程、软件测试与软件分析、图形图像处理、人工智能、机器学习、游戏设计与策划、网站开发、数据爬取与大数据处理、密码学、系统运维、音乐编程、影视特效制作、计算机辅助教育、医药辅助设计、天文信息处理、化学、生物信息处理、神经科学与心理学、自然语言处理、电子电路设计、电子取证、树莓派等几乎所有专业和领域,在黑客领域更是多年来一直拥有霸主地位。

作为一个非常不完整列表,这里给出几个Python应用案例: 著名搜索引擎Google的核心代码使用Python实现,迪士尼公司的动画制作与生成采用Python实现,大部分UNIX和Linux操作系统都内建了Python环境支持,豆瓣网使用Python作为主体开发语言进行网站架构和有关应用的设计与开发,网易大量网络游戏的服务器端代码超过70%采用Python进行设计与开发,易度的PaaA企业应用云端开发平台和百度云计算平台BAE也都大量采用了Python语言,eBay已经使用Python超过15年以上(在eBay官方宣布支持Python之前就已经有程序员在使用了),美国宇航局使用Python实现了CAD/CAE/PDM库及模型管理系统,微软集成开发环境Visual Studio 2015开始默认支持Python语言而不需要像之前的版本一样再单独安装PTVS和IronPython,开源ERP系统Odoo完全采用Python语言开发,树莓派使用Python作为官方编程语言,引力波数据是用Python进行处理和分析的,YouTube、美国银行等也在大量使用Python进行开发,类似的案例数不胜数。

早在多年前Python就已经成为卡耐基梅隆大学、麻省理工学院、加州大学伯克利分校、哈佛大学、多伦多大学等国外很多大学计算机专业或非计算机专业的程序设计入门教学语言,近几年来国内也有不少学校的多个专业陆续开设了Python程序设计课程。Python语言连续多年在TIOBE网站的编程语言排行榜上排名七八位,2011年1月Python被TIOBE网站评为2010年年度语言;在2014年12月份IEEE Spectrum推出的编程语言排行榜中,Python取得了第5位的好名次;2015年12月份TIOBE编程语言排行榜上Python跃居第4位,仅次于Java、C和C++,已经成为脚本语言的标准;Top developer Languages of 2015更是把Python排到了第3位。

Python是一门免费、开源的跨平台高级动态编程语言,支持命令式编程、函数式编程,完全支持面向对象程序设计,拥有大量功能强大的内置对象、标准库、涉及各行业领域[1]〖2〗Python可以这样学[1]前言〖2〗的扩展库以及众多狂热的支持者,使得各领域的工程师、科研人员、策划人员甚至管理人员能够快速实现和验证自己的思路、创意或者推测。在有些编程语言中需要编写大量代码才能实现的功能,在Python中直接调用内置函数或标准库方法即可实现,大幅度简化了代码的编写和维护。Python用户只需要把主要精力放在业务逻辑的设计与实现上,在开发速度和运行效率之间达到了完美的平衡,其精妙之处令人击节赞叹。

如何学习Python

要想改变世界,首先要改变自己的世界。要想学好Python,首先要从内心认识到Python的强大与美,树立起学好、用好Python的信念并坚持不懈的努力,然后才有可能攀登Python高手之巅。

很多人从内心很恐惧Python,曾经有不少人问我: “Python功能那么强大,肯定很难学吧?”其实,从编程语言发展史来看,人类语言和机器语言之间的鸿沟越来越小,人机交互越来越方便,越高级的编程语言越接近人类自然语言,越容易学习、掌握和运用,所以请不要有丝毫的恐惧和犹豫,放手去学便是。

以我个人20年的经验,不管学习和使用哪种编程语言,大概都需要经历4个阶段: 第一阶段,能看懂和调试别人的代码;第二阶段,能在别人的代码基础上进行适当改写;第三阶段,能把多段已有的代码拼凑起来实现自己需要的功能;第四阶段,自己动手编写代码实现特定功能需求。一般而言,如果每天坚持3个小时学习Python,两周左右应该就能入门,3个月后就可以展示出不错的成果。当然,随着学习和开发时间越来越长,功力会越来越深厚,能够掌控的代码行数(LOC)会越来越多,能够控制的业务逻辑越来越复杂。

毫无疑问,Python是一门快乐、优雅的语言,上手非常容易,稍加接触就会喜欢上Python并能够在短时间内写出几个小程序。与C语言系列和Java等语言相比,Python大幅度降低了学习与使用的难度。Python易学易用,语法简洁清晰,代码可读性强,编程模式非常符合人类思维方式和习惯。尽管如此,但这并不代表可以毫不费力地学会和熟练运用Python,在学习Python的路上没有秘籍,也没有哈利波特魔法杖,唯一的捷径就是勤学苦练。

多看。读书破万卷,下笔如有神。学习Python也是这样,不仅要多看书,还要看很多遍。很多知识点是互相关联的,单独一个知识点也无法实现稍微复杂一点的功能,书中很多案例代码用到了后面章节的知识点,而后面章节的案例代码又用到了前面章节的内容,这实在是无法避免的一件事。因此,不能奢望看一遍就能熟悉和掌握书中的内容,更不能奢望只看一本书就能学会Python的全部知识。以我个人而言,除了Python官方帮助文档和一些社区的资料之外,已经阅读了超过25本Python方面的书,并且还在不断地购买和阅读别人编写的Python书籍来提高自己对Python的理解。一书一茶一下午,这样平淡的快乐或许有人难以体会,于我却是乐此不疲。

多练。太极拳论曰“由招熟而渐悟懂劲,由懂劲而阶及神明,然非用力之久,不能豁然贯通焉”。陆游的教子诗《冬夜读书示子聿》也认为“纸上得来终觉浅,绝知此事要躬行”。掌握了正确的方法以后,多练是唯一的捷径。一定要动手编写和调试书上的代码,踏踏实实把基础掌握好再有针对性地学习自己需要的扩展库,切忌只看不练。很多人眼高手低,一看就会,一编就错,根本原因就是练得太少了。子曰“学而时习之”,也是这个道理,充分说明练习的重要性。一层功夫一层天。欲穷千里目,更上一层楼。多练,可以说是攀登Python高手之巅最重要的途径。

多想。学而不思则罔,思而不学则殆。一味地看书和埋头苦练是不行的,还要多想、多总结、多整理,争取把学到的知识和技术彻底理解。理解得越多,需要记忆的就越少。

多交流。独学而无友,则孤陋而寡闻。除了重视基础知识的学习和练习之外,还要多交流。除了Python官方网站和在线帮助文档之外,经常浏览一些Python论坛并阅读和调试其中的优秀代码,汲取他人代码中的精华。子曰“三人行必有我师焉,择其善者而从之”,也是相同的道理。遇到不懂的问题也可以去一些论坛发帖提问,或者请教身边的朋友和老师,但是提问之前一定要充分思考,有针对性地请教别人,经过充分思考以后再请教别人不仅是对别人的尊重,也能让自己有更大的收获。百思不得其解的问题经过高手一点拨才能有茅塞顿开和恍然大悟的效果,这样的交流更加有效,不浪费彼此的时间。曾经有学生拿一个十几页代码的程序来问我问题,我问哪里看不懂,他说整个程序都看不懂,想让我帮忙看看然后把整篇代码给他讲讲。正如大家所想的一样,我直接拒绝了他。也曾经有读者问我“怎么用Python做图像处理?”真的很抱歉,这样没营养的问题我实在没法回答。

俗话说,心急吃不了热豆腐。控制好学习的进度和节奏才能获得最好的效果,每天学习一点、进步一点、提高一点,时间久了会突然有一天发现自己已经成为Python高手,很有零存整取的感觉。欲速则不达,把下面这个图送给各位读者朋友共勉。

学拳容易改拳难。不是所有慢悠悠的拳都是太极拳,也不是所有用Python语言写出来的代码都足够Pythonic。很多人认为编程语言都是一通百通,无非是语法不一样而已,认为“没吃过猪肉也见过猪跑”,简单看看语法就能立刻使用另外一种语言编写程序。这样的想法确实有一定的道理,但实际上就算天天看猪跑也没法知道猪肉是啥味道,按照C语言的思路用Python写出来的代码绝对不是好的Python程序,会显得不伦不类,代码会非常啰唆,不得Python精髓,完全不能发挥Python的优势。应该在熟悉Python编程模式的基础上,尽量尝试从最自然、最简洁的角度出发去思考和解决问题,这样才能写出更加优雅、更加Pythonic的代码,像诗一样美。

汝果欲学诗,功夫在诗外。没有丰富的人生阅历很难写出优美并且有内涵、有灵魂的诗,学习Python也是这样。归根到底,Python是用来表达我们思想、算法或帮我们解决某个问题的语言和工具而已,idea才是一个程序的灵魂。切不可把全部精力放到Python语言本身的学习上,而是要把主要精力放到自己的专业知识学习上,最终再用Python把自己的思想或算法准确地表达出来。本书从不同领域选取了一些有代表性的案例,同时还结合自己多年的项目开发和教学经验整理和设计了一些案例,希望能够起到抛砖引玉的作用。

内容组织与阅读建议

对于Python程序员来说,熟练运用优秀、成熟的扩展库可以快速实现业务逻辑和创意,而Python语言基础知识和基本数据结构的熟练掌握则是理解和运用其他扩展库的必要条件。并且,在实际开发中建议优先使用Python内置对象和标准库对象实现预定功能,这样可以获得更高的执行效率。本书前7章使用大量篇幅介绍Python编程基础知识,通过大量案例演示Python语言的精妙与强大。然后从第8章开始介绍大量标准库和扩展库在GUI编程、网络编程、数据库编程、大数据处理、多线程与多进程编程、系统运维、图形图像编程、科学计算可视化、密码学编程、移动终端编程等多个领域的应用。最后一章通过一个完整的系统演示了Python在实际系统开发中的应用。全书共16章,读者在熟练掌握前7章之后,可以结合自己的专业领域或兴趣爱好,在其他章节中有选择地进行阅读。

第1章Python基础。介绍如何选择Python版本和开发环境,Python对象模型,数字、字符串等基本数据类型,运算符与表达式,常用内置函数,基本输入输出函数,扩展库管理与使用。

第2章Python序列。讲解序列常用方法和基本操作,列表基本操作与常用方法,切片操作,列表推导式,元组与生成器推导式,序列解包,字典、集合基本操作与常用方法,字典推导式与集合推导式。

第3章程序控制结构与函数设计。讲解Python选择结构、for循环与while循环,带else子句的循环结构,break与continue语句,循环代码优化,函数定义与使用,关键参数、默认值参数、长度可变参数等不同参数类型,全局变量与局部变量,参数传递时的序列解包,return语句,lambda表达式以及map()、reduce()、filter()、生成器与可调用对象。

第4章面向对象程序设计。讲解类的定义与使用,self与cls参数,类成员与实例成员,私有成员与公有成员,继承与派生,属性,特殊方法与运算符重载等内容,以及自定义类实现数组、矩阵、队列、栈、二叉树、有向图、集合等数据结构。

第5章字符串与正则表达式。讲解字符串编码格式,字符串格式化、替换、分割、连接、查找、排版等基本操作,正则表达式语法、正则表达式对象、子模式与子模式扩展语法、match对象,以及Python正则表达式模块re的应用。

第6章文件与文件夹操作。讲解文件操作基本知识,Python文件对象,文本文件读写操作,二进制文件读写与对象序列化,文件复制、移动、重命名,文件类型检测,文件完整性检查,压缩与解压缩,文件夹大小统计,文件夹增量备份,删除指定类型的文件,以及word、excel、zip、apk、rar等常见文件类型的操作。

第7章异常处理结构、代码测试与调试。讲解Python异常类层次结构与自定义异常类,多种不同形式的异常处理结构,使用IDLE和pdb模块调试Python程序,Python单元测试相关知识。

第8章数据库应用开发。介绍SQLite数据库及其相关概念,Connection对象、Cursor对象、Row对象,使用Python操作Access、MS SQL Server、MySQL等关系型数据库以及使用Python操作NoSQL数据库MongoDB。

第9章网络应用开发。讲解计算机网络基础知识,TCP、UDP协议编程,网络嗅探器与端口扫描器设计,域名解析与网页爬虫设计原理,代理服务器与FTP软件原理与实现,使用Python编写CGI程序,使用Flask和django框架开发Web应用,以及使用C#与Python混合开发Web应用。

第10章多线程与多进程。讲解Python标准库threading和multiprocessing在多线程编程与多进程编程中的应用,以及多线程与多进程之间的数据共享与同步控制。

第11章大数据处理。介绍大数据处理框架MapReduce、Hadoop和Spark基本概念,重点介绍MapReduce和Spark应用。

第12章图形编程与图像处理。讲解扩展库PyOpenGL在计算机图形学编程中的应用,扩展库pillow在图像编程中的应用。

第13章数据分析与科学计算可视化。讲解扩展库numpy、scipy、matplotlib在科学计算与可视化领域的应用,以及标准库statistics与扩展库pandas在统计与分析、数据处理中的应用。

第14章密码学编程。介绍恺撒密码、维吉尼亚密码等经典密码算法的Python实现,以pycrypto、rsa、hashlib等模块为主讲解安全哈希算法、对称密钥密码算法DES与AES以及非对称密钥密码算法RSA与DSA的应用。

第15章tkinter编程精彩案例。讲解如何使用Python标准库tkinter进行GUI编程,通过大量实际案例演示基本组件的用法,包括用户登录界面设计、选择类组件应用、简单文本编辑器、画图程序设计与实现、电子时钟、简单动画、屏幕任意区域截图、音乐播放器、远程桌面监控程序等。

第16章课堂教学管理系统设计与实现。通过一个综合案例来演示前面章节知识的应用,提供了学生名单和题库的导入、在线点名、在线提问、在线答疑、在线收作业、在线自测与考试、数据导出、防作弊与服务器自动发现、信息汇总、试卷生成等功能。

本书的最大特点是信息量大、知识点紧凑、案例丰富、注释量大、实用性强,把书中一些代码进行简单拼凑就可以满足实际工作中需要的很多功能。全书近200个涉及不同行业领域的实用案例和上千个代码片段并且配有大量注释以方便理解,没有插入多余的程序输出结果或软件安装截图,只保留了必要的代码运行结果或截图以供读者参考和对比,充分利用宝贵的篇幅来介绍和演示尽可能多的知识,绝对物超所值。本书作者具有16年程序设计教学经验,先后讲授过汇编语言、C/C++/C#、Java、PHP、Python等多门程序设计语言,并且编写过大量的应用程序,其中有几套系统已投入使用多年并一直在使用。本书内容结合了作者多年教学与开发过程中积累的许多经验和案例,并巧妙地糅合进了相应的章节。

本书对Python内部工作原理进行了一定深度的剖析,书中99%以上的案例均使用Python 3.5.1实现,这些代码同样也适用于Python 3.4.x(除少数几个新特性之外,如矩阵运算符@)和最新版本Python 3.5.2以及马上就要正式面世的Python 3.6.0,极个别案例使用Python 2.7.11实现(同样适用于其他版本Python 2.7.x,包括最新的Python 2.7.12),并适当介绍了Python代码优化、系统编程和安全编程的有关知识,可以满足不同层次读者的需要。另外,书中通过小提示、小技巧、注意、拓展知识等形式介绍了更多的内容,所以全部内容远比章节目录所显示的要多,需要认真阅读才能真正领会其中的奥妙。

配套资源

本书提供所有案例源代码,可以登录清华大学出版社网站(www.tup.com.cn)下载,或加入本书读者群(QQ群号为282819961)下载最新配套资源并与作者直接交流,作者微信号Python_dfg也随时期待您的反馈和交流,当然也欢迎关注微信公众号“Python小屋”及时阅读作者写的最新案例代码。

本书适用读者

本书可以作为(但不限于):

�r 本科、专科或研究生程序设计课程教材。

�r Python培训用书。

�r 具有一定Python基础的读者进阶首选学习资料。

�r 涉及Python开发的工程师、策划人员、科研人员和管理人员阅读书目。

�r 打算利用业余时间学习一门快乐的程序设计语言并编写几个小程序来娱乐的读者首选学习资料。

�r 少数对编程具有浓厚兴趣和天赋的中学生课外阅读资料。

感谢

首先感谢父母的养育之恩,在当年那么艰苦的条件下还坚决支持我读书,没有让我像其他同龄的孩子一样辍学。感谢姐姐、姐夫多年来对我的爱护以及在老家对父母的照顾,感谢善良的弟弟、弟媳在老家对父母的照顾,正是有了你们,远离家乡的我才能安心工作。当然,最应该感谢的是妻子和孩子对我这个技术狂人的理解,这些年来她们已经习惯了正在吃饭的我突然想起个思路然后就跑到计算机前面去写代码了,习惯了我每个周末和假期都在教研室看书或写代码而不陪她们,也习惯了周末的中午和晚上做好饭以后再打电话让我回家。为了表示对我的支持,她们还阅读了本书定稿前的版本并发现了几个错别字。

感谢每一位读者,感谢您在茫茫书海中选择了本书,衷心祝愿您能够从本书中受益,学到真正需要的知识!同时也期待每一位读者的热心反馈,随时欢迎您指出书中的不足!

本书的出版获2014年山东省普通高校应用型人才培养专业发展支持计划项目资助。我校专业共建合作伙伴——浪潮优派科技教育有限公司总裁邵长臣先生审阅了全书,并提出很多宝贵的意见,在此致以诚挚的谢意。本书在编写出版过程中也得到清华大学出版社的大力支持和帮助,在此表示衷心的感谢。

董付国于山东烟台

2016年7月

关于此书评价

暂无.

书摘内容

第3章程序控制结构与函数设计

3.1选 择 结 构

生活中处处充满了选择: 如果周末不下雨我就约朋友去爬山,否则就去教学楼大厅里打太极拳;如果某个同学平时学习很认真但是期末考试前确实因为临时有事耽误了复习而没有考好,只要差得不太多我也一样给打及格;去市场买菜的时候比较一下,哪家的菜又好又便宜就买哪家的;诸如此类,我们时刻都在根据实际条件做出这样或那样的选择。编写程序也是如此,当某个条件得到满足时就去做特定的事情,否则就做另一件事情,这就是选择结构。

3.1.1条件表达式

在选择结构和循环结构中,都要根据条件表达式的值来确定下一步的执行流程。条件表达式的值只要不是False、0(或0.0、0j等)、空值暂无.、空列表、空元组、空集合、空字典、空字符串、空range对象或其他空迭代对象,Python解释器均认为与True等价。从这个意义上来讲,所有的Python合法表达式都可以作为条件表达式,包括含有函数调用的表达式。例如: >>> if 3:#使用整数作为条件表达式

print(5)

5

>>> a=\[1, 2, 3\]

>>> if a:#使用列表作为条件表达式

print(a)

\[1, 2, 3\]

>>> a=\[\]

>>> if a:

print(a)

else:

print('empty')

empty

>>> i=s=0

>>> while i <= 10:#使用关系表达式作为条件表达式s += i

i += 1

>>> print(s)

55

>>> i=s=0

>>> while True:#使用常量True作为条件表达式

s += i

i += 1

if i>10:#符合特定条件时使用break语句退出循环

break

>>> print(s)

55

>>> s=0

>>> for i in range(0, 11, 1):#遍历序列元素

s += i

>>> print(s)

55[1]〖2〗Python可以这样学[1]第3章程序控制结构与函数设计〖2〗关于表达式和运算符的详细内容在1.3.3节中已有介绍,这里不再赘述,只重点介绍一下比较特殊的几个运算符。首先是关系运算符,与很多语言不同的是,在Python中的关系运算符可以连续使用,例如:>>> print(1<2<3)

True

>>> print(1<2>3)

False

>>> print(1<3>2)

True在Python中,条件表达式中不允许使用赋值运算符“=”,避免了其他语言中误将关系运算符“==”写作赋值运算符“=”带来的麻烦,例如,下面的代码在条件表达式中使用赋值运算符“=”将抛出异常,提示语法错误。>>> if a=3:#条件表达式中不允许使用赋值运算符

SyntaxError: invalid syntax

>>> if(a=3)and(b=4):

SyntaxError: invalid syntax比较特殊的运算符还有逻辑运算符and和or,这两个运算符具有短路求值或惰性求值的特点,简单地说,就是只计算必须计算的表达式的值。以and为例,对于表达式“表达式1 and 表达式2”而言,如果“表达式1”的值为False或其他等价值时,不论“表达式2”的值是什么,整个表达式的值都是False,此时“表达式2”的值无论是什么都不影响整个表达式的值,因此将不会被计算,从而减少不必要的计算和判断。另外,Python中的逻辑运算符在某些方面和其他语言也有所不同,例如: >>> 3 and 5

5

>>> 3 or 5

3

>>> 0 and 5

0

>>> 0 or 5

5

>>> not 3

False

>>> not 0

True下面的函数使用指定的分隔符把多个字符串连接成一个字符串,如果用户没有指定分隔符则使用逗号。>>> def Join(chList, sep=暂无.):

return(sep or ',').join(chList)#注意:参数sep不是字符串时会抛出异常

>>> chTest=\['1', '2', '3', '4', '5'\]

>>> Join(chTest)

'1,2,3,4,5'

>>> Join(chTest, ':')

'1:2:3:4:5'

>>> Join(chTest, ' ')

'1 2 3 4 5'当然,也可以把上面的函数直接定义为下面带有默认值参数的形式: >>> def Join(chList, sep=','):

return sep.join(chList)小技巧: 在设计包含多个条件的条件表达式时,如果能够大概预测不同条件失败的概率,并将多个条件根据and和or运算符的短路求值特性来组织顺序,可以大幅度提高程序运行效率,减少不必要的计算,这也属于代码优化的内容。

拓展知识: 逻辑运算符与常见电路连接方式的相似之处。大家应该都学过高中物理,还记得并联电路、串联电路、短路这样的概念吗?可以做个简单类比,or运算符类似于并联电路,只要有一个开关是通的那么灯就是亮的;and运算符类似于串联电路,必须所有开关是通的那么灯才是亮的;not运算符类似于短路电路,如果开关通了那么灯就灭了,如图3��1所示。

图3��1逻辑运算符与几种电路的类比关系

3.1.2选择结构的几种形式

选择结构通过判断某些特定条件是否满足来决定下一步的执行流程,是非常重要的控制结构。常见的有单分支选择结构、双分支选择结构、多分支选择结构以及嵌套的分支结构,形式比较灵活多变,具体使用哪一种最终还是取决于要实现的业务逻辑。循环结构和异常处理结构中也可以带有else子句,也可以看作是特殊形式的选择结构。

1. 单分支选择结构

单分支选择结构是最简单的一种形式,其语法如下所示,其中表达式后面的冒号“:”是不可缺少的,表示一个语句块的开始,后面几种其他形式的选择结构和循环结构中的冒号也是必须要有的。图3��2单分支选择结构

if 表达式:

语句块当表达式值为True或其他等价值时,表示条件满足,语句块将被执行,否则该语句块将不被执行,继续执行后面的代码(如果有),如图3��2所示。

下面的代码简单演示了单分支选择结构的用法: x=input('Input two numbers:')

a, b=map(int, x.split())

if a>b:

a, b=b, a#序列解包,交换两个变量的值

print(a, b)注意: 在Python中,代码的缩进非常重要,缩进是体现代码逻辑关系的重要方式,同一个代码块必须保证相同的缩进量。有的老师让学生学习Python的原因之一就是Python对代码排版或布局的严格要求可以培养学生严谨的习惯。而实际上,只要遵循一定的约定,Python代码的排版是可以降低要求的,例如下面的代码: >>> if 3>2: print('ok')#如果语句较短,可以直接写在分支语句后面

ok

>>> if True:print(3);print(5)#在一行写多个语句,使用分号分隔

3

5小提示: 在上面代码中,“a, b=b, a”是Python序列解包的用法,用来交换两个变量的值,等价于C语言的如下3条代码(假设变量已经声明并且类型正确),关于序列解包更多内容请参考2.5节。c=a;

a=b;

b=c;2. 双分支选择结构

双分支选择结构的语法为if 表达式:

语句块1

else:

语句块2当表达式值为True或其他等价值时,执行语句块1,否则执行语句块2,如图3��3所示。

图3��3双分支选择结构

下面的代码演示了双分支选择结构的用法: >>> chTest=\['1', '2', '3', '4', '5'\]

>>> if chTest:

print(chTest)

else:

print('Empty')

\['1', '2', '3', '4', '5'\]拓展知识: Python还提供了一个三元运算符,可以实现与选择结构相似的效果。语法为value1 if condition else value2当条件表达式condition的值与True等价时,表达式的值为value1,否则表达式的值为value2。另外,value1和value2本身也可以是复杂表达式,也可以包含函数调用。下面的代码演示了上面的表达式的用法,可以看出,这个结构的表达式也具有惰性求值的特点。>>> a=5

>>> print(6)if a>3 else print(5)

6

>>> print(6 if a>3 else 5)#注意,虽然结果与上一行代码一样,但代码含义不同

6

>>> b=6 if a>13 else 9#赋值运算符优先级低

>>> b

9

>>> x=math.sqrt(9)if 5>3 else random.randint(1, 100)

#此时还没有导入math模块

Traceback(most recent call last):

File "", line 1, in

x=math.sqrt(9)if 5>3 else random.randint(1,100)

NameError: name 'math' is not defined

>>> import math

#此时没有导入random模块,由于条件表达式5>3的值为True,所以可以正常运行

>>> x=math.sqrt(9)if 5>3 else random.randint(1,100)

#第一个条件表达式2>3的值为False,需要计算第二个表达式的值,然而此时还没有导入random模块,从而出错

>>> x=math.sqrt(9)if 2>3 else random.randint(1, 100)

Traceback(most recent call last):

File "", line 1, in

x=math.sqrt(9)if 2>3 else random.randint(1,100)

NameError: name 'random' is not defined

>>> import random

>>> x=math.sqrt(9)if 2>3 else random.randint(1, 100)最后,三元运算符是可以嵌套使用的,可以实现多分支选择的效果,但这样的代码可读性非常不好,不建议使用。>>> x=3

>>>(1 if x>2 else 0)if f(x)>5 else('a' if x<5 else 'b')

#可以嵌套使用,但不提倡这样用

1

>>> x=0

>>>(1 if x>2 else 0)if f(x)>5 else('a' if x<5 else 'b')

'a' 3. 多分支选择结构

多分支选择结构为用户提供了更多的选择,可以实现复杂的业务逻辑,多分支选择结构的语法为if 表达式1:

语句块1

elif 表达式2:

语句块2

elif 表达式3:

语句块3

��

else:

语句块n其中,关键字elif是else if的缩写。下面的代码演示了如何利用多分支选择结构将成绩从百分制变换到等级制。>>> def func(score):

if score>100:

return 'wrong score.must <= 100.'

elif score >= 90:

return 'A'

elif score >= 80:

return 'B'

elif score >= 70:

return 'C'

elif score >= 60:

return 'D'

elif score >= 0:

return 'E'

else:

return 'wrong score.must >0'

>>> func(120)

'wrong score.must <= 100.'

>>> func(99)

'A'

>>> func(87)

'B'

>>> func(62)

'D'

>>> func(3)

'E'

>>> func(-10)

'wrong score.must >0'4. 选择结构的嵌套

选择结构可以进行嵌套来表达复杂的业务逻辑,语法如下: if 表达式1:

语句块1

if 表达式2:

语句块2

else:

语句块3

else:

if 表达式4:

语句块4图3��4代码层次与隶属关系

……

Python可以这样学最新最全的试读、书评、目录、简介信息由Python中文网整理提供。