Python基础教程学习笔记—第3章:字符串的使用
一、字符串基本操作
字符串作为另一种序列,所有的标准序列操作(索引、切片、乘法、成员资格检查、长度、最小值和最大值)都是适用于字符串的,参见之前的一篇博客:列表和元组。但字符串和元组一样也是不可变的,所以所有的赋值和修改都是不可以的。
1.1 字符串的表示
在python中,用单引号或双引号括起来的就是字符串,两者并没有区别。如果想在字符串中输入单引号,需要用转义字符进行转义,即\'
。
print('Let\'s go!') #打印Let's go!
如果要表示很长的字符串(跨越多行的字符串),可使用三引号。(如果字符串中含有单引号,可用3个双引号括起,这样就不需要转义字符。)
print('''My name is Cxx.
I am studing in Nanjing Tech University.
Life is short and I use Python.''') #输出为三段语句。
常规的单引号或双引号也可以实现跨越多行,只需在行尾上加上反斜杠。
print('My name is Cxx.\
I am studing in Nanjing Tech University.\
Life is short and I use Python.') #输出为一段语句。
如果字符串中本来就含有转义字符,比如文件的路径,这时候如果用一般的字符串表示就会当做转义字符处理掉,但这并不是我们想要的。Python提供了一种可以原样显示原始字符串的格式,即在单引号或双引号前面加上前缀。
print(r'C:\n\t') #不加前缀r则无法输出正确的文件路径,打印结果为:C:\n\t
1.2 字符串的格式—基础版:%
将值转换为字符串并设置其格式是一个重要的操作,Python提供了多种字符串格式设置方法。其中最简单的一种方式是字符串格式设置运算符—百分号%。其基本格式为:在%左边指定一个字符串(格式字符串),并在右边指定要设置其格式的值。如果要同时指定多个也可以使用元组格式。即‘格式字符串’%指定格式的值。
print('My name is %s'%'cxx') #打印结果为:My name is cxx.
print('I am %d years old'%24) #打印结果为:I am 24 years old.
print('My name is %s. I am %d years old'%('cxx',24))
#打印结果为:My name is cxx. I am 24 years old.
%s和%d都是格式字符串中的转换说明符。在相应的位置中插入转换说明符并在%后面给定对应的值就可以输出一个带格式的字符串。
1.3 字符串的格式—高级版:.format()
Python除了提供了一个格式设置运算符%,还提供了一个更加强大的字符串格式方法format。使用该方法时,每个替换字段都用花括号括起,括号里面可以设置名称 和 对相应的值进行转换和格式设置的信息。替换字段主要由3个可选部分组成:
- 字段名:索引或标识符,指出要设置哪个值的格式并使用结果来替换该字段。除指定值外,还可以指定值的特定部分,如列表的元素。
- 转换标志:跟在叹号后面的单个字符,可以是(表示原样输出)、(表示字符串输出)和(表示)。如果指定了转换标志,将不使用对象本身的格式设置机制,而是使用指定的函数将对象转换为字符串,再做进一步的格式设置。
- 格式说明符:跟在冒号后面的表达式。格式说明符可以能够详细地指定最终的格式,包括格式类型、字段宽度和数的精度等。
1.3.1 替换字段名
在最简单的情况下,只需向format提供要设置其格式的未命名参数,并在格式字符串中使用未命名字段。如果没有特殊说明,将按照顺序将字段和参数匹配,也可以在format中指定参数的名称。
print('My name is {} and I am {} years old.'.format('cxx',24))
print('My name is {name} and I am {age} years old.'.format(name ='cxx',age = 24))
print('My name is {0} and I am {1} years old.'.format('cxx',24))
打印结果都为:My name is cxx and I am 24 years old.
即依次按顺序或自己设定的顺序替换字符串中的花括号里面的内容。
1.3.2 基本转换
指定要在字段中包含的值后,就可以添加有关如何设置其格式的指令了。首先,可以提供一个转换标志(跟在叹号后面)。
print('{string!s},{string!r}'.format(string = 'a\tb'))
打印结果为:a b,'a\tb'
。可以多个字段名对应一个参数,表示输出字符串,表示原样输出。
还可以指定转换的值为哪种类型。在格式说明(即冒号后面)使用类型说明符即可转换为相应的类型。
类型 | 含义 | 类型 | 含义 |
---|---|---|---|
表示为二进制数 | 表示为十进制数 | ||
表示为八进制数 | 表示为十六进制数 | ||
表示为科学计数法,用e来表示指数 | 表示为浮点数 | ||
% | 表示为百分比值 | 保持字符串的格式不变 |
print('The number is {num},{num:f},{num:b},{num:%}'.format(num = 24))
打印结果为:The number is 24,24.000000,11000,2400.000000%
。
1.3.3 宽度、精度和千位分隔符
设置为浮点数时,默认小数点后面显示6位小数。且不进行任何形式的填充。如果想实现不同的精度和宽度需要在格式说明中指定说明。这两个设置都是在格式说明(冒号后面)用数字说明,即宽度.精度的形式。
import math
print('{pi:5}'.format(pi = 'pi'))
print('{pi:5.2}'.format(pi = math.pi))
打印结果为:
pi
3.1
是python中的库里面的,要先导入库。可以看出字符串和数的对齐方式是不同的。字符串默认是左对齐,数字默认是右对齐。千位分隔符用逗号表示。'{:,}'.format(10000)
。
1.3.4 符号、对齐和填充
要指定左对齐、右对齐和居中,可分别使用<、>和^。
import math
print('{pi:<6.2f}\n{pi:^6.2f}\n{pi:>6.2f}'.format(pi = math.pi))
打印结果为:
3.14
3.14
3.14
要设置对齐方式,首先要设置宽度。对齐后,默认的填充方式是空格,当然也可以在对齐说明符前面加上其他字符来填充。如果要给正数加上符号,可使用说明符+,并将其放在对齐说明符后面。
import math
print('{pi:*^8.2f}\n{pi:>+8.2f}'.format(pi = math.pi))
打印结果为:
**3.14**
+3.14
例:打印商品价格表。
输出结果为:
===================================
Item Price
-----------------------------------
Apples 0.40
Pears 0.50
===================================
代码为:
total_width = 35 #打印表的总宽度
price_width = 10 #Prcie的宽度
item_width = total_width - price_width #Item的宽度
print('=' * total_width) #打印第一行横线
header_fmt = '{{:{}}}{{:>{}}}'.format(item_width,price_width)
#其输出为:{:25}{:>10}
print(header_fmt.format('Item','Price')) #打印标题行
print('-' * total_width) #打印中间的横线
item_fmt = '{{:{}}}{{:>{}.2f}}'.format(item_width,price_width)
#其输出为:{:25}{:>10.2f}
print(item_fmt.format('Apples',0.4)) #打印价格行
print(item_fmt.format('Pears',0.5))
print('=' * total_width)
首先指定整个价格表的宽度为35,的宽度为10,那的宽度就是总宽度减去的宽度。第一行的横线可以用之前的序列相乘的方法。print('=' * total_width)
。为了提高程序的可扩展性,可以使用的嵌套。header_fmt = '{{:{}}}{{:>{}}}'.format(item_width,price_width)
。其中{{}}表示嵌套引用,即保留{}。因为之前都是用{}引用的。冒号后的{}也是嵌套引用,即保留:。所以该行的结果为:{:25}{:>10}
。这也是方法前要设定的格式,即宽度为25和宽度为10且右对齐。然后在下面一行中再次调用,并将字符串添加进来,即print(header_fmt.format('Item','Price'))
,即可实现程序的扩展性(只需更改最原始的宽度即可)。价格行的代码和标题行类似。
二、字符串方法
字符串的方法相比之前序列的方法要多得多,很多方法也是从中继承来的。这里只介绍一些最有用也是最常用的字符串方法。
2.1 strip()
strip():删除字符串开头和末尾处指定的字符,并返回删除后的结果。
print(' I am Cxx.'.strip())
print('****I am Cxx.*!*'.strip('*!'))
打印结果为:
I am Cxx.
I am Cxx.
该方法的参数可以是空(默认是空格),也可以是一个字符,也可以是字符的组合。当发现字符串的开头和空格包括要删除的字符时,就将其删除,直到出现与要删除的字符不同时为止。
2.2 split()
split():将字符串按指定字符拆分成序列。
print('I am Cxx. I am studying in Nanjing Tech University.'.split())
print('I am Cxx. I am studying in Nanjing Tech University.'.split('.'))
打印结果为:
['I', 'am', 'Cxx.', 'I', 'am', 'studying', 'in', 'Nanjing', 'Tech', 'University.']
['I am Cxx', ' I am studying in Nanjing Tech University', '']
该方法的参数也可以为空(默认为空格),也可以是一个指定的字符。然后根据所选参数将原字符串拆分,并将其放入序列中(列表)。
2.3 join()
join():和split()相反,按指定字符合并序列的元素(必须是字符串元素),从而组成新的字符串。
print(' '.join(['I','am','Cxx.']))
print('+'.join(['1','2','3']))
打印结果为:
I am Cxx.
1+2+3
即用指定的字符依次插入到序列的元素中,注意必须是字符串的序列。如果是数字列表则会报错。
2.4 find()和replace()
find():在字符串中查找子串,如果找到则返回子串的第一个字符的索引,否则返回-1。
replace():将指定子串替换为另一个字符串,并返回替换的结果。
print('I am Cxx.'.find('x'))
print('I am Cxx.'.replace('Cxx','cxx'))
打印结果为:
6
I am cxx.
字符在原字符串第一次出现的索引值为6。replace()方法中第一个参数为原字符串中的子串,第二个参数为要替换的字符串。
更多的字符串方法可参见这篇博客:字符串方法。
三、参考文献
Magnus Lie Hetland,Python基础教程(第三版),人民邮电出版社,2018.3。
推荐阅读
-
python学习笔记:第17天 面向对象03 类与类之间的关系
-
python学习笔记:第16天 面向对象02--对象中的成员
-
python学习笔记:第19天 类的约束、异常、MD5和logging
-
Python学习笔记——主要函数及基本使用(与C的对比)
-
python学习笔记——matpoltlib的使用(1)
-
Python中函数参数设置及使用的学习笔记
-
python学习笔记(十三) -- 多重继承和MixIn,以及@property的使用
-
FishC《零基础学习python》笔记--第007、008讲、009讲:了不起的分支和循环1、2、3
-
Python基础教程学习笔记—第3章:字符串的使用
-
Python学习笔记:第3天 字符串的操作