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实现了CADCAEPDM库及模型管理系统,微软集成开发环境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年程序设计教学经验,先后讲授过汇编语言、CCC#、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小屋及时阅读作者写的最新案例代码。本书适用读者本书可以作为(但不限于): 本科、专科或研究生程序设计课程教材。 Python培训用书。 具有一定Python基础的读者进阶首选学习资料。 涉及Python开发的工程师、策划人员、科研人员和管理人员阅读书目。 打算利用业余时间学习一门快乐的程序设计语言并编写几个小程序来娱乐的读者首选学习资料。 少数对编程具有浓厚兴趣和天赋的中学生课外阅读资料。感谢首先感谢父母的养育之恩,在当年那么艰苦的条件下还坚决支持我读书,没有让我像其他同龄的孩子一样辍学。感谢姐姐、姐夫多年来对我的爱护以及在老家对父母的照顾,感谢善良的弟弟、弟媳在老家对父母的照顾,正是有了你们,远离家乡的我才能安心工作。当然,最应该感谢的是妻子和孩子对我这个技术狂人的理解,这些年来她们已经习惯了正在吃饭的我突然想起个思路然后就跑到计算机前面去写代码了,习惯了我每个周末和假期都在教研室看书或写代码而不陪她们,也习惯了周末的中午和晚上做好饭以后再打电话让我回家。为了表示对我的支持,她们还阅读了本书定稿前的版本并发现了几个错别字。感谢每一位读者,感谢您在茫茫书海中选择了本书,衷心祝愿您能够从本书中受益,学到真正需要的知识!同时也期待每一位读者的热心反馈,随时欢迎您指出书中的不足!本书的出版获2014年山东省普通高校应用型人才培养专业发展支持计划项目资助。我校专业共建合作伙伴浪潮优派科技教育有限公司总裁邵长臣先生审阅了全书,并提出很多宝贵的意见,在此致以诚挚的谢意。本书在编写出版过程中也得到清华大学出版社的大力支持和帮助,在此表示衷心的感谢。
董付国于山东烟台2016年7月
第5章字符串与正则表达式5.1字符串最早的字符串编码是美国标准信息交换码ASCII,仅对10个数字、26个大写英文字母、26个小写英文字母及一些其他符号进行了编码。ASCII采用1个字节来对字符进行编码,最多只能表示256个符号。随着信息技术的发展和信息交换的需要,各国的文字都需要进行编码,不同的应用领域和场合对字符串编码的要求也略有不同,于是分别设计了不同的编码格式,常见的主要有UTF8、UTF16、UTF32、GB2312、GBK、CP936、base64、CP437等。UTF8编码是国际通用的编码,以1个字节表示英语字符(兼容ASCII),以3个字节表示中文,还有些语言的符号使用2个字节(如俄语和希腊语符号)或4个字节,UTF8对全世界所有国家需要用到的字符进行了编码。GB2312是我国制定的中文编码,使用1个字节表示英语,2个字节表示中文;GBK是GB2312的扩充,而CP936是微软公司在GBK基础上开发的编码方式。GB2312、GBK和CP936都是使用2个字节表示中文,UTF8使用3个字节表示中文。不同编码格式之间相差很大,采用不同的编码格式意味着不同的表示和存储形式,把同一字符存入文件时,写入的内容可能会不同,在理解其内容时必须了解编码规则并进行正确的解码。如果解码方法不正确就无法还原信息,从这个角度来讲,字符串编码也具有加密的效果。Python 3.x完全支持中文,使用Unicode编码格式,无论是一个数字、英文字母,还是一个汉字,都按一个字符对待和处理。例如,在Python 3.5.1中执行下面的代码,从代码中可以看到,在Python 3.x中甚至可以使用中文作为变量名。 s=''中国山东烟台'' lens#字符串长度,或者包含的字符个数6 s=''SDIBT'' lens5 s=''中国山东烟台SDIBT''#中文与英文字符同样对待,都算一个字符 lens11 姓名=''张三''#使用中文作为变量名 年龄=40 print姓名#输出变量的值张三 print年龄40[1]〖2〗Python可以这样学[1]第5章字符串与正则表达式〖2〗小提示:在Windows平台上使用Python 2.x时,input()函数从键盘输入的字符串默认为GBK编码,而Python程序中的字符串编码则使用#coding显式地指定,常用的方式有: #coding=utf-8#coding:utf-8#--coding:utf-8 --在Python中,字符串属于不可变序列类型,使用单引号(这是最常用的)、双引号、三单引号或三双引号作为界定符,并且不同的界定符之间可以互相嵌套。下面几种都是合法的Python字符串: ''abc''、''123''、''中国''、"Python"、''''''Tom said,"Let''s go"''''''除了支持序列通用方法(包括双向索引、比较大小、计算长度、元素访问、切片等操作)以外,字符串类型还支持一些特有的操作方法,如格式化、字符串查找、字符串替换(注意,不是原地替换)、排版等。但由于字符串属于不可变序列,不能直接对字符串对象进行元素增加、修改与删除等操作。另外,字符串对象提供的replace()和translate()方法也不是对原字符串直接进行修改替换,而是返回一个修改替换后的新字符串作为结果。Python支持短字符串驻留机制,对于短字符串,将其赋值给多个不同的对象时,内存中只有一个副本,多个对象共享该副本,与其他类型数具有相同的特点。然而,这一点并不适用于长字符串,长字符串不遵守驻留机制,下面的代码演示了短字符串和长字符串在这方面的区别。 a=''1234'' b=''1234'' ida== idb#短字符串支持内存驻留机制True a=''1234''50 b=''1234''50 ida== idb#长字符串不支持内存驻留机制False如果需要判断一个变量是否为字符串,可以使用内置方法isinstance()或type()。 type''中国'' type''中国''.encode''gbk''#编码成字节串,采用GBK编码格式 bytes#bytes是Python的内置类 isinstance''中国'', strTrue type''中国''== strTrue type''中国''.encode== bytesTrue type''中国''== bytesFalse拓展知识: 转义字符。如果大家学习过其他语言,应该了解转义字符的概念,可以跳过这部分内容。转义字符是指,在字符串中某些特定的符号前加一个斜线之后该字符将被解释为另外一种含义,不再表示本来的字符。常见的转义字符如表51所示。表51常见的转义字符转义字符含义\\b退格,把光标移动到前一列位置\\f换页符\\n换行符\\r回车\\t水平制表符\\v垂直制表符\\\\一个\\\\''单引号\\"双引号\\ooo3位八进制数对应的字符\\xhh2位十六进制数对应的字符\\uhhhh4位十六进制数表示的Unicode字符下面的代码演示了转义字符的用法: print''Hello\\nWorld''#包含转义字符的字符串HelloWorld oct65''0o101'' print''\\101''#3位八进制数对应的字符A hex65''0x41'' print''\\x41''#2位十六进制数对应的字符A ord''董''33891 hex_''0x8463'' print''\\u8463''#4位十六进制数表示的Unicode字符董5.1.1字符串格式化的两种形式如果需要将其他类型的数据转换为字符串,或者嵌入其他字符串或模板中再进行输出,就需要用到字符串格式化。Python中字符串格式化的格式如图51所示,格式运算符%之前的部分为格式字符串,之后的部分为需要进行格式化的内容。图51字符串格式化Python支持大量的格式字符,表52列出了比较常用的一部分。表52格式字符格式字符说明%s字符串(采用str()的显示)%r字符串(采用repr()的显示)%c单个字符%b二进制整数%d十进制整数%i十进制整数%o八进制整数%x十六进制整数%e指数(基底写为e)续表格式字符说明%E指数(基底写为E)%f、%F浮点数%g指数(e)或浮点数(根据显示长度)%G指数(E)或浮点数(根据显示长度)%%字符"%"下面的代码演示了字符串格式化的用法: x=1235 so="%o" % x so''2323'' sh="%x" % x sh''4d3'' se="%e" % x se''1.235000e 03'' "%s"%65#等价于str''65'' "%s"%65333''65333'' ''%d,%c''%65, 65#使用元组对字符串进行格式化,按位置进行对应''65,A'' "%d"%"555"#试图将字符串转换为整数进行输出,抛出异常Tracebackmost recent call last:File "", line 1, in "%d"%"555"TypeError: %d format: a number is required, not str int''555''#可以使用int函数将合法的数字字符串转换为整数555 ''%s''%\[1, 2, 3\]''\[1, 2, 3\]'' str1, 2, 3#可以使用str函数将任意类型数据转换为字符串''1, 2, 3'' str\[1, 2, 3\]''\[1, 2, 3\]''除了上面介绍的字符串格式化方法,目前Python社区更推荐使用format()方法进行格式化,该方法更加灵活,不仅可以使用位置进行格式化,还支持使用与位置无关的参数名字来进行格式化,并且支持序列解包格式化字符串,为程序员提供了非常大的方便。例如: print''{0:.3f}''.format13#保留3位小数0.333 130.3333333333333333 print"The number {0:,} in hex is: {0:#x}, in oct is {0:#o}".format55The number 55 in hex is: 0x37, in oct is 0o67 print"The number {0:,} in hex is: {0:x}, the number {1} in oct is {1:o}".format5555, 55The number 5,555 in hex is: 15b3, the number 55 in oct is 67 print"The number {1} in hex is: {1:#x}, the number {0} in oct is {0:#o}".format5555, 55The number 55 in hex is: 0x37, the number 5555 in oct is 0o12663 print"my name is {name}, my age is {age}, and my QQ is {qq}".formatname="Dong", qq="306467355", age=38my name is Dong, my age is 38, and my QQ is 306467355 position =5, 8, 13 print"X:{0\[0\]};Y:{0\[1\]};Z:{0\[2\]}".formatposition#使用元组同时格式化多个值X:5;Y:8;Z:13 weather=\["Monday", "rain","Tuesday", "sunny","Wednesday", "sunny","Thursday", "rain","Friday", "Cloudy"\] formatter="Weather of ''{0\[0\]}'' is ''{0\[1\]}''".format for item in mapformatter, weather:printitem上面最后一段代码也可以改为下面的写法: for item in weather:printformatteritem运行结果为Weather of ''Monday'' is ''rain''Weather of ''Tuesday'' is ''sunny''Weather of ''Wednesday'' is ''sunny''Weather of ''Thursday'' is ''rain''Weather of ''Friday'' is ''Cloudy''拓展知识: 在字符串格式化方法format()中常用的格式字符。在字符串格式化方法format()中可以使用的格式主要有b(二进制格式)、c(把整数转换成Unicode字符)、d(十进制格式)、o(八进制格式)、x(小写十六进制格式)、X(大写十六进制格式)、eE(科学计数法格式)、fF(固定长度的浮点数格式)、%(使用固定长度浮点数显示百分数)。拓展知识: Python标准库string还提供了用于字符串格式化的模板类Template。例如: from string import Template t=Template''My name is ${name}, and is ${age} years old.''#创建模板 d={''name'':''Dong'', ''age'':39} t.substituted#替换''My name is Dong, and is 39 years old.'' tt=Template''My name is $name, and is $age years old.'' tt.substituted''My name is Dong, and is 39 years old.''5.1.2字符串常用方法〖*34〗1.find()、rfind()、index()、rindex()、count()find()和rfind()方法分别用来查找一个字符串在另一个字符串指定范围(默认是整个字符串)中首次和最后一次出现的位置,如果不存在则返回-1;index()和rindex()方法用来返回一个字符串在另一个字符串指定范围中首次和最后一次出现的位置,如果不存在则抛出异常;count()方法用来返回一个字符串在另一个字符串中出现的次数,如果不存在则返回0。 s="apple,peach,banana,peach,pear" s.find"peach"#返回第一次出现的位置6 s.find"peach", 7#从指定位置开始查找19 s.find"peach", 7, 20#在指定范围中进行查找-1 s.rfind''p''#从字符串尾部向前查找25 s.index''p''#返回首次出现的位置1 s.index''pe''6 s.index''pear''25 s.index''ppp''#指定子字符串不存在时抛出异常Tracebackmost recent call last:File "", line 1, in s.index''ppp''ValueError: substring not found s.count''p''#统计子字符串出现的次数5 s.count''pp''1 s.count''ppp''#不存在时返回00拓展知识: 实际开发时应优先考虑使用Python内置函数和内置对象的方法,运行速度快,并且运行稳定。例如,下面的代码用来检查长字符串中哪些位置上的字母是a,通过运行结果可以发现,使用字符串方法find()的速度明显要比逐个字符比较快很多。from string import ascii_lettersfrom random import choicefrom time import time
letters=''''.join\[choiceascii_lettersfor i in range999999\]def positions_of_charactersentence, ch:#使用字符串对象的find方法result=\[\]index=0index=sentence.findch, index 1while index != -1:result.appendindexindex=sentence.findch, index 1return result
def demos, c:#普通方法,逐个字符比较result=\[\]for i,ch in enumerates:if ch == c:result.appendireturn result
start=timepositions=positions_of_characterletters, ''a''printtime-start
start=timep=demoletters, ''a''printtime-start运行结果如下: 0.0090005397796630860.08400487899780273速度居然相差10倍左右,看来内置对象提供的方法还真是不错,简直是人见人爱,花见花开。但是不要高兴太早,一切都是相对的,这世间没有绝对得好,也没有绝对得坏,内置对象的某些方法也不是在任何场合都能保证最优。例如把上面代码中的letters=''''.join\[choiceascii_lettersfor i in range999999\]改为letters=''''.join\[choice''ab''for i in range999999\]然后再次运行,会发现结果与上面的代码恰好相反,逐个比较的方法又比使用find()方法快了很多。稍加分析可以发现,上面两段代码是完全一样的,只是所查找数据的密度不一样,处理速度却有着翻天覆地的变化。所以说,首先要分析待处理的数据有什么样的特点(包括组成元素、分布情况等),然后才能设计最优的算法并采用最高效的方法。但一般情况下,Python内置函数、内置对象的方法和标准库对象的效率要高于自己编写的代码。2. split()、rsplit()、partition()、rpartition()split()和rsplit()方法分别用来以指定字符为分隔符,从字符串左端和右端开始将其分隔成多个字符串,并返回包含分隔结果的列表;partition()和rpartition()用来以指定字符串为分隔符将原字符串分隔为3部分,即分隔符之前的字符串、分隔符字符串和分隔符之后的字符串,如果指定的分隔符不在原字符串中,则返回原字符串和两个空字符串。 s="apple,peach,banana,pear" li=s.split","#使用逗号进行分隔 li\["apple", "peach", "banana", "pear"\] s.partition'',''#从左侧使用逗号进行切分''apple'', '','', ''peach,banana,pear'' s.rpartition'',''#从右侧使用逗号进行切分''apple,peach,banana'', '','', ''pear'' s.rpartition''banana''#使用字符串作为分隔符''apple,peach,'', ''banana'', '',pear''s="2014-10-31" t=s.split"-"#使用指定字符作为分隔符 t\[''2014'', ''10'', ''31''\] listmapint, t#将分隔结果转换为整数\[2014, 10, 31\]对于split()和rsplit()方法,如果不指定分隔符,则字符串中的任何空白符号(包括空格、换行符、制表符等)的连续出现都将被认为是分隔符,返回包含最终分隔结果的列表。 s=''hello world \\n\\n My name is Dong '' s.split\[''hello'', ''world'', ''My'', ''name'', ''is'', ''Dong''\] s=''\\n\\nhello world \\n\\n\\n My name is Dong '' s.split\[''hello'', ''world'', ''My'', ''name'', ''is'', ''Dong''\] s=''\\n\\nhello\\t\\t world \\n\\n\\n My name\\t is Dong '' s.split\[''hello'', ''world'', ''My'', ''name'', ''is'', ''Dong''\]另外,split()和rsplit()方法还允许指定最大分隔次数(注意,不是必须分隔这么多次),例如: s=''\\n\\nhello\\t\\t world \\n\\n\\n My name is Dong '' s.splitmaxsplit=1#分隔1次\[''hello'', ''world \\n\\n\\n My name is Dong ''\] s.rsplitmaxsplit=1\[''\\n\\nhello\\t\\t world \\n\\n\\n My name is'', ''Dong''\] s.splitmaxsplit=2\[''hello'', ''world'', ''My name is Dong ''\] s.rsplitmaxsplit=2\[''\\n\\nhello\\t\\t world \\n\\n\\n My name'', ''is'', ''Dong''\] s.splitmaxsplit=5\[''hello'', ''world'', ''My'', ''name'', ''is'', ''Dong ''\] s.splitmaxsplit=6\[''hello'', ''world'', ''My'', ''name'', ''is'', ''Dong''\] s.splitmaxsplit=10#最大分隔次数大于实际可分隔次数时,自动忽略\[''hello'', ''world'', ''My'', ''name'', ''is'', ''Dong''\]小提示:调用split()方法并且不传递任何参数时,将使用任何空白字符作为分隔符,如果字符串存在连续的空白字符,split()方法将自动忽略;明确传递参数指定split()使用的分隔符时,情况略有不同。 ''a,,,bb,,ccc''.split'',''#每个逗号都被作为独立的分隔符\[''a'', '''', '''', ''bb'', '''', ''ccc''\] ''a\\t\\t\\tbb\\t\\tccc''.split''\\t''#每个制表符都被作为独立的分隔符\[''a'', '''', '''', ''bb'', '''', ''ccc''\] ''a\\t\\t\\tbb\\t\\tccc''.split#连续多个制表符被作为一个分隔符\[''a'', ''bb'', ''ccc''\]3. join()与split()相反,join()方法用来将列表中多个字符串进行连接,并在相邻两个字符串之间插入指定字符。 li=\["apple", "peach", "banana", "pear"\] sep="," s=sep.joinli#使用逗号作为连接符 s