本章的主要内容是“使用字符串”。介绍一下如何使用字符串格式化其他的值,并了解一下利用字符串的分割、连接、搜索等方法能做些什么。
注意点
字符串是不可变的
下列的操作是非法的:
website = "http://www.python.org"
website[-3:] = "com"
输出:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
格式化字符串中%的处理
如果要在格式化字符串中包括百分号,必须使用%%,避免Python将百分号误认为是转换说明符。
格式化操作符的右操作数
如果右操作数是元组的话,则其中每一个元素都会被单独格式化,每个值都需要一个对应的转换说明符。
字符串格式化转换类型表
下面给出字符串格式化中个转换类型及含义的列表。
转换类型 | 含义 |
---|---|
d,i | 带符号的十进制整数 |
o | 不带符号的八进制 |
u | 不带符号的十进制 |
x | 不带符号的十六进制(小写) |
X | 不带符号的十六进制(大写) |
e | 科学计数法表示的浮点数(小写) |
E | 科学计数法表示的浮点数(大写) |
f,F | 十进制浮点数 |
C | 单字符(接受整数或者单字符字符串) |
r | 字符串(使用repr转换任意Python对象) |
s | 字符串(使用str转换任意Python对象) |
基本转换说明符的组成
基本转换说明符由以下几个部分组成,这些项的顺序是至关重要的。
- %字符:标记转换说明符的开始
- 转换标志(可选): - 表示左对齐;+表示在转换值之前要加上正负号;”“(空白字符)表示整数之前保留空格;0表示转换值如果位数不够则用0填充。
- 最小字段宽度(可选): 转换后的字符串之手应该具有该值指定的宽度。
- 点(.)后跟精度值(可选):如果转换的是实数,精度值表示出现在小数点后的位数。如果转换的是字符串,该数字表示最大字段宽度。
- 转换类型:见上表。
字符串的格式化
在%的左边放置一个字符串(格式化字符串),右侧则放置希望格式化的值。可以用一个值(如一个字符串或者数字),也可以使用多个值的元组或者字典。
例如下面一个例子:
format = "Hello, %s. %s engough for ya?"
values = ('World', 'Hot')
print(format % values)
输出:
Hello, World. Hot engough for ya?
如果使用列表或者其他序列代替元组,那么序列就会被解释为一个值。只有元组和字典可以格式化一个以上的值。
浮点数指定精度
使用下面的代码来格式化指定精度的浮点数。
format = "Pi with three decimals: %.3f"
from math import pi
print(format % pi)
输出:
Pi with three decimals: 3.142
模板字符串
substitute方法会用传递进来的关键字参数x替换字符串中的$x
使用下面的代码:
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('A $thing must never $action')
d = {}
d['thing'] = 'gentleman'
d['action'] = 'show his socks'
s.substitute(d)
输出:
'A gentleman must never show his socks'
字段宽度和精度
这两个参数都是整数(首先是字段宽度,然后是精度),通过点号(.)分隔。虽然两个都是可选查收,但如果只给出精度,就必须包含点号。查看下面的代码:
>>> '%10f' %pi # 字段宽10
' 3.141593'
>>> '%10.2f' % pi # 字段宽10,精度2
' 3.14'
>>> '%.2f' % pi # 精度2
'3.14'
可以使用*
作为字段宽度或者精度(或者两者都使用*
),此时数值会从元组参数中读出:
'%.*s' % (5, 'Guido van Rossum')
输出:
'Guido'
空白和加号
空白意味着在正数前面加上空格,这在需要对其正负数时会很有用。
print(('% 5d' % 10) + '\n' + ('% 5d' % -10))
输出:
10
-10
加号表示不管是正数还是负数都标示出符号(同样在对齐时很有用):
print(('%+5d' % 10) + '\n' + ('%+5d' % -10))
输出:
10
-10
字符串方法
find方法
find方法可以在一个较长的字符串中查找子字符串。它返回子串所在位置的最左端索引。如果没有找到则返回-1
使用下面的代码:
>>> title = "Monty Python's Flying Circus"
>>> title.find('Monty')
0
>>> title.find('Python')
6
>>> title.find('aaaa')
-1
这个方法还接受可选的起始点和结束点参数。由起始和终止值指定的范围包含第1个索引但不包含第2个索引。
join方法
join方法将一个列表用指定的分隔符连接起来。
dirs = ['', 'usr', 'bin', 'env']
'/'.join(dirs)
输出:
'/usr/bin/env'
lower方法
lower方法返回字符串的小写字母版。
使用下面的代码:
'Trondheim Hammer Dance'.lower()
输出:
'trondheim hammer dance'
split方法
split方法用来将字符串分隔成序列。
使用下面的代码:
'1+2+3+4+5'.split('+')
输出:
['1', '2', '3', '4', '5']
如果不提供任何分隔符,程序会把所有空格作为分隔符(空格、制表、换行等)。
translate方法
感觉这个用不到又比较复杂,先略过去了。