3.1 基本字符串操作:
所有的标准序列操作(索引,分片,乘法,判断成员资格,求长度,取最小值,取最大值)对于字符串同样有效。但是,请记住:字符串都是不可变的
3.2 字符串格式化:精简版
字符串格式化使用字符串格式化操作符,即百分号%来实现。
%也可以用做莫运算(求余)操作符。
在%的左侧放置一个字符串(格式化字符串),而右侧则放置希望被格式化的值。可以使用一个值,如一个字符串或者数字,也可以使用多个值的元组或者字典。一般情况下使用元组:
>>> format = "Hello,%s,%s enough for ya?" >>> values = ('world','Hot') >>> print format % values Hello,world,Hot enough for ya?
注意:
1.如果使用列表或者其他序列代替元组,那么序列会被解释为一个值。只有元组和字典可以格式化一个以上的值。
2.格式化字符串的%s部分被称为转换说明符,他们标记了需要插入转换值的位置。s表示值会被格式化为字符串----如果不是字符串,则会用str将其转换为字符串。
3.如果要在格式化字符串里面包括百分号,那么必须使用%%,这样python就不会将百分号误认为是转换说明符了
4.如果要格式化实数(浮点数),可以使用f说明转换说明符的类型,同时提供所需要的精度:一个句点再加上希望保留的小数位数。因为格式化转换说明符总是以表示类型的字符结束,所以精度应该放在类型字符前面:
>>> format = "Pi with three decimals: %.3f" >>> from math import pi >>> print format % pi Pi with three decimals: 3.142
3.2.1 模版字符串
string提供另一种格式化值的方法:模版字符串。它的工作方式类似于很多UNIX Shell中的变量替换。如下所示:
substitute这个模版方法会用传递进来的关键字foo替换字符串中的$foo:
>>> from string import Template >>> s = Template('$x,glorious $x!') >>> s.substitute(x='slurm') 'slurm,glorious slurm!'
如果替换的事单词的一部分,那么参数名就必须用括号括起来,从而准确指明结尾:
>>> s = Template("It's ${x}tastic") >>> s.substitute(x='slurm') "It's slurmtastic"
可以使用$$插入美元符号:
>>> s = Template("Make $$ selling $x!") >>> s.substitute(x='slurm') 'Make $ selling slurm!'
除了关键字参数之外,还可以使用字典提供的键值对
>>> s = Template('A $thing must never $action.') >>> d = {} >>> d['thing'] = 'gentleman' >>> d['action'] = 'show his socks' >>> s.substitute(d) 'A gentleman must never show his socks.'
方法safe_substitute不会因缺少值或者不正确使用$字符而出错
3.3 字符串格式化:完整版
格式化操作符的右操作数可以是任意类型,如果是元组或映射类型(如字典),那么字符串格式化将有所不同。
如果右操作数是元组的话,则其中的每一个元素都会被单独格式化,每个字都需要一个对应的转换说明符
如果需要转换的元组作为转换表达式的一部分存在,那么必须将它用圆括号括起来,以避免出错
>>> '%s plus %s equals %s' % (1,2,3) '1 plus 2 equals 3' >>> '%s plus % equals %s.' % 1,2,3 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: not enough arguments for format string
3.3.1 基本的转换说明符
基本的转换说明符包括以下部分。注意,这些项的顺序是至关重要的
1.%字符:标记转换说明符的开始
2.转换标志(可选):“-”表示左对齐;“+”表示在转换值之前要加上正负号;""(空白字符)表示正数之前保留空格;0表示转换值若位数不够则用0填充
3.最小字段宽度(可选):转换后的字符串至少应该具有该值指定的宽度,如果是*,则宽度会从值元组中读出
4.点(.)后跟精确度(可选):如果转换的时实数,精确度就表示出现在小数点后的位数,如果转换的是字符串,那么该数字就表示最大字段宽度。如果是*,那么精度将会从元组中读出
5.转换类型:如下所示
转换类型 | 含义 |
d,i | 带符号的十进制整数 |
o | 不带符号的八进制 |
u | 不带符号的十进制 |
x | 不带符号的十六进制(小写) |
X | 不带符号的十六进制(大写) |
e | 科学技术法表示的浮点数(小写) |
E | 科学技术法表示的浮点数(大写) |
f,F | 十进制浮点数 |
g | 如果指数大于-4或者小于精度值则和e相同,其他情况与e相同 |
G | 如果指数大于-4或者小于精度值则和e相同,其他情况与E相同 |
C | 单字符(接收整数或者单字符字符串) |
r | 字符串(使用repr转换任意python对象) |
s | 字符串(使用str转换任意python对象) |
3.3.2 简单转换
简单的转换只需要写出转换类型,使用起来很简单:
>>> 'Price of eggs: %d' % 42 'Price of eggs: 42' >>> 'Hexadecimal price of eggs: %x.' % 42 'Hexadecimal price of eggs: 2a.' >>> from math import pi >>> 'Pi: %f...' %pi 'Pi: 3.141593...' >>> 'Pi: %f...' % pi 'Pi: 3.141593...' >>> 'Very inexact estimate of pi: %i.' % pi 'Very inexact estimate of pi: 3.' >>> 'Using str: %s.' % 42L 'Using str: 42.' >>> 'Using repr: %r.' % 42L 'Using repr: 42L.'
3.3.3 字段宽度和精度
转换说明符可以包括字段宽度与精度。字段宽度是转换后的值会所保留的最小字符个数,精度(对于数字转换来说)则是结果中应该包含的小数位数,或者(对于字符串转换来说)是转换后的值所能包含的最大字符个数。
这两个参数都是整数(首先是字段宽度,然后是精度),通过点号(.)分隔。虽然两个都是可选的参数,但是如果只给出精度,就必须包含点号:
>>> '%10f ' % pi #字段宽10 ' 3.141593 ' >>> '%10.2f' % pi #字段宽10,精度2 ' 3.14' >>> '%.2f' % pi #精度2 '3.14' >>> '%.5s' % 'Guido van Rossum' 'Guido'
可以使用*(星号)作为字段宽度或者精度(或两者都用*),此时数值会从元组参数中读出:
>>> '%.*s' % (5,'Guido van Rossum') 'Guido'
3.3.4 符号、对齐和用0填充
在字段宽度与精度之前还可以放置一个“标志”,该标志可以是零,加号,减号或空格。零表示数字将会用0进行填充。
注意:在010开头的那个0并不意味着字段宽度说明符为八进制数,他只是个普通的python数值。当使用010作为字段宽度说明符时,表示字段宽度为10,并且用0进行填充空位,而不是说字段宽度为8。