全书共分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爱好者的指导用书。
信息量大、案例丰富、实用性强。全书包含近200个案例和上千段代码,涉及Python基本语法和数据类型,以及GUI、网络应用、数据库、密码学、科学计算与可视化、大数据、图形图像处理等多个领域的开发,书中一些代码进行简单拼凑就可以满足实际工作中需要的很多功能。深度与广度兼顾。剖析Python编程模式,通过小提示、小技巧、注意、拓展知识等形式适当介绍标准库的工作原理、内置函数的高级用法以及代码优化和安全编程知识,同时还补充了很多扩展库的小应用,满足不同层次读者需要。语言轻松愉快,寓教于乐。以Python知识和应用为主线,偶尔穿插一点太极拳论、道德经、易经、古诗词和其他一些文学作品中的名言名句和小故事,部分题目还给出了非常幽默的答案。注释量大。书中几乎每段重要代码都配有相关的注释,让读者能够在短时间内理解代码的编写思路和要点,大幅度缩短阅读和学习时间。
董付国 副教授。自2000年参加工作以来,先后讲授过汇编语言、C/C /C#、Java和Python等多门编程语言,以及计算机组成原理、计算机网络、数据库原理、数据结构、操作系统、计算机安全、网络安全、计算机图形学、数字图像处理、游戏策划等多门课程,出版《Python程序设计》、《Python程序设计基础》、《Python程序设计(第2版)》系列教材,开发过多套涉及不同领域的管理系统,在国内外高水平学术期刊与会议上40余篇,其中近30篇被EI检索。学习工作之余的爱好是打太极拳。
目录
第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
第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='中国山东烟台'>>> len(s)#字符串长度,或者包含的字符个数6>>> s='SDIBT'>>> len(s)5>>> s='中国山东烟台SDIBT'#中文与英文字符同样对待,都算一个字符>>> len(s)11>>> 姓名='张三'#使用中文作为变量名>>> 年龄=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'>>> id(a)== id(b)#短字符串支持内存驻留机制True>>> a='1234'50>>> b='1234'50>>> id(a)== id(b)#长字符串不支持内存驻留机制False如果需要判断一个变量是否为字符串,可以使用内置方法isinstance()或type()。>>> type('中国')>>> type('中国'.encode('gbk'))#编码成字节串,采用GBK编码格式>>> bytes#bytes是Python的内置类>>> isinstance('中国', str)True>>> type('中国')== strTrue>>> type('中国'.encode())== bytesTrue>>> type('中国')== bytesFalse拓展知识: 转义字符。如果大家学习过其他语言,应该了解转义字符的概念,可以跳过这部分内容。转义字符是指,在字符串中某些特定的符号前加一个斜线之后该字符将被解释为另外一种含义,不再表示本来的字符。常见的转义字符如表51所示。表51常见的转义字符转义字符含义\\b退格,把光标移动到前一列位置\\f换页符\\n换行符\\r回车\\t水平制表符\\v垂直制表符\\\\一个\\\\'单引号\\"双引号\\ooo3位八进制数对应的字符\\xhh2位十六进制数对应的字符\\uhhhh4位十六进制数表示的Unicode字符下面的代码演示了转义字符的用法: >>> print('Hello\\nWorld')#包含转义字符的字符串HelloWorld>>> oct(65)'0o101'>>> print('\\101')#3位八进制数对应的字符A>>> hex(65)'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"#试图将字符串转换为整数进行输出,抛出异常Traceback(most 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\]'>>> str((1, 2, 3))#可以使用str()函数将任意类型数据转换为字符串'(1, 2, 3)'>>> str(\[1, 2, 3\])'\[1, 2, 3\]'除了上面介绍的字符串格式化方法,目前Python社区更推荐使用format()方法进行格式化,该方法更加灵活,不仅可以使用位置进行格式化,还支持使用与位置无关的参数名字来进行格式化,并且支持序列解包格式化字符串,为程序员提供了非常大的方便。例如: >>> print('{0:.3f}'.format(1/3))#保留3位小数0.333>>> 1/30.3333333333333333>>> print("The number {0:,} in hex is: {0:#x}, in oct is {0:#o}".format(55))The 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}".format(5555, 55))The 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}".format(5555, 55))The 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}".format(name="Dong", qq="306467355", age=38))my 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\]}".format(position))#使用元组同时格式化多个值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 map(formatter, weather):print(item)上面一段代码也可以改为下面的写法: >>> for item in weather:print(formatter(item))运行结果为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(大写十六进制格式)、e/E(科学计数法格式)、f/F(固定长度的浮点数格式)、%(使用固定长度浮点数显示百分数)。拓展知识: Python标准库string还提供了用于字符串格式化的模板类Template。例如: >>> from string import Template>>> t=Template('My name is ${name}, and is ${age} years old.')#创建模板>>> d={'name':'Dong', 'age':39}>>> t.substitute(d)#替换'My name is Dong, and is 39 years old.'>>> tt=Template('My name is $name, and is $age years old.')>>> tt.substitute(d)'My name is Dong, and is 39 years old.'5.1.2字符串常用方法[3/4]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')#指定子字符串不存在时抛出异常Traceback(most 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(\[choice(ascii_letters)for i in range(999999)\])def positions_of_character(sentence, ch):#使用字符串对象的find()方法result=\[\]index=0index=sentence.find(ch, index 1)while index != -1:result.append(index)index=sentence.find(ch, index 1)return result
def demo(s, c):#普通方法,逐个字符比较result=\[\]for i,ch in enumerate(s):if ch == c:result.append(i)return result
start=time()positions=positions_of_character(letters, 'a')print(time()-start)
start=time()p=demo(letters, 'a')print(time()-start)运行结果如下: 0.0090005397796630860.08400487899780273速度居然相差10倍左右,看来内置对象提供的方法还真是不错,简直是人见人爱,花见花开。但是不要高兴太早,一切都是相对的,这世间没有得好,也没有得坏,内置对象的某些方法也不是在任何场合都能保障。例如把上面代码中的letters=''.join(\[choice(ascii_letters)for i in range(999999)\])改为letters=''.join(\[choice('ab')for i in range(999999)\])然后再次运行,会发现结果与上面的代码恰好相反,逐个比较的方法又比使用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'\]>>> list(map(int, 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.split(maxsplit=1)#分隔1次\['hello', 'world \\n\\n\\n My name is Dong '\]>>> s.rsplit(maxsplit=1)\['\\n\\nhello\\t\\t world \\n\\n\\n My name is', 'Dong'\]>>> s.split(maxsplit=2)\['hello', 'world', 'My name is Dong '\]>>> s.rsplit(maxsplit=2)\['\\n\\nhello\\t\\t world \\n\\n\\n My name', 'is', 'Dong'\]>>> s.split(maxsplit=5)\['hello', 'world', 'My', 'name', 'is', 'Dong '\]>>> s.split(maxsplit=6)\['hello', 'world', 'My', 'name', 'is', 'Dong'\]>>> s.split(maxsplit=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.join(li)#使用逗号作为连接符>>> s
语言轻松愉快,又有深度
这是一本好书,讲解内容深入浅出又清晰明了,推荐给所有喜欢阅读的朋友同好们。
不错啊很不错!!!!
书的整体内容是很不错的,纸质的质量也很赞
最近各电商平台图书大促销,囤了不少,暂时还没看,容后再补充。
看了一下没什么缺页的地方,纸张挺好的。
此书不错,对我有帮助
纸张很好!
纸质很好,要是能在快递的时候包装好点就更好了
很好的一本书!
推荐一下,值得一读
东西没收到就降价了,机器人让打当当客服补差价,可一直没人接,不开心…
很棒的书,值得推荐!
内容很详尽,就是印刷感觉很仓促,字迹很多页很浅,这点不满意