六:python 对象类型详解二:字符串(下)

时间:2021-03-13 15:08:19

一:字符串方法:

  方法就是与特定对象相关联在一起的函数。从技术的角度来讲,它们是附属于对象的属性,而这些属性不过是些可调用的函数罢了。Python 首先读取对象方法,然后调用它,传递参数。如果一个方法计算出一个结果,它将会作为整个方法调用表达式的结果被返回。Note:一个对象可以调用的方法查询可以通过 dir(' ') 来查询。

1,修改字符串:

  a) 利用s.replace()函数:合并操作和replace 方法每次运行会产生新的字符串对象,这是一个潜在的缺陷。如果对一个超长的字符串进行许多的修改,为了优化脚本的性能,可能需要一个可以支持将字符串转换为一个支持原处修改的对象。

  b) 利用 list() 方法和 .join() 方法来原地修改字符串:list(s): 作用是将一个字符串 s “打散”为一个列表,然后原地修改列表的值,再用 ‘’.join() 方法将已经修改过的列表组合成字符串。其中 ‘¥’.join(L) 为将列表L中的 元素组合成一个字符串,并且用“¥”隔开:

>>>'$'.join(['eggs','ham','toast'])  #   ' '.join(L) 测试
'eggs$ham$toast' >>>s = 'spammy'
>>>L = list(s) #打散字符串
>>>L
['s','p','a','m','m','y']
>>>L[3] = 'x' #原地修改字符列表
>>>L[4] = 'x'
>>>L
['s','p','a','x','x','y']
>>>s = ''.join(L) #进行连接
>>>s
'spaxxy'

2,文本解析:

  分析结构并提取字串叫做文本解析。一组数据出现在固定偏移处,因此可以通过分片从原始字符串分出来。这一技术称为解析,只需要数据有固定的偏移。如果不是这样,而是有些分隔符分开了数据组件,你就可以使用split()提取这些组件。字符串的 split() 方法将一个字符串分割为一个子字符串的列表,以分隔符字符串为标准:

>>>line = 'aaa bbb ccc'
>>>cols = line.split()
>>>cols
['aaa','bbb','ccc']

3,实际应用中的其他常见字符串方法:

  

>>>line = "The knights who say Ni!\n"
>>>line.rstrip() #除去最右侧的空格
'The knights who say Ni!'
>>>line.upper() #转换为大写字母
'THE KNIGHTS WHO SAY NI\n'
>>>line.isalpha() #是否是希腊字符
False
>>>line.endswitch('Ni!\n') #判断结尾是否是 Ni!\n
True
>>>line.startswitch('The')
True

注意没有字符串方法支持模式----对于基于模式的文本处理,必须使用Python 的re 标准库模块。

二:字符串格式化:

  1,字符格式化表达式:在%操作符左侧放置一个需要进行格式化的字符串,这个字符串带有一个或多个嵌入的转换目标,都以%开头(例如,%d);在%操作符右侧放置一个(或多个,嵌入到元组中)对象,这些对象将会插入到左侧想让python 进行格式化字符串的一个(或多个)转换目标的位置上去。

>>>"%s -- %s -- %s" % (42,3.14159,[1,2,3])
'42 -- 3.14159 -- [1,2,3]'

这个例子中,同样是插入三个值:一个整数,一个浮点数和一个列表对象。但是注意到所有目标左侧都是%s,这就是要把它们转换成字符串。而且当插入的值不止一个的时候,应该在右侧用括号把它们括起来(也就是把它们放到元组中去)。记住格式化总是返回一个新的字符串作为结果而不是对左侧字符串进行修改。

  a) 更高级的字符串格式化表达式:在格式化字符串中,表达式左侧的转换目标支持多种转换操作,转换目标的通用结构为:

    %[(name)][flags][width][.precisiion]typecode

    其中:name:为字典的键;flags 为左对齐(-);正负号(+);补零(0)标志位;width 为数字的总宽度;.precision 为小数点的位数。 width 和 precision 都可以编码为一个*,以指定它们应该从输入值的下一项中取值。下面举几个例子:

>>>'%-6.2f | %05.2f | %+06.1f' % (x,x,x)
'1.23 | 01.23 | +001,2 ' #返回字符串
>>>
>>>x = 1.23456789
>>>“%s” % x, str(x)
('1.23456789','1.23456789') #返回一个元组
>>>
>>>'%f, %.2f, %.*f' % (1/3.0,1/3.0,4,1/3.0) #%*f :输入值的下一项取值
'0.333333,0.33,0.3333' #返回一个字符串

  b) 基于字典的字符串格式化:字符串格式化同时也允许左边的转换目标来引用字典中的键来提取对应的值。

>>>"%(n)d %(x)s" %{"n" : 1,"x" :"spam"}
'1 spam'
>>>reply = """      #example
Greatings...
Hello %(names)s!
Your age squared is %(age)s
"""
>>>value = {'name' : 'Bob', 'age : 40'}
>>>print(reply % value)
Greatings...
Hello Bob!
Your age squared is 40

另外,这样的小技巧也常与内置函数 vars()配合使用,这个函数返回的字典包含了所有在本函数调用时存在的变量,当字典用在一个格式化操作的右边时,它会让格式化字符串通过变量名来访问变量(也就是通过字典的键):

>>>food = 'spam'
>>>age = 40
>>>vars()
{'food' : 'spam','age' : 40,...many more...}
>>>"%(age)d %(food)s" % vars()
'40 spam'
>>>food = 'spam'
>>>age = 40
>>>vars()
{'food' : 'spam','age' : 40,...many more...}
>>>"%(age)d %(food)s" % vars()
'40 spam'

三:字符串格式化调用方法:

  a) 基础知识:字符串对象的format 方法使用主体字符串作为模板,并且接受任意多个将要根据模板替换值的参数。在主体字符串中,花括号通过位置(例如,{1} ) 或关键字(例如,{food})指出替换目标及将要插入的参数。我们将会学到函数和方法的参数可以使用位置或关键字名称来传递。

>>>template = '{motto},{0} and {food}'  #By position and By keyword
>>>template.format('ham',motto = 'spam',food = 'eggs')
'spam,ham and eggs'

并且任意的对象类型都可以替换:

>>>'{motto}, {0} and {food}'.format(42,motto = 3.14, food = [1,2])  #列表类型
'3.14,42 and [1,2]'

b) 添加键、属性和偏移量:格式化字符串可以指定对象属性和字典键-----方括号指定字典键,而点表示位置或关键字所引用的一项的对象属性:

>>>import sys      #attribute + position + dict
>>> 'My {1[spam]} runs {0.platform}'.format(sys,{'spam': 'laptop'})
'My laptop runs win32'
>>>
>>>'My {config[spam]} runs {sys.platform}'.format(sys=sys, config = {'spam': 'laptop'}) #attribute + keyword + dict
'My laptop runs win32'
>>>import sys      #attribute + position + dict
>>> 'My {1[spam]} runs {0.platform}'.format(sys,{'spam': 'laptop'})
'My laptop runs win32'
>>>
>>>'My {config[spam]} runs {sys.platform}'.format(sys=sys, config = {'spam': 'laptop'}) #attribute + keyword + dict
'My laptop runs win32'

c) 添加具体格式化:

  像格式化字符串表达式中添加额外的语法来实现更具体的层级一样,对于格式化方法,,我们在替换目标的标识符之后使用一个冒号,后面跟着可以指定字段大小、对齐方式和一个特定类型编码的格式化声明。形式化结构:  {fieldname!conversionflag : formatspec}    在这个替代目标语法中:fieldname 是指定参数的一个数字或关键字;conversionflag 可以是r,s,或者a 分别是在该值上对repr、str、或者ascii 内置函数的一次调用;Formatspec 指定了如何表示该值,包括字段宽度、对齐方式、补零、小数点精度等细节。冒号后的formatspec 组成形式上的描述如下: [align][sign][0][width][.precision][typecode].align可能是<、>、=或^,分别表示左对齐、右对齐、一个标记字符后的补充或居中对齐。

>>>'{0.platform:>10} = {1[item] : <10}'.format(sys,dict(item = 'laptop'))
' win32 = laptop'
>>>
>>>'{0 :X},{1 : o},{2 : b}'.format(255,255,255) #Hex,octal,binary
'FF,377,11111111'
>>>
>>>'%.*f' % (4,1/3.0) #表达式的嵌套
''0.3333
>>>
>>>format(1.2345,'.2f') #新的内置 format 函数
'1,23'

d) 注意关键字格式化和字典格式化的区别:

>>>'%(n)d %(x)s' % {'n ': 1,'x' : 'spam'}   #By dict_keyword
'1 spam'
>>> 'my %(spam)s runs %(platform)s' % dict #By keyword(spam= 'laptop',platform=sys.platform)
'my laptop runs win32'
>>>
>>>'my %(spam)s runs %(platform)s' %
{('spam' : 'laptop','platform' : sys.platform)} #By dict_keyword
'my laptop runs win32'

e) 格式化方法有时比格式化表达式更加直接。(这里方法调用中的**是一种特殊的语法,它把键和值的一个字典包装到单个的“name = value” 关键字参数中,以便可以在格式化字符串中用名字来引用它们):

>>>data = dict(platform=sys.platform,spam='laptop')   #  **测试用例
>>>'My {spam : <8} runs {platform : >8}'.format(**data)
'My laptop runs win32'
>>>
>>>'My {spam : <8} runs {platform : >8} % dict(platform=sys.platform,spam='laptop') #表达式实现
'My laptop     runs        win32'

f) 方法名和通用参数:从技术上将,格式化表达式接受一个单个替换值,或者一项或多项的元组。事实上,单个项可以独自给定,也可以在元组中给定,要格式化的元组必须作为嵌套的元组提供:

>>>'%s' % 1.23
'1.23'
>>>'%s' %(1.23,)
'1.23'
>>>'%s' % ((1.23,),) #格式化元组
'(1.23,)'

g)各种数据类型的特点总结:

  1,同样分类的类型共享其操作集合:字符串是不可改变的序列:它们不能在原地进行改变,并且它们是位置相关排序好的集合,可以通过偏移量读取。现在,本书中我们所有学过的序列都可以使用本章中对于字符串的序列操作---合并、索引、迭代等。在Python 中有三个主要类型(以及操作的分类):

    数字 (整数、浮点数、二进制、分数等)  支持加法和乘法等。

    序列 (字符串、列表、元组)   支持索引、分片和合并等。

    映射(字典)    支持通过键的索引等。

  唯一的区别就是:不同的数据类型所得到的最终对象是根据原始对象的类型来决定的。

  2,可变类型能够在原处进行修改:

    不可变类型(数字、字符串、元组、不可变集合)

    可变类型 (列表、字典、可变集合)