《Python基础教程》第三章--读书笔记

428 查看

第三章:使用字符串

本章将会介绍如何使用字符串格式化其他的值(如打印特殊格式的字符串),并简单了解一下利用字符串的分割、连接、搜索等方法能做些什么。

基本字符串操作

所有标准的序列操作(索引、分片、乘法、判断成员资格、求长度、取最大最小值)对字符串同样适用。
记住:字符串是不可变的!

字符串格式化:精简版

字符串格式化使用字符串格式化操作符(这个名字还是很恰当地)即百分号%来实现。
注:%也可以用来作模运算(求余)操作符。

在%左侧放置一个字符串(格式化字符串),而右侧放置希望被格式化的值。可以使用一个值,也可以使用多个值的元祖或者字典。

>>>fromat = "hello, %s.%s enough?"
>>>values = ('michael','dut')
>>>print format % values
hello, michael.dut enough?

格式化字符串的%s部分称为转换说明符。

如果要格式化实数(浮点数),可以用f说明转换说明符的类型。因为格式化转换说明符总是以表示类型的字符结束。同时提供所需要的进度:一个句点加上希望保留的小数位数。

>>>format = "pi with three decimals: %.3f"
>>>form math import pi
>>>print format % pi
pi with three decimals: 3.142

字符串格式化:完整版

格式化操作符的右操作数可以是任意类型,在此,先了解一下元祖。

如果右操作数是元祖的话,则其中的每一个元素都会被单独格式化,每个值都需要一个对应的转换说明符。
一个都不能少!

如果需要转换的元祖作为转换表达式的一部分存在,元祖必须用圆括号括起来,否则会出错!

基本的转换说明符包括以下部分。注意,这些项的顺序是至关重要的!

  1. %字符:标记转换说明符的开始

  2. 转换标志(可选):-表示左对齐,+表示在转换值之前要加上正负号;“”(空白字符)表示正数之前保留空格;0表示转换值至若位数不够则用0填充。

  3. 最小字段宽度(可选):转换后的字符串至少应该具有该值指定的宽度。如果是*,则宽度会从值元祖中读出。

  4. 点(.)后跟精度值(可选):如果转换的是实数,精度值表示保留几位小数。如果转换的是字符串,那么该数字就表示最大字段宽度。如果是*,那么进度将会从元祖中读出。

  5. 转换类型:查看表
    字符串格式转换类型

格式 描述
%c 字符及其ASCII码
%s 字符串(使用str转换任意Python对象)
%r 字符串(使用repr转换任意Python对象)
%d(%i) 有符号整数(十进制)
%u 无符号整数(十进制)
%o 无符号整数(八进制)
%x 无符号整数(十六进制)
%X 无符号整数(十六进制大写字符)
%e 浮点数字(科学计数法)
%E 浮点数字(科学计数法,用E代替e)
%f(%F) 浮点数字(用小数点符号)
%g 浮点数字(根据值的大小采用%e或%f)
%G 浮点数字(类似于%g)
%p 指针(用十六进制打印值的内存地址)
%n 存储输出字符的数量放进参数列表的下一个变量中

简单的转换

>>>'using str:%s'% 42L
'using str: 42'
>>>'using repr:%r'% 42L
'using repr: 42L'

字段宽度和精度

这两个参数都是整数(首先是字段宽度,然后是精度),通过点好(.)分隔。虽然两个都是可选的参数,但是如果只给出精度,就必须包含点好:

>>>'%10.2f'%pi
'      3.14' #6个空格

可以使用*(星号)作为字段宽度或者精度(或者两者都用),此时数值会从元祖参数中读出:

>>>'%.*s'%(5,'michael xiang')
'micha'

符号、对齐和用0填充

在字段宽度和精度之前还可以放置一个“标志”,该标志可以是:

  • 0 0表示将会用0填充

  • + 加号表示,不管是正数还是负数,都要标识出正负号

  • - 减号表示用来左对齐数值

  • 空格 空格:表示正数前加上空格,这对需要对齐正负数时会很有用
    0表示将会用0填充

>>>'%010.2f'%pi    #0填充,并不表示八进制,字段宽度10,精度2
'0000003.14'
>>>'%-10.2f'*%pi
'3.14      '    #看到没,右侧多了空格,数值左对齐了
>>>print ('% 5d' % 10) + '\n' + ('% 5d' % -10)
   10
  -10
>>>print ('%+5d' % 10) + '\n' + ('s%+5d' % -10)
  +10
  -10

字符串方法

字符串的方法比列表方法还要丰富的多,因为字符串从string模块中“继承”了很多方法。因为字符串的方法太多,这里只介绍一些特别有用的方法。
附上:官方模块参考文档——Python Module Index

find

find方法可以在一个较长的字符串中查找子串,返回子串所在位置的最左端索引。如果没有找到,返回-1。

>>>'hello michael, i am michael'.find('michael')
6    #可见,空格也包含在内了

这个方法还可以接收可选的起始点和结束点参数:

>>>'hello michael,your name is michael'.find('michael',7,27)
-1

注:不包含第二个索引,这在python中是惯例

join

join方法是非常重要的字符串方法,它是split方法的逆方法,用来连接序列中的元素:

>>>seq=[1,2,3,4,5]
>>>sep='+'
>>>sep.join(seq)    #连接数字列表,不是字符串,你看下面就出错啦!
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-1-966645d088a4> in <module>()
      1 seq=[1,2,3,4,5]
      2 sep='+'
----> 3 sep.join(seq)
 
TypeError: sequence item 0: expected string, int found

>>>seq=['1','2','3','4']
>>>sep.join(seq)    #连接字符串列表
‘1+2+3+4’

需要被连接的序列元素都必须是字符串。

lower

lower方法返回字符串的小写字母版
lower方法相关的是title方法,它会将字符串转换为标题——也就是所有档次的首字母大写,其他小写。但是它使用的单词划分方法可能会得到并不自然的结果。

replace

replace方法返回某字符串的所有匹配项均被替换之后得到字符串。

>>>'michael hello michael'.replace('mi','hh')
'hhchael hello hhchael'

有点类似word里的“查找替换”功能吧!是不是很有用啊!

split

这是一个非常重要的字符串方法,它是join方法的逆方法,用来将字符串分隔成序列:

>>>'1+2+3+4'.split('+')
['1','2','3','4']
>>>'using the default'.split()
['using','the','default']

注意:如果不提供任何分隔符,程序将会把所有空格作为分隔符(空格、制表、换行等)。

strip

strip方法返回去除两侧(不包括内部)空格的字符串:

>>>'     internal whitespace is kept    '.strip()
'internal whitespace is kept'

translate

translate方法和replace方法一样,可以替换字符串中的某些部分,但是和前者不同的是,translate方法只处理单个字符。它的优势在于可以同时进行多个替换,有些时候比repalce效率搞得多!
在使用translate转换之前,需要先完成一张转换表。使用string模块里面的maketrans函数就行。

>>>from string import maketrans
>>>table = maketrans('cs','kz')    #c->k,s->z,创建这个表之后,可以将它用做`translate`方法的参数
>>>'this is an incredible test'.translate(table)
'thiz iz an inkredible tezt'
>>>'this is an incredible test'.translate(table,' ')    #`translate`的第二个参数是可选的,这个参数是用来指定需要删除的字符。
'thizizaninkredibletezt'

可见,translatemaketrans方法一起更配噢~

本章小结

这章内容相对比较少,字符串的方法确实很多,到时候,可以去查找,没必要记那么多,常见的弄熟悉就差不多了吧。

其实,这章最大的收获应该是字符串格式化时的一个例子:

>>>'%10f'%pi  #输出结果是'  3.141593'这里没有得到结果'3.14159265'让我产生了疑惑。

后来各处查询资料,才知道,默认小数保留位数为6。因此,才是得到那样的结果。
format可以翻译为格式化吧。

自己学会查找资料真的很重要!官方文档其实写的很棒的!不要惧怕英文!