昨天学了列表和元组,今天学了python中的字符串。字符串也是序列,所以标准序列操作(索引,切片,乘法,成员资格审查,长度,最大值和最小值)都适用于字符串。需要注意的是,字符串是不可变的。所以对字符串元素赋值或切片赋值都是非法的。
字符串的格式设置的主要思想是对字符串调用方法format,并提供要设置其格式的值。这些值之后会被插入到字符串中,以替换用花括号{}括起的替换字段。
替换字段是格式字符串中最重要的部分。替换字段主要由如下部分组成,每个部分都是可选的。
替换字段名有好几种方式,第一种简单的是直接向format提供要设置其格式的未命名参数,并在格式字符串中使用未命名字段。这种情况是按顺序将字段和参数配对。
>>> "{foo} {} {bar} {}".format(1, 2, bar=4, foo=3)
'3 1 4 2'
也可使用索引,不按顺序使用未命名参数。
>>> "{foo} {1} {bar} {0}",format(1, 2, bar=4, foo=3)
'3 2 4 1'
注意,不能既使用索引,又有空的{}。这样会混乱。另外除了使用值本身,还可以使用值的部分。
>>> fullname = ["Alfred", "Smoketoomuch"]
>>> "Mr {name[1]}".format(name=fullname)
'Mr Smoketoomuch'
替换的值确定好后,可以指定值的格式。提供转换标志完成格式转换。基本格式有以下三种:
另外,除了字符串版本格式外,还可以指定要转换的值是那种类型。下面是类型表清单。
类型 | 含义 |
---|---|
b | 将整数表示为二进制数 |
c | 将整数解读为Unicode码点 |
d | 将整数视为十进制进行处理,这是整数默认使用的说明符 |
e | 使用科学表示法来表示小数(用e来表示指数) |
E | 与e相同,但使用E来表示指数 |
f | 将小数表示为定点数 |
F | 与f相同,但对于特殊值(nan和inf ),使用大写表示 |
g | 自动在定点表示法和科学表示法之间做出选择。这是默认用于小数的说明符,但在默认情况下至少有一位小数 |
G | 与g相同,但使用大写来表示指数和特殊值 |
n | 与g相同,但插入随区域而异的数字分隔符 |
o | 将整数表示为八进制数 |
s | 保持字符串的格式不变,这是默认用于字符串的说明符 |
x | 将整数表示为十六进制数并使用小写字母 |
X | 与x相同,但使用大写字母 |
% | 将数表示为百分比值(乘以100,按说明符f设置格式,再在后面加上%) |
举个例子,将值转换为f类型。
>>> "The number is {num}".format(num=42)
'The number is 42'
>>> "The number is {num:f}".format(num=42)
'The number is 42.000000'
设置字段的宽度,宽度是使用整数指定的,如下所示:
>>> "{num:10}".format(num=3)
' 3'
>>> "{name:10}".format(name="Bob")
'Bob '
可以看出,数和字符串的对齐方式是不同的。这个等会再说,我们还可以设置精度,精度也是使用整数指定的,但需要在它前面加上一个表示小数点的句点
>>> import math
>>> "Pi day is {pi:.2f}".format(pi=math.pi)
'Pi day is 3.14'
还可以同时指定宽度和精度,宽度要在精度前面。
>>> "Pi day is {pi:10.2f}".format(pi=math.pi)
'Pi day is 3.14'
最后,可使用逗号来指出你要添加千位分隔符,逗号要放在宽度和表示精度的句点之间。
>>> "One googol is {:,}".format(10*100)
'One googol is 1,000'
符号: ‘+’, ‘-’, ‘ ’
对齐:左对齐 ‘<’, 居中‘^’, 右对齐‘>’
填充: 用0填充或者用其他字符(除了‘+’,‘-’)填充
符号,对齐和填充字符都要放在宽度之前。填充要在最前面,符号放在最后面。看下面例子。
>>> "{:010.2f}".format(math.pi)
'0000003.14'
>>> # 左中右对齐
>>> print('{0:<10.2f}\n{0:^10.2f}\n{0:>10.2f}'.format(math.pi))
3.14
3.14
3.14
>>> # 其他字符填充
>>> "{:$^15}".format(" WIN BIG ")
'$$$ WIN BIG $$$'
>>> # 符号
>>> print('{0:+.2}\n{1:-.2}'.format(math.pi, -math.pi))
+3.1
-3.1
最后还有一个井号(#)选项,放在符号说明符和宽度之间。用于转换类型。对特定类型会在转换值之前加一个前缀。
>>> "{:b}".format(42)
'101010'
>>> "{:#b}".format(42)
'0b101010'
>>> "{:g}".format(42)
'42'
>>> "{:#g}".format(42)
'42.0000'
>>> # 对于十进制数, #要求必须包含小数点,整数保留零。
下面是一个设置字符串格式的综合应用,可以更好的理解格式的设置方式。
代码如下:
# 根据指定的宽度打印格式良好的价格列表
width = int(input('Please enter width: '))
price_width = 10
item_width = width - price_width
header_fmt = '{{:{}}}{{:>{}}}'.format(item_width, price_width)
fmt = '{{:{}}}{{:>{}.2f}}'.format(item_width, price_width)
print('=' * width)
print(header_fmt.format('Item', 'Price'))
print('-' * width)
print(fmt.format('Apples', 0.4))
print(fmt.format('Pears', 0.5))
print('=' * width)
运行效果如图:
Please enter width: 35
===================================
Item Price
-----------------------------------
Apples 0.40
Pears 0.50
===================================
字符串方法和列表方法一样都很多,主要方法列举在下面表中。
方法 | 含义 |
---|---|
center | 在字符串两边添加填充字符,让字符串居中 |
find | 在字符串中查找子串,找到返回索引,否则返回-1 |
jon | 合并序列的元素 |
lower | 返回字符串的小写版本 |
replace | 将指定子串都替换成另一个字符串。 |
split | 将字符串拆分成序列 |
strip | 将字符串开头和末尾的空白(不包括中间的空白)删除,并返回删除后的结果。 |
translate | 替换字符串的特定部分,可同时替换多个字符。效率比replace高。 |
使用方法如下:
>>> # 字符串方法
>>> # center
>>> # 向两边添加填充字符(默认为空格)让空格居中
>>> "The Middle by Jimmy Eat World".center(39)
' The Middle by Jimmy Eat World '
>>> "The Middle by Jimmy Eat World".center(39,"*")
'*****The Middle by Jimmy Eat World*****'
>>> # find :查找子串,找到返回第一个字符的索引,否则返回-1
>>> 'With a moo-moo here, and a moo-moo there'.find('moo')
7
>>> # find可以指定搜索的起点和终点(可选)
>>> subject = '$$$ Get rich now!!! $$$'
>>> subject.find('$$$')
0
>>> subject.find('$$$', 1) # 只指定了起点
20
>>> subject.find('$$$', 1, 20) # 同时指定了起点和终点
-1
>>> # join
>>> seq = [1, 2, 3, 4, 5]
>>> sep = '+'
>>> sep.join(seq)
Traceback (most recent call last):
File "" , line 1, in <module>
sep.join(seq)
TypeError: sequence item 0: expected str instance, int found
>>> # 合并数字列表失败
>>> seq = ['1', '2', '3', '4', '5']
>>> sep = '+
SyntaxError: EOL while scanning string literal
>>> sep = '+'
>>> sep.join(seq)
'1+2+3+4+5'
>>> # 合并字符串列表
>>> dirs = '', 'usr', 'bin', 'env'
>>> '/'.join(dirs)
'/usr/bin/env'
>>> '\'.join(dirs)
SyntaxError: EOL while scanning string literal
>>> '\\'.join(dirs)
'\\usr\\bin\\env'
>>> "\".join(dirs)"
'".join(dirs)'
>>> print('C:' + '\\'.join(dirs))
C:\usr\bin\env
>>> # lower 返回字符串的小写版本
>>> 'Trond'.lower()
'trond'
>>>
>>> # replace 替换子串
>>> 'This is a test'.replace('is', 'eez')
'Theez eez a test'
>>> # replace 是将指定子串都替换为另外一个字符串
>>> # split 将字符串拆分为序列
>>> '1+2+3+4+5'.split('+')
['1', '2', '3', '4', '5']
>>> # 若没有指定分隔符,将在空白字符处分割
>>> 'dsjfkj kjkjl'.split()
['dsjfkj', 'kjkjl']
>>> # strip 将开头和末尾处的空白删除。并返回删除后的结果。
>>> names = ['gumby', 'smith']
>>> name = 'gumby '
>>> if name in names :
print("Found It !")
>>> if name.strip() in names :
print("Found it !“)
SyntaxError: EOL while scanning string literal
>>> if name.strip() in names :
print("Found it !")
Found it !
>>> # 另外,你还可以在一个字符串参数中指定要删除那些字符
>>> '** Spam * for * everyone!!! ***.'.strip('*!')
' Spam * for * everyone!!! ***.'
>>> '** Spam * for * everyone!!! ***.'.strip('*!.')
' Spam * for * everyone!!! '
>>> '** Spam * for * everyone!!! ***.'.strip('*!. ')
'Spam * for * everyone'
>>> # translate : 同时替换多个字符
>>> # 使用前,要创建一个转换表 maketrans, 转换表的参数有三个,第一个和第二个为字符串长度相同,指定将第一个字符串中的每个字符替换成第二个字符串中的每个字符。第三个参数可不写,表示指定要将那些字母删除。
>>> table = str.maketrans('cs', 'kz')
>>> table
{99: 107, 115: 122}
>>> 'this is an incredible test'.translate(table)
'thiz iz an inkredible tezt'
>>> table = str.maketrans('cs', 'kz', ' ')
>>> 'this is an incredible test'.translate(table)
'thizizaninkredibletezt'
>>> # 最后字符串还有许多判断字符串是否满足特定的条件,通常以is开头。
那么字符串到这里就结束了,接下来是字典的学习。