复习Python中的字符串知识点
字符串
在Python中创建字符串对象非常容易。只要将所需的文本放入一对引号中,就完成了一个新字符串的创建(参见清单1)。如果稍加思考的话,您可能会感到有些困惑。毕竟,有两类可以使用的引号:单引号(')和双引号(")。幸运的是,Python再一次使这种问题迎刃而解。您可以使用任意一类引号来表示Python中的字符串,只要引号一致就行。如果字符串是以单引号开始,那么必须以单引号结束,反之亦然。如果不遵循这一规则,则会出现SyntaxError异常。
清单1.在Python中创建字符串
>>>sr="DiscoverPython" >>>type(sr) <type'str'> >>>sr='DiscoverPython' >>>type(sr) <type'str'> >>>sr="DiscoverPython:It'sWonderful!" >>>sr='DiscoverPython" File"<stdin>",line1 sr='DiscoverPython" ^ SyntaxError:EOLwhilescanningsingle-quotedstring >>>sr="DiscoverPython:\ ...It'sWonderful!" >>>printsr DiscoverPython:It'sWonderful!
从清单1中可以看出,除了字符串用适当的引号括起来之外,另外还有两个重要方面。第一,在创建字符串时,您可以混合使用单引号和双引号,只要字符串在开始位置和结束位置使用同一类型的引号。这种灵活性允许Python容易地保留常规的文本数据,这些常规的文本数据可能需要使用单引号来表示简写的动词形式或所属关系,以及使用双引号来表示引述文本。
第二,如果字符串用一行表示太长,您可以使用Python连续字符:反斜线(\)来对字符串进行折行。从内部机制看,在创建字符串时换行符会被忽略,在打印字符串时可以看出这一点。您可以结合使用这两个功能,来创建包含较长段落的字符串,如清单2所示。
清单2.创建长字符串
>>>passage='WhenusingthePythonprogramminglanguage,onemustproceed\ ...withcaution.ThisisbecausePythonissoeasytouseandcanbeso\ ...muchfun.Failuretofollowthiswarningmayleadtoshoutsof\ ..."WooHoo"or"Yowza".' >>>printpassage WhenusingthePythonprogramminglanguage,onemustproceedwithcaution. ThisisbecausePythonissoeasytouse,andcanbesomuchfun. Failuretofollowthiswarningmayleadtoshoutsof"WooHoo"or"Yowza".
编者注:上面的示例已折行处理,这样使页面布局更合理。事实上,它本来显示为一个较长的行。
注意,当打印passage字符串时,所有格式将被删除,只保留一个非常长的字符串。通常,您可以使用控制符来表示字符串中的简单格式。例如,要表示一个新行开始,您可以使用换行控制符(\n);要表示插入一个制表符(预设空格数),可以使用制表符控制符(\t),如清单3所示。
清单3.在字符串中使用控制符
>>>passage='\tWhenusingthePythonprogramminglanguage,onemustproceed\n\ ...\twithcaution.ThisisbecausePythonissoeasytouse,and\n\ ...\tcanbesomuchfun.Failuretofollowthiswarningmaylead\n\ ...\ttoshoutsof"WooHoo"or"Yowza".' >>>printpassage WhenusingthePythonprogramminglanguage,onemustproceed withcaution.ThisisbecausePythonissoeasytouse,and canbesomuchfun.Failuretofollowthiswarningmaylead toshoutsof"WooHoo"or"Yowza". >>>passage=r'\tWhenusingthePythonprogramminglanguage,onemustproceed\n\ ...\twithcaution.ThisisbecausePythonissoeasytouse,and\n\ ...\tcanbesomuchfun.Failuretofollowthiswarningmaylead\n\ ...\ttoshoutsof"WooHoo"or"Yowza".' >>>printpassage \tWhenusingthePythonprogramminglanguage,onemustproceed\n\ \twithcaution.ThisisbecausePythonissoeasytouse,and\n\ \tcanbesomuchfun.Failuretofollowthiswarningmaylead\n\ \ttoshoutsof"WooHoo"or"Yowza".
清单3中的第一段按照您预期的方式使用了控制符。该段已具备良好的格式,阅读非常方便。第二个示例虽然也进行了格式化处理,但它引用的是所谓的原始字符串,即没有应用控制符的字符串。您始终可以认出原始字符串,因为该字符串的起始引号的前面有一个r字符,它是raw的缩写。
我不了解您讲的有什么可取之处,虽然这种方法可行,但创建一个段落字符串似乎非常因难。当然一定有更好的方法。与往常一样,Python提供了一种非常简单的方法用于创建长字符串,该方法可保留创建字符串时所使用的格式。这种方法是使用三个双引号(或三个单引号)来开始和结束长字符串。在该字符串中,您可以使用任意多的单引号和双引号(参见清单4)。
清单4.使用三个引号的字符串
>>>passage=""" ...WhenusingthePythonprogramminglanguage,onemustproceed ...withcaution.ThisisbecausePythonissoeasytouse,and ...canbesomuchfun.Failuretofollowthiswarningmaylead ...toshoutsof"WooHoo"or"Yowza". ...""" >>>printpassage WhenusingthePythonprogramminglanguage,onemustproceed withcaution.ThisisbecausePythonissoeasytouse,and canbesomuchfun.Failuretofollowthiswarningmaylead toshoutsof"WooHoo"or"Yowza".
将字符串作为一个对象
如果阅读了本系列前两篇文章中的任何一篇文章,那么在您的脑海中会立即浮现出这样一句话:在Python中,所有事物都是对象。到目前为止,我还没有涉及到关于Python中的字符串的对象特性的问题,但是,与往常一样,Python中的字符串就是对象。事实上,字符串对象是str类的一个实例。正如您在探索Python,第2部分中看到的,Python解释器包括一个内置帮助工具(如清单5所示),它可以提供关于str类的信息。
清单5.获取关于字符串的帮助信息
>>>help(str) Helponclassstrinmodule__builtin__: classstr(basestring) |str(object)->string | |Returnanicestringrepresentationoftheobject. |Iftheargumentisastring,thereturnvalueisthesameobject. | |Methodresolutionorder: |str |basestring |object | |Methodsdefinedhere: | |__add__(...) |x.__add__(y)<==>x+y | ...
使用单引号、双引号和三引号语法创建的字符串仍然是字符串对象。但是您也可以使用str类构造函数显式地创建字符串对象,如清单6所示。该构造函数可以接受简单的内置数值类型或字符数据作为参数。两种方法都可以将输入的内容更改为新的字符串对象。
清单6.创建字符串
>>>str("Discoverpython") 'Discoverpython' >>>str(12345) '12345' >>>str(123.45) '123.45' >>>"Wow,"+"that"+"wasawesome." 'Wow,thatwasawesome.' >>>"Wow,""that""wasAwesome" 'Wow,thatwasAwesome' >>>"Wow!"*5 'Wow!Wow!Wow!Wow!Wow!' >>>sr=str("Hello") >>>id(sr) 5560608 >>>sr+="World" >>>sr 'HelloWorld' >>>id(sr) 3708752
清单6中的例子也展示了关于Python字符串的几个其他重要方面。第一,通过将其他字符串添加在一起,可以创建新的字符串,具体方法可以使用+运算符,或者干脆使用适当的引号将字符串连在一起。第二,如果需要重复短字符串来创建长字符串,可以使用*运算符,将字符串重复一定的次数。我在本文开头说过,在Python中,字符串是不变的字符序列,上例中的最后几行说明了这一点,我首先创建一个字符串,然后通过添加其他字符串对它进行修改。从对id方法两次调用的输出中可以看出,创建的新字符串对象中保存的是向原字符串中添加文本的结果。
str类包含大量的用于操作字符串的有用方法。这里不做一一介绍,您可以使用帮助解释器获得有关信息。现在让我们了解一下四个有用的函数,并演示其他str类方法的工具。清单7演示了upper、lower、split和join方法。
清单7.字符串方法
>>>sr="DiscoverPython!" >>>sr.upper() 'DISCOVERPYTHON!' >>>sr.lower() 'discoverpython!' >>>sr="Thisisatest!" >>>sr.split() ['This','is','a','test!'] >>>sr='0:1:2:3:4:5:6:7:8:9' >>>sr.split(':') ['0','1','2','3','4','5','6','7','8','9'] >>>sr=":" >>>tp=('0','1','2','3','4','5','6','7','8','9') >>>sr.join(tp) '0:1:2:3:4:5:6:7:8:9'
前两个方法upper和lower很容易理解。它们只是分别将字符串都转换成大写字母或小写字母。split方法很有用,因为它可以将一个字符串分成几个较小的字符串序列,方法是将令牌字符(或给定字符序列中的任何字符)用作断开位置的指示器。所以,第一个split方法示例使用默认的令牌将字符串“Thisisatest”拆分开,此令牌可以是任何空白字符(这个序列包括空格、制表符和换行符)。第二个split方法演示如何使用不同的令牌字符(本例中使用的是冒号)将一个字符串分成一系列字符串。最后的一个例子显示如何使用join方法,该方法的作用与split方法相反,可以使多个短字符串序列形成一个长字符串。在本例中,使用冒号将tuple包含的由单个字符构成的字符串序列连接在一起。
将字符串用作字符的容器
在本文的开头部分,我着重强调了Python中的字符串是不变的字符序列。本系列的第2部分探索Python,第2部分介绍了tuple,它也是一个不变的序列。tuple通过以下方式支持访问序列中的元素:使用索引符号,使用片段分离序列中的元素,以及使用特定的片段或将不同的片段添加在一起来创建新的元组。根据这一情况,您可能想知道是否可以将同一技巧应用于Python字符串。如清单8所示,答案显然是“可以”。
清单8.字符串方法
>>>sr="0123456789" >>>sr[0] '0' >>>sr[1]+sr[0] '10' >>>sr[4:8]#Givemeelementsfourthroughseven,inclusive '4567' >>>sr[:-1]#Givemeallelementsbutthelastone '012345678' >>>sr[1:12]#Slicemorethanyoucanchew,noproblem '123456789' >>>sr[:-20]#Gobeforethestart? '' >>>sr[12:]#Gopasttheend? '' >>>sr[0]+sr[1:5]+sr[5:9]+sr[9] '0123456789' >>>sr[10] Traceback(mostrecentcalllast): File"<stdin>",line1,in? IndexError:stringindexoutofrange >>>len(sr)#Sequenceshavecommonmethods,likegetmylength 10
在Python中,将字符串作为字符序列进行处理是非常简单的。您可以获得单个元素,将不同的元素添加在一起,切出几个元素,甚至将不同的片段添加在一起。进行切片的一个非常有用的特性是,在开始之前或结束之后进行较多切片不会抛出异常,只是相应地以默认方式开始或结束该序列。相反,如果您试图使用允许范围之外的索引来访问单个元素,则会得到一个异常。这种行为说明了为什么len方法是如此重要。
字符串:功能强大的工具
在本文中,我介绍了Python字符串,它是一种不变的字符序列。在Python中,您可以使用多个方法很容易地创建字符串,其中包括使用单引号、双引号或更灵活的方式,即使用一组三个引号。假设Python中的每个事物都是一个对象,您可以使用底层的str类方法来获得附加功能或直接使用字符串的序列功能。