欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python基础教程学习笔记—第3章:字符串的使用

程序员文章站 2022-07-14 23:20:05
...

一、字符串基本操作

  字符串作为另一种序列,所有的标准序列操作(索引、切片、乘法、成员资格检查、长度、最小值和最大值)都是适用于字符串的,参见之前的一篇博客:列表和元组。但字符串和元组一样也是不可变的,所以所有的赋值和修改都是不可以的。

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提供了一种可以原样显示原始字符串的格式,即在单引号或双引号前面加上前缀r

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. 字段名索引或标识符,指出要设置哪个值的格式并使用结果来替换该字段。除指定值外,还可以指定值的特定部分,如列表的元素。
  2. 转换标志:跟在叹号后面的单个字符,可以是r(表示原样输出)、s(表示字符串输出)和a(表示ascii。如果指定了转换标志,将不使用对象本身的格式设置机制,而是使用指定的函数将对象转换为字符串,再做进一步的格式设置。
  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'。可以多个字段名对应一个参数,s表示输出字符串,r表示原样输出。
  还可以指定转换的值为哪种类型。在格式说明(即冒号后面)使用类型说明符即可转换为相应的类型

类型 含义 类型 含义
b 表示为二进制数 d 表示为十进制数
o 表示为八进制数 x 表示为十六进制数
e 表示为科学计数法,用e来表示指数 f 表示为浮点数
% 表示为百分比值 s 保持字符串的格式不变
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

  pi是python中的math库里面的,要先导入math库。可以看出字符串和数的对齐方式是不同的。字符串默认是左对齐,数字默认是右对齐。千位分隔符用逗号表示。'{:,}'.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,Price的宽度为10,那Item的宽度就是总宽度减去Price的宽度。第一行的横线可以用之前的序列相乘的方法。print('=' * total_width)。为了提高程序的可扩展性,可以使用format的嵌套。header_fmt = '{{:{}}}{{:>{}}}'.format(item_width,price_width)。其中{{}}表示嵌套引用,即保留{}。因为format之前都是用{}引用的。冒号后的{}也是嵌套引用,即保留:。所以该行的结果为:{:25}{:>10}。这也是format方法前要设定的格式,即宽度为25和宽度为10且右对齐。然后在下面一行中再次调用format,并将字符串添加进来,即print(header_fmt.format('Item','Price')),即可实现程序的扩展性(只需更改最原始的宽度即可)。价格行的代码和标题行类似。

二、字符串方法

  字符串的方法相比之前序列的方法要多得多,很多方法也是从String中继承来的。这里只介绍一些最有用也是最常用的字符串方法。

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.

  字符x在原字符串第一次出现的索引值为6。replace()方法中第一个参数为原字符串中的子串,第二个参数为要替换的字符串。
  更多的字符串方法可参见这篇博客:字符串方法

三、参考文献

Magnus Lie Hetland,Python基础教程(第三版),人民邮电出版社,2018.3。