新書推薦:
《
积极心理学
》
售價:NT$
254.0
《
自由,不是放纵
》
售價:NT$
250.0
《
甲骨文丛书·消逝的光明:欧洲国际史,1919—1933年(套装全2册)
》
售價:NT$
1265.0
《
剑桥日本戏剧史(剑桥世界戏剧史译丛)
》
售價:NT$
918.0
《
中国高等艺术院校精品教材大系:材料的时尚表达??服装创意设计
》
售價:NT$
347.0
《
美丽与哀愁:第一次世界大战个人史
》
售價:NT$
653.0
《
国家豁免法的域外借鉴与实践建议
》
售價:NT$
857.0
《
大单元教学设计20讲
》
售價:NT$
347.0
|
編輯推薦: |
内容与Python*版本同步。面向Python 3.5.x、Python 3.6.x及更新版本,重点关注内置对象和标准库对象的高级用法以及比较前沿的一些新技术。语言精练、代码优雅。深入剖析Python编程模式,使用*简练的语言和代码介绍Python高级用法,完美诠释Pythonic的真正含义。案例丰富、注释量大、实用性强。精选多个领域中的经典案例,几乎每段重要代码都配有大量注释,让读者能够在*短时间内理解代码思路和要点,大幅度缩短阅读和学习时间,由浅入深,层层递进,平滑学习曲线。
|
內容簡介: |
全书共13章,面向Python 3.5.x、Python 3.6.x和Python 3.7.x,重点关注Python内置对象和标准库对象的高级应用以及比较前沿的一些新技术,偶尔涉及一点扩展库用法。第1章介绍Python语言编程规范与代码优化建议、开发环境配置、程序伪编译与打包。第2章详解运算符与内置函数的用法。第3章详解各种序列对象、推导式、切片和序列解包。第4章详解选择结构和循环结构,关键字else、break与continue。第5章详解函数的基本用法,可调用对象与修饰器、函数参数、变量的作用域、生成器函数、lambda表达式、函数柯里化、泛型函数、协程函数和回调函数。第6章详解类的定义、不同类型的成员、依赖注入技术和运算符重载。第7章详解字符串编码与格式化方法、字符串对象方法、文本排版与压缩、汉字拼音有关的技术。第8章详解正则表达式语法、re模块、正则表达式对象与match对象。第9章详解文件对象用法、文件内容操作。第10章详解文件与文件夹操作。第11章详解异常处理结构、文档测试与单元测试、覆盖测试与软件性能测试、代码调试技术。第12章详解不同类型的并行处理技术。第13章详解asyncio提供的网络通信功能。 本书不但可以作为Python程序设计教材,还可作为Python开发工程师的指导用书。
|
關於作者: |
董付国 副教授。自2000年参加工作以来,先后讲授过汇编语言、CCC#、Java和Python等多门编程语言,以及计算机组成原理、计算机网络、数据库原理、数据结构、操作系统、计算机安全、网络安全、计算机图形学、数字图像处理、游戏策划等多门课程,多次获得校级优秀教学成果奖一等奖,出版《Python程序设计》、《Python程序设计基础》、《Python程序设计(第2版)》系列教材,开发过多套涉及不同领域的管理系统,在国内外高水平学术期刊与会议上发表论文40余篇,其中近30篇被EI检索。学习工作之余最大的爱好是打太极拳。
|
目錄:
|
目录
第1章管中窥豹: Python概述1
1.1Python是这样一种语言1
1.2Python版本之争1
1.3Python编程规范与代码优化建议2
1.4Python虚拟开发环境的搭建4
1.5Eclipse PyDev环境搭建和使用4
1.6安装扩展库的几种方法6
1.7标准库与扩展库中对象的导入与使用7
1.7.1import 模块名 [as 别名]8
1.7.2from模块名import对象名[as别名]8
1.7.3from 模块名 import9
1.7.4模块导入时的搜索路径10
1.8编写与发布自己的包10
1.9Python程序伪编译与打包12
1.10从命令行参数和配置文件获取信息14
第2章万丈高楼平地起: 运算符、表达式与内置对象16
2.1Python常用内置对象16
2.1.1常量与变量17
2.1.2数字18
2.1.3字符串21
2.1.4列表、元组、字典、集合22
2.2Python运算符与表达式23
2.2.1算术运算符24
2.2.2关系运算符25
2.2.3成员测试运算符in与同一性测试运算符is26
2.2.4位运算符与集合运算符27
2.2.5逻辑运算符28
2.2.6矩阵乘法运算符@29〖1〗〖2〗Python程序设计开发宝典〖1〗目录〖2〗2.2.7补充说明29
2.3Python关键字简要说明30
2.4Python常用内置函数用法精要31
2.4.1类型转换与类型判断34
2.4.2最值与求和38
2.4.3基本输入输出40
2.4.4排序与逆序42
2.4.5枚举与迭代43
2.4.6map、reduce、filter45
2.4.7range48
2.4.8zip48
2.4.9eval、exec49
第3章玄之又玄,众妙之门: 详解Python序列结构51
3.1列表: 打了激素的数组51
3.1.1列表创建与删除52
3.1.2列表元素访问53
3.1.3列表常用方法54
3.1.4列表对象支持的运算符59
3.1.5内置函数对列表的操作61
3.1.6使用列表模拟向量运算62
3.1.7列表推导式语法与应用案例63
3.1.8切片操作的强大功能70
3.2元组: 轻量级列表73
3.2.1元组创建与元素访问73
3.2.2元组与列表的异同点74
3.2.3生成器推导式75
3.3字典: 反映对应关系的映射类型76
3.3.1字典创建与删除77
3.3.2字典元素的访问77
3.3.3元素的添加、修改与删除79
3.3.4标准库collections中与字典有关的类80
3.4集合: 元素之间不允许重复81
3.4.1集合对象的创建与删除81
3.4.2集合操作与运算82
3.4.3不可变集合frozenset84
3.4.4集合应用案例84
3.5序列解包的多种形式和用法86
3.6标准库中的其他常用数据类型88
3.6.1枚举类型88
3.6.2数组类型89
3.6.3队列90
3.6.4具名元组92
3.6.5堆92
第4章反者,道之动: 程序控制结构94
4.1条件表达式94
4.2选择结构96
4.2.1单分支选择结构96
4.2.2双分支选择结构97
4.2.3多分支选择结构98
4.2.4选择结构的嵌套99
4.2.5构建跳转表实现多分支选择结构100
4.3循环结构100
4.3.1for循环与while循环100
4.3.2break与continue语句101
4.3.3循环代码优化技巧102
4.4精彩案例赏析103
第5章代码复用技术一: 函数111
5.1函数定义与使用111
5.1.1基本语法111
5.1.2函数嵌套定义、可调用对象与修饰器113
5.1.3函数对象成员的动态性117
5.1.4函数递归调用117
5.2函数参数118
5.2.1位置参数120
5.2.2默认值参数120
5.2.3关键参数122
5.2.4可变长度参数122
5.2.5强制函数的某些参数必须以关键参数形式进行传值123
5.2.6强制函数的所有参数必须以位置参数形式进行传值124
5.2.7传递参数时的序列解包125
5.2.8标注函数参数与返回值类型126
5.3变量作用域127
5.3.1全局变量与局部变量127
5.3.2nonlocal变量130
5.4lambda表达式130
5.5生成器函数设计要点133
5.6偏函数与函数柯里化135
5.7单分发器与泛型函数136
5.8协程函数138
5.9注册程序退出时必须执行的函数140
5.10回调函数原理与实现140
5.11精彩案例赏析141
第6章代码复用技术二: 面向对象程序设计167
6.1类的定义与使用167
6.1.1基本语法167
6.1.2type类168
6.1.3定义带修饰器的类169
6.2数据成员与成员方法171
6.2.1私有成员与公有成员171
6.2.2数据成员172
6.2.3成员方法、类方法、静态方法、抽象方法173
6.2.4属性175
6.2.5类与对象的动态性、混入机制177
6.3继承、多态、依赖注入179
6.3.1继承179
6.3.2多态181
6.3.3依赖注入技术的不同实现方法182
6.4特殊方法与运算符重载185
6.5精彩案例赏析187
6.5.1自定义队列187
6.5.2自定义栈191
6.5.3自定义集合193
6.5.4自定义数组199
6.5.5自定义双链表204
6.5.6自定义常量类206
6.5.7自定义不允许修改值的字典207
6.5.8自定义支持with关键字的类208
第7章文本处理一: 字符串209
7.1字符串编码格式简介210
7.2转义字符与原始字符串211
7.3字符串格式化212
7.3.1使用%符号进行格式化212
7.3.2使用format方法进行字符串格式化213
7.3.3格式化的字符串常量215
7.3.4使用Template模板进行格式化215
7.4字符串常用操作216
7.4.1find、rfind、index、rindex、count216
7.4.2split、rsplit、partition、rpartition217
7.4.3join219
7.4.4lower、upper、capitalize、title、swapcase220
7.4.5replace、maketrans、translate220
7.4.6strip、rstrip、lstrip221
7.4.7startswith、endswith222
7.4.8isalnum、isalpha、isdigit、isdecimal、isnumeric、
isspace、isupper、islower222
7.4.9center、ljust、rjust、zfill223
7.4.10字符串对象支持的运算符224
7.4.11适用于字符串对象的内置函数226
7.4.12字符串对象的切片操作228
7.5其他有关模块228
7.5.1textwrap模块228
7.5.2zlib模块提供的压缩功能231
7.6字符串常量232
7.7可变字符串232
7.8中英文分词234
7.9汉字到拼音的转换235
7.10精彩案例赏析236
第8章文本处理二: 正则表达式239
8.1正则表达式语法239
8.1.1正则表达式基本语法239
8.1.2正则表达式扩展语法240
8.1.3正则表达式锦集241
8.2直接使用正则表达式模块re处理字符串242
8.3使用正则表达式对象处理字符串246
8.4match对象248
8.5精彩案例赏析250
第9章数据永久化: 文件内容操作257
9.1文件操作基本知识258
9.1.1内置函数open258
9.1.2文件对象属性与常用方法260
9.1.3上下文管理语句with261
9.2文本文件内容操作案例精选261
9.3二进制文件操作案例精选266
9.3.1使用pickle模块读写二进制文件267
9.3.2使用struct模块读写二进制文件268
9.3.3使用shelve模块操作二进制文件269
9.3.4使用marshal模块操作二进制文件270
9.3.5其他常见类型二进制文件操作案例271
第10章文件与文件夹操作281
10.1os模块281
10.2os.path模块284
10.3shutil模块286
10.4其他常用模块287
10.4.1glob模块287
10.4.2fnmatch模块288
10.5精彩案例赏析289
第11章代码质量保障: 异常处理结构、程序调试与测试293
11.1异常处理结构293
11.1.1异常的概念与表现形式293
11.1.2Python内置异常类层次结构294
11.1.3异常处理结构296
11.1.4断言与上下文管理语句301
11.2文档测试doctest301
11.3单元测试unittest304
11.4覆盖测试307
11.5软件性能测试308
11.6代码调试310
11.6.1使用IDLE调试310
11.6.2使用Eclipse PyDev进行代码调试311
11.6.3使用pdb调试313
第12章多任务与并行处理: 线程、进程、协程、分布式、GPU加速318
12.1多线程编程318
12.1.1线程概念与标准库threading318
12.1.2线程对象320
12.1.3线程调度323
12.1.4LockRLock对象324
12.1.5Condition对象326
12.1.6Queue对象328
12.1.7Event对象332
12.1.8Semaphore与BoundedSemaphore333
12.1.9Barrier对象334
12.2多进程编程335
12.2.1进程创建与管理335
12.2.2进程同步技术336
12.2.3Pool对象337
12.2.4Manager对象341
12.2.5Listener与Client对象345
12.2.6进程间数据交换与共享345
12.2.7标准库subprocess348
12.3协程349
12.4concurrent.futures模块提供的并发执行功能351
12.5pySpark并行计算与分布式计算框架353
12.6GPU编程359
12.6.1使用pycuda实现GPU加速359
12.6.2使用pyopencl实现GPU加速360
12.6.3使用tensorflow实现GPU加速362
第13章互通互联: asyncio提供的网络通信功能364
13.1Transport类与Protocol类364
13.2StreamReader与StreamWriter369
附录精彩在继续373
附录AGUI开发373
附录BSQLite数据库操作376
附录C计算机图形学编程377
附录D图像编程380
附录E数据分析、机器学习、科学计算可视化383
附录F密码学编程383
附录G系统运维384
附录HWindows系统编程384
附录I软件分析与逆向工程386
参考文献388
|
內容試閱:
|
前言 作者第一次接触Python大概是在2002年,在几个著名的安全网站上看到有人用这个语言,当时的作者正痴迷于C语言和汇编语言,内心不屑于学习这种脚本语言。2010年的时候因为要用IDA Pro分析一个PE文件而不得不借助于IDAPython插件,才真正感觉到了Python的方便与强大,于是购买了很多书籍并且阅读了大量在线文档开始系统地学习Python。2013年学校组织各专业教研室修订新版人才培养方案时,经过慎重考虑并且与其他几位老师进行了多次沟通,最终确定为数字媒体技术专业和服务外包专业增加了Python程序设计这门课程。然而,虽然当时市面上已经有了一些Python书籍,但是适合作为教材的却寥寥无几,有的过于专注某个专业领域,有的则是泛泛地介绍一点皮毛,并且很多书里放置的插图占用了大量篇幅,知识密度很小,不是作者喜欢的风格。在翻看了超过20本Python图书以后,作者决定动手写一本适合作教材的书,于是就有了面向计算机及相关专业的《Python程序设计》(书号为9787302407232,2015年8月出版)和面向非计算机专业的《Python程序设计基础》(书号为9787302410584,2015年8月出版,2016年3月第2次印刷,2017年1月第3次印刷),前者主要介绍Python 2.7.x的基本语法以及在各领域的应用,后者主要介绍Python 3.4.x的基本语法而没有涉及太多的应用。本来当时写这两本书的目的仅仅是为了自己上课用起来方便,然而出版不到一年就被近30所院校选作教材,还有几十所院校的图书馆也采购了这两本书供学生借阅,反响非常好。应广大读者和用书老师的要求,也为了紧跟Python飞速发展的步伐,作者于2016年6月又出版了《Python程序设计(第2版)》书号为9787302436515,这本书使用Python 3.5.x重写了第1版中的所有案例,并且新增案例近百个,出版后迅速被多所院校选作教材,各大网上书店也频频缺货,2016年11月初进行了第2次印刷,2017年3月进行了第3次印刷。考虑到更多的Python爱好者并没有听老师讲课的机会,看教材自学可能比较吃力,作者于2017年1月份出版了《Python可以这样学》书号为9787302456469,全书500多页,使用生动活泼的语言讲解Python 3.5.x的知识和应用(绝大部分内容也适用于Python 3.6.x和Python 3.7.x),在《Python程序设计(第2版)》的基础上删掉了软件分析与逆向工程和安卓平台的Python编程内容,新增了大量案例,并且融入了道德经、周易、太极拳理论中的核心思想以及大量中外名人名言,通过小提示、小技巧、注意、拓展知识等多种形式扩充了大量知识,尤其适合Python爱好者自学,也可作为进阶工具书进行查阅。该书出版之后迅速得到社会各界人士的一致认可,第一批印刷的书很快被抢购一空,不到两个月就进行了第二次印刷。回头想想,自己二十年如一日地每天熬夜看书学习写代码还是值得的。〖1〗〖2〗Python程序设计开发宝典〖1〗前言〖2〗当2016年6月份作者前几本Python系列图书的责任编辑白立军老师约作者再编写一本面向高级程序员的Python图书时,说实话,内心是喜悦的,很高兴自己的努力得到广大Python爱好者的认可。但同时作者内心也有些担心,感觉在写前4本书时已经用完了自己的洪荒之力。在这本新书里再写点什么好呢?内容该如何组织呢?如何避免过多地重复利用前几本书里的案例呢?反复思考了近2个月,考虑目前很多Python程序员的现状:喜欢直接使用各种扩展库来解决问题,不重视对Python语言本身的理解,内功不够深厚,导致很多代码粗制滥造。最终作者做出决定,在这本新书里,不再介绍太多扩展库的应用,而是把重点放在Python语法和内置对象、标准库对象的高级应用上,注重Python的内涵,注重内功的修炼,尽量往纵深发展,争取用最简练的语言介绍那些作者认为比较高级的用法。在编写过程中,尽量减少与前几本书中内容的重复,补充大量新案例和高级用法。当然,前面几本书里的有些案例在这本书里又出现了,但是仔细的读者应该能发现,很多案例代码都进行了必要的改写和优化,更加Pythonnic,更加优雅和高效。自从答应了写这本书之后,作者在不影响正常教学和科研工作的情况下每天拿出至少10个小时查阅资料、编写代码或者整理书稿,前后用了一年左右的时间,现在回头想想也挺值得,在整理资料和编写案例代码的同时作者自己也进步了很多,对Python有了更加深入的认识和理解。内容组织与阅读建议全书共13章,面向Python 3.5.x、Python 3.6.x和Python 3.7.x,重点关注Python内置对象和标准库对象的高级应用,以及比较前沿的、刚刚引入的一些新技术和新特性的用法,偶尔涉及一些扩展库用法。几乎每个知识点都配有大量的案例,把这些案例简单拼凑和集成就可以实现很多功能,实用性非常强。建议读者按章节顺序阅读,并且前后结合地反复阅读,不要随意跳过任何内容,或许不经意间会发现自己正需要的知识或者得到某种灵感。另外,虽然本书的定位是Python高级编程,但也同样适用于初学者,请初学者不要觉得有压力,如果有些地方暂时看不懂,可以先跳过去,或许过几天再看就明白了。当然,如果实在看不懂的话,及时和作者沟通应该会得到帮助。第1章管中窥豹:Python概述。介绍Python语言的特点与主流版本,编程规范与代码优化建议,虚拟开发环境的创建与配置,扩展库的安装方法,开发与发布自己的包,Python程序伪编译与打包,从命令行和外部文件获取配置信息。第2章万丈高楼平地起:运算符、表达式与内置对象。详细介绍Python的运算符与内置函数的用法,以及变量与常量的概念。第3章玄之又玄,众妙之门:详解Python序列结构。详解列表、元组、字典、集合等对象的特点与用法,列表推导式、生成器推导式、字典推导式与集合推导式,切片操作,序列解包,枚举、数组、队列、堆等常用结构用法。第4章反者,道之动:程序控制结构。详解Python中的选择结构和循环结构,else的几种用法,选择结构的多种实现方式,break与continue语句,循环结构的代码优化技巧。第5章代码复用技术(一):函数。详解函数的定义与嵌套定义语法,可调用对象与修饰器原理,位置参数、默认值参数、关键参数以及参数的序列解包,局部变量、全局变量与nonlocal变量,生成器函数,lambda表达式,函数柯里化,泛型函数,协程函数,回调函数。第6章代码复用技术(二):面向对象程序设计。详解类的定义语法与实例化方法,数据成员、成员方法、属性以及静态方法与类方法,继承与多态,依赖注入技术的Python实现,特殊成员重写与运算符重载。第7章文本处理(一):字符串。详解字符串编码与字符串格式化方法、字符串对象方法、文本排版与压缩、分词、汉字拼音有关的技术。第8章文本处理(二):正则表达式。详解正则表达式基本语法与扩展语法,正则表达式模块re的用法,正则表达式对象与match对象的用法。第9章数据永久化:文件内容操作。详解内置函数open与上下文管理语句with的用法,文本文件与二进制文件的操作,Excel、Word、zip、rar等常见二进制文件操作技术。第10章文件与文件夹操作。详解os、os.path、shutil、glob、fnmatch等模块在文件与文件夹操作方面的用法。第11章代码质量保障:异常处理结构、程序调试与测试。详解异常处理结构,文档测试与单元测试技术,覆盖测试与软件性能测试技术,IDLE、pdb、Eclipse Pydev等不同的代码调试技术。第12章多任务与并行处理:线程、进程、协程、分布式、GPU加速。详解多线程与多进程编程技术,线程与进程的同步技术,不同进程间数据交换与共享技术,协程,spark并行计算与GPU编程。第13章互通互联:asyncio提供的网络通信功能。详解asyncio提供的网络通信功能,重点介绍Transport、Protocol、StreamReader以及StreamWriter等类的用法。配套资源本书提供所有案例源代码,可以登录清华大学出版社网站(www.tup.com.cn)下载,或加入本书读者群(QQ群号456324891,加入时请注明是读者,如果这个群满了的话会在群简介中给出下一个群号)下载最新配套资源并与作者交流,当然也欢迎关注微信公众号Python小屋及时阅读作者写的最新案例代码,有些代码是在本书完稿之后新写的,是书上没有的,算作是一个很好的补充。适用读者 已经具有一定Python水平的软件开发工程师。 打算深入探究Python高级编程的狂热爱好者。 各专业研究生、本科生、专科生的程序设计教材。 可能有些内容看起来会稍微有些吃力的其他Python初学者。致谢首先感谢父母的养育之恩,在当年那么艰苦的条件下还坚决支持我读书,没有让我像其他有的同龄的孩子一样辍学。感谢姐姐、姐夫多年来对我的爱护以及在老家对父母的照顾,感谢善良的弟弟、弟媳在老家对父母的照顾,正是有了你们,远离家乡的我才能安心工作。当然,最应该感谢的是妻子和孩子对我这个技术狂人的理解和宽容,这些年来她们已经习惯了正在吃饭的我突然萌发一个思路就放下饭碗去计算机前写代码的情景,习惯了我每个周末和假期都在教研室看书或写代码而不能陪她们玩,也习惯了周末的中午和晚上她们做好饭后再打电话催我回家。为了支持我的工作,她们还在我的几本书正式出版之前阅读了我的书稿。感谢我的领导冯烟利教授提供了良好的教学科研环境,这样的工作环境让人觉得非常舒适,每个人都可以安心做好自己的事,发挥出最大潜力。感谢选用Python程序设计系列教材的老师和长期关注微信公众号Python小屋的朋友以及系列图书读者QQ群里的朋友,感谢你们指出前几本书里存在的几个小错误,和你们的交流也给了我很多启发!感谢每一位读者,感谢您在茫茫书海中选择了本书,衷心希望您能够从本书中受益,学到真正需要的知识!同时也期待每一位读者的热心反馈,随时欢迎您指出书中的不足!本书在编写出版过程中也得到清华大学出版社的大力支持和帮助,尤其是非常有远见的责任编辑白立军老师对这套Python系列图书的策划,一并表示衷心的感谢。
董付国于山东烟台2017年3月
第5章代码复用技术一: 函数在软件开发过程中,经常有很多操作是完全相同或者是非常相似的,仅仅是要处理的数据不同而已,因此经常会在不同的代码位置多次执行相似甚至完全相同的代码块。很显然,从软件设计和代码复用的角度来讲,直接将代码块复制到多个相应的位置然后进行简单修改绝对不是一个好主意。虽然这样可以使得多份复制的代码可以彼此独立地进行修改,但这样不仅增加了代码量,也增加了代码阅读、理解和维护的难度,为代码测试和纠错带来很大的困难。一旦被复制的代码块将来某天被发现存在问题而需要修改,必须要对所有的复制都做同样的正确修改,这在实际中是很难完成的一项任务。更糟糕的情况是,由于代码量的大幅度增加,导致代码之间的关系更加复杂,很可能在修补旧漏洞的同时又引入了新漏洞,维护成本大幅度增加。因此,应尽量减少使用直接复制代码的方式来实现复用。解决这个问题的有效方法是设计函数function和类class。本章介绍函数的设计与使用,第6章介绍面向对象程序设计。将可能需要反复执行的代码封装为函数,然后在需要该功能的地方调用封装好的函数,不仅可以实现代码的复用,更重要的是可以保证代码的一致性,只需要修改该函数的代码则所有调用位置均得到体现。同时,把大任务拆分成多个函数也是分治法的经典应用,复杂问题简单化,使得软件开发像搭积木一样简单。当然,在实际开发中,需要对函数进行良好的设计和优化才能充分发挥其优势,并不是使用了函数就万事大吉了。在编写函数时,有很多原则需要参考和遵守,例如,不要在同一个函数中执行太多的功能,尽量只让其完成一个高度相关且大小合适的功能,提高模块的内聚性。另外,尽量减少不同函数之间的隐式耦合,例如,减少全局变量的使用,使得函数之间仅通过调用和参数传递来显式体现其相互关系。再就是设计函数时应尽量减少副作用,只实现指定的功能就可以了,不要做多余的事情。最后,在实际项目开发中,往往会把一些通用的函数封装到一个模块中,并把这个通用模块文件放到顶层文件夹中,这样更方便管理。5.1函数定义与使用〖*89〗5.1.1基本语法在Python中,定义函数的语法如下: def 函数名\[参数列表\]:〖1〗〖2〗Python程序设计开发宝典〖1〗第5章代码复用技术一: 函数〖2〗''''''注释''''''函数体在Python中使用def关键字来定义函数,然后是一个空格和函数名称,接下来是一对括号,在括号内是形式参数列表,如果有多个参数则使用逗号分隔开,括号之后是一个冒号和换行,最后是注释和函数体代码。定义函数时在语法上需要注意的问题主要有: ①函数形参不需要声明其类型,也不需要指定函数的返回值类型; ②即使该函数不需要接收任何参数,也必须保留一对空的括号; ③括号后面的冒号必不可少; ④函数体相对于def关键字必须保持一定的空格缩进。下面的函数用来计算斐波那契数列中小于参数n的所有值: def fibn: #定义函数,括号里的n是形参''''''accept an integer n.return the numbers less than n in Fibonacci sequence.''''''a,b= 1,1while a def myMapiterable,op,value:#自定义函数if op not in '' -'':return ''Error operator''def nesteditem:#嵌套定义函数return evalrepritem op reprvaluereturn mapnested,iterable#使用在函数内部定义的函数 listmyMaprange5,'' '',5#调用外部函数,不需要关心其内部实现\[5,6,7,8,9\] listmyMaprange5,''-'',5\[-5,-4,-3,-2,-1\] listmyMaprange5,'''',5\[0,5,10,15,20\] listmyMaprange5,'''',5\[0.0,0.2,0.4,0.6,0.8\]下面的函数利用函数嵌套定义和递归实现帕斯卡公式Cn,i=Cn-1, i Cn-1, i-1,进行组合数Cn,i的快速求解。def f2n,i:cache2= dictdef fn,i:if n==i or i==0:return 1elif n,i not in cache2:cache2\[n,i\]= fn-1,i fn-1,i-1return cache2\[n,i\]return fn,i尽管函数嵌套定义使用很方便,也很灵活,但是并不提倡过多使用,因为这样会导致内部的函数反复定义而影响执行效率。2. 可调用对象函数属于Python可调用对象之一,由于构造方法的存在,类也是可调用的。像list、tuple、dict、set这样的工厂函数实际上都是调用了类的构造方法。另外,任何包含__call__方法的类的对象也是可调用的。下面的代码使用函数的嵌套定义实现了可调用对象的定义: def lineara,b:def resultx:#在Python中,函数是可以嵌套定义的return ax breturn result#返回可被调用的函数下面的代码演示了可调用对象类的定义: class linear:def _ _init_ _self,a,b:self.a,self.b= a,bdef _ _call_ _self,x:#这里是关键return self.ax self.b使用上面的嵌套函数和类这两种方式中任何一个,都可以通过以下的方式来定义一个可调用对象: taxes=linear0.3,2然后通过下面的方式来调用该对象: taxes53. 修饰器修饰器decorator是函数嵌套定义的另一个重要应用。修饰器本质上也是一个函数,只不过这个函数接收其他函数作为参数并对其进行一定的改造之后返回新函数。后面第6章中的静态方法、类方法、属性等也都是通过修饰器实现的,Python中还有很多这样的用法。下面的代码演示了修饰器的定义与使用方法,定义其他函数调用之前或之后需要执行的通用代码,可作用于其他任何函数,提高代码复用度。def beforefunc: #定义修饰器def wrapperargs,kwargs:print''Before function called.''return funcargs,kwargsreturn wrapperdef afterfunc:#定义修饰器def wrapperargs,kwargs:result= funcargs,kwargsprint''After function called.''return resultreturn wrapper@before@afterdef test:#同时使用两个修饰器改造函数
|
|