在第二章《Python基础 02:序列 》中,我们介绍了序列及序列的通用操作,提到了序列三个中主要数据类型:字符串、列表和元组。
今天,我们我们来学习最后一种序列:字符串。
这一章的概念有点多,需要好好消化下。
什么是字符串?
中文名:字符串
外文名:string
在python中,是没有其他语言的字符(char)变量的,不管是一个字符还是多个字符,统一使用string来定义,我们可以使用引号( ' 或 " )来创建字符串。
- 字符串的内容几乎可以包含任何字符,中英文皆可,Python 3.x 对中文字符支持较好,但 Python 2.x 则要求在源程序中增加“# -*- coding:utf-8 -*- ”才能支持中文字符。
- python中字符串也是不可变对象,所有修改字符串的操都是在另一个内存片段中新生成一个字符串对象, 所以一般字符串的操作都是有返回值的。
- 当一个字符串比较长时,可以使用三引号来包裹,n三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符,如下所示:
a = """百度百科中对字符串的定义如下:字符串或串(String)是由数字、字母、下划线组成的一串字符。一般记为 s=“a1a2···an”(n>=0)。它是编程语言中表示文本的数据类型。在程序设计中,字符串(string)为符号或数值的一个连续序列,如符号串(一串字符)或二进制数字串(一串二进制数字)。通常以串的整体作为操作对象,如:在串中查找某个子串、求取一个子串、在串的某个位置上插入一个子串以及删除一个子串等。两个字符串相等的充要条件是:长度相等,并且各个对应位置上的字符都相等。设p、q是两个串,求q在p中首次出现的位置的运算叫做模式匹配。串的两种最基本的存储方式是顺序存储方式和链接存储方式。"""print(a)
百度百科中对字符串的定义如下:
......此处略去368个字
字符串是一种序列,序列的一系列操作都可以在字符串中使用,此处不再赘述,接下来重点字符串的特殊之处。
转义字符
前面讲了,字符串的内容几乎可以包含任何字符,其中有一部分字符具有特殊供能,我们称之为转义字符,常见的转义字符如下表所示:
举几个例子:
# 例1,使用了``:print('例1:')print(' 精诚所至 金石为开')# 例2,使用了``:print('例2:')print('精诚所至 金石为开')
例1:
精诚所至
金石为开
例2:
金石为开
字符串格式化
我们在输出字符串时,总会遇到这种情况:字符串中的一些信息不能够第一时间确定下来,需要一个变量来承载,例如我们要输出全班所有人的年龄,不可能提前将所有信息都写死在字符串内,这既不现实也不简洁。为了处理这种情况,我们我们需要引入字符串格式化的概念。
在Python中,有2种常用的字符串格式方法:
- %字符串格式化,使用操作符百分号%标记格式化区域;
- str.format()格式化,通过{}和:来代替%标记格式化区域;
接下来我们着重讲一下两种格式方法。
%字符串格式化
传统字符串格式化使用操作符百分号%标记开始,通用的表示形式为:
%[(name)][flags][width].[precision]typecode
接下来对几个关键字一一进行讲解:
- tpecode 占位符 (必需)
# 简单赋值print('小智今年%s岁了' %10)# 元组赋值print('我叫%s,今年%d岁' %('王大锤',10))# 字典赋值print('我叫%(name)s,今年%(age)d岁' %{'name':'王大锤','age':28})
小智今年10岁了
我叫王大锤,今年10岁
我叫王大锤,今年28岁
如上两例,格式化字符串的%s、%d部分表示转换说明符,标记了需要放置转换值的位置,通用术语为占位符。s表示百分号右边的值将被格式化为字符串,s指的是str,如果不是字符串,则使用str将其转换为字符串。Python提供的转换说明符如下所示:
- precision 精度 (可选)
当占位符为浮点数时,可以对其精度进行控制:
print('我年薪%7.3f越南盾'%261523636110.123456)
我年薪261523636110.123越南盾
- width 宽度 (可选)
width用于表示字符串的最小字段宽度,转换后的字符串至少应该具有该值指定的宽度,如果此值为*则宽度从元组中读出:
print('我今年%7.3f岁'%10.123456)print('我叫%7.2s'%'王大锤')print('我年薪%*.*f万'%(7,2,10.12345))
我今年 10.123岁
我叫 王大
我年薪 10.12万
- flags 转换标志位 (可选)
flags表示转换标志,python可用的转换标志包括以下4种:
# 1. `-` 表示左对齐print('-'*15,'左对齐')print('我今年%10.3f岁'%10.123456)#默认右对齐,空格补充在左边print('我今年%-10.3f岁'%10.123456)#左对齐,空格补充在右边# 2. `+` 表示在转换值之前加正负号(整数加`+`负数加`-`);print('+'*15,'正负号')print('我年薪%*.*f万'%(7,2,+10.12345))print('我年薪%+*.*f万'%(7,2,+10.12345))# 3. `` 空格表示在正数前面显示空格;print(' '*15, '填充空格')print('我年薪%.*f万'%(2,+10.12345))print('我年薪% .*f万'%(2,+10.12345))# 4. `0` 表示转换位数不够时用0填充;print('0'*15, '填充0')print('我年薪%*.*f万'%(7,2,+10.12345))print('我年薪%0*.*f万'%(7,2,+10.12345))
- (name) 名称 (可选)
(name)用于在字典赋值时指定key:
print('我叫%(name)s,今年%(age)d岁' %{'name':'王大锤','age':28})
我叫王大锤,今年28岁
至此,%字符串格式化就讲完了,在使用中,灵活搭配不同的关键词就可以实现不同的表现效果。
str.format() 字符串格式化
python2.6之后推出了新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能基本语法是通过{}和:来代替以前的%。format 函数可以接受不限个参数,位置可以不按顺序。 常见格式为:
{字段名!转换字段:格式说明符}
- 字段名
str.format() 中,字段名用于标识插入元素在所对应的索引或变量,用于给字符串赋值,主要应用于以下场景:
- 索引赋值
print('{},{}'.format('你好','明天'))print('{0},{1}'.format('你好','明天'))#{}内的数字表示.format()内元素的索引print('{1},{0}'.format('你好','明天'))#.format()类似于构建了一个元组print('{1},{0},{1}'.format('你好','明天'))
你好,明天
你好,明天
明天,你好
明天,你好,明天
- 关键词赋值
print('我叫{0},今年{age}'.format('王大锤',age='28'))#可以混用#通过元组赋值trup=('王大锤','28')print('我叫{0},今年{1}'.format(*trup))#通过字典赋值site={'name':'王大锤','age':'28'}print('我叫{name},今年{age}'.format(**site))#通过列表赋值list1=['王大锤','28']list2=['王二锤','18']print('我叫{0[0]},今年{1[1]}'.format(list1,list2))#[]外的数字表示format()内的元素索引,[]内表示列表索引
我叫王大锤,今年28
我叫王大锤,今年28
我叫王大锤,今年28
我叫王大锤,今年18
- 也可以向str.format()传入对象:
class AssignValue(object): def __init__(self, value): self.value = valuemy_value = AssignValue(6)print('value 为: {0.value}'.format(my_value)) # "0" 是可选的
value 为: 6
- 转换字段
str.format()中,转换字段用于在传递参数之前对参数进行一些操作,常见的取值有三种:
- s:传递参数之前先对参数调用 str()
- r:传递参数之前先对参数调用 repr()
- a:传递参数之前先对参数调用 ascii()
print('我叫{!s}'.format('王大锤'))print('我叫{!r}'.format('王大锤'))print('我叫{!a}'.format('王大锤'))
我叫王大锤
我叫'王大锤'
我叫'王大锤'
- 格式说明符
str.format()中,格式说明符用于规定字符串的输出格式,标准格式说明符的形式为:
[[fill]align][sign][#][0][width][grouping_option][.precision][type]
中文形式为:
[[填充]对齐方式][正负号][#][0][宽度][分组选项][.精度][类型码]
- type 格式化类型
- .precision 精度 ,用法同传统%格式化方法
- grouping_option 分组选项,取值有两种:, 和 :_,
-
- 使用逗号或下划线对浮点数和 d 类型的整数以千为单位进行分隔
- 对于 b、o、x 和 X 类型,每四位插入一个下划线,其他类型都会报错。
print('年薪:{0:,}'.format(8348283894))print('年薪:{0:_}'.format(8348283894))print('16进制:{0:_x}'.format(0x9896978FF))
年薪:8,348,283,894
年薪:8_348_283_894
年薪:9_8969_78ff
- [0] width 宽度及填充
用于设置字符串的最小宽度,如果最小宽度前面有一个前导 0,意味着用 0 填充:
print('我叫{:5}'.format('王大锤'))print('我年薪{:5}万'.format(20))print('我年薪{:05}万'.format(20))#
我叫王大锤
我年薪 20万
我年薪00020万
- # ,当数字非10进制时起如下作用:
-
- 给二进制数加上 0b 前缀
- 给八进制数加上 0o 前缀
- 给十六进制数加上 0x 前缀
- sign,正负号标记,取值及作用如下:
-
- +,正号加正,负号加负;
- -,正号不变,负号加负;
- 空格 ,正号空格,负号加负;
- align对齐方式(需配合width使用)
-
- >,内容右对齐(默认)
- =,内容右对齐,将符号放置在填充字符的左侧,只对数字类型有效。
- ^,内容居中
print('我年薪{:+5}万'.format(20))print('我年薪{:=+5}万'.format(20))print('我年薪{:^+5}万'.format(20))
我年薪+20 万
我年薪 +20万
我年薪+ 20万
我年薪 +20 万
- fill 填充
-
- 只能是一个字符
- 不指定默认用空格填充
- 如果指定填充字符,则必须要同时指定对齐方式
print('我年薪{:*+5}万'.format(20))print('我年薪{:*=+5}万'.format(20))print('我年薪{:*^+5}万'.format(20))
我年薪+20**万
我年薪**+20万
我年薪+**20万
我年薪*+20*万
字符串常用方法
Python中的字符串内建函数多达40个,具体详见“Python3字符串|菜鸟教程”,此处不再赘述,简单介绍下常用方法有以下几个:
- find('x')、count('x')
- find('x')方法用于检查字符串中是否包含子字符串substr;
- count('x', beg, end)方法用于获取字符串出现的次数,如果指定了beg(开始)和end(结束)范围,就检查是否包含在指定范围内,如果包含子字符串,就返回索引值,否则返回-1:
- join()
- join()方法用于将序列中的元素以指定的字符连接成一个新的字符串,join()方法的语为str.join(sequence),str代表指定插入的字符串,sequence代表要连接的元素序列,返回连接后的新字符串,需要注意的是sequence内元素必须是字符串,不然会报错:
str1='+'.join(['a','b','c','d'])print(str1)
a+b+c+d
- 对于元素为其他类型的序列,可以通过str()加for循环将序列内的元素转换为字符串:
print('+'.join(str(i) for i in (1,2,3,4)))
1+2+3+4
- lower()、upper()、swapcase()
- lower()用于将字符串中的大写字母转换为小写;
- upper()用于将字符串中的小写字母转换为大写,适用于忽略大小写的字符串校验等情况;
- swapcase()方法用于对字符串中的大小写进行转换,大写转小写,小写转大写。
- replace()
- replace()的语法为str.replace(old,new,[max])的作用类似于word中的替换,将字符串中的旧字符串old替换为新字符串new,如果指定第三个可选参数max,替换次数从左向右不超过max次.
- split()
- sptlit()方法通过指定分隔符对字符串进行分割str.split(st='',num=string.count(str)),用来将字符串分割成序列,str为待分割的字符串,st为分隔符,默认为空格,num代表分隔次数。
- 其他
- isdecimal() 检查字符串是否只包含十进制字符,如果是返回 true,否则返回 false。
- title() 返回"标题化"的字符串,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())
- startswith(substr, beg=0,end=len(string)) 检查字符串是否是以指定子字符串 substr 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查。
- index(str, beg=0, end=len(string)) 跟find()方法一样,只不过如果str不在字符串中会报一个异常.
- rindex( str, beg=0, end=len(string)) 类似于 index(),不过是从右边开始.
- rfind(str, beg=0,end=len(string)) 类似于 find()函数,不过是从右边开始查找.
- endswith(suffix, beg=0, end=len(string)) 检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False.
- capitalize() 将字符串的第一个字符转换为大写,其他字符转换为小写.
今天的字符串就先讲到这里,我们明天继续学习与字符串关系比较大的“正则表达式”。