这篇我们接上一篇把字符串类型没有说的完的接着说完,我们先说字符串的不变性,在Python中字符串类型是一种不可变的数据类型,就是说它的值不能被改变或修改,那什么意思呢,就是我们如果要想修改一个字符串就只能通过生成一个新字符串的方式来操作,也许有的小伙伴会说,不是呀,字符串是能修改的呀,比如这个例子:


>>> s='abc'

>>> s

'abc'

>>> s='bcd'

>>> s

'bcd'


这看起来像是字符串可变,但事实上s没有被改变,实际上在Python内部自动为你创建了一个新的字符串而已,大家注意这2个语句是赋值语句,是后者覆盖了前者,没全理解没关系,我们接着来看下一个例子:


>>> foo='bar'

>>> ba='hanging on in ' + foo

>>> ba

'hanging on in bar'


目前看没什么问题,我们都可以理解,下面我修改foo的值,在输出ba的值:


>>> foo='spam'

>>> ba

'hanging on in bar'


结果跟你想的一样吗?是不有人说,应该输出"hanging on in spam”才对呀,因为我重新给foo赋值了呀, 抱歉,即使你跟foo重新赋了值,但ba的值仍然不变,因为ba是一个新的字符串,这就是字符串的不变性,它一旦被创建就不再改变,懂了么?

关于字符不变性我们就说到这里,接下来我们开始了解一些字符串内建操作函数,因为字符串内建函数非常的多,我不可能全部写出来,所以就挑了一些相对比较常用的来说了:

1、len():这个最简单,统计字符串长度的(包括空格),一般用于我们条件判断中,比如我们看下ba的长度:

>>> len(ba)

17


2、strip():这个函数用来去掉字符串左右空格,这个函数比较有用,一般我们从文本中读出来的字符都要先strip(),确保它没带特殊字符,除了strip(),还有lstrip(),rstrip(),就是去掉字符串的左空格和有空格,如下:


>>> s=' abc '

>>> s.lstrip()

'abc '

>>> s.rstrip()

' abc'

>>> s.strip()

'abc'


3、join(seq):这个函数用来把一个序列的元素合并成一个新的字符串,比如我们要将一个列表中的元素合并成一个字符串,关于列表数据类型我们下篇会说,例子如下:


>>> l = ['a', 'b', 'c']

>>> ''.join(l)

'abc'

>>> '#'.join(l)

'a#b#c'


4、split(seq,num):这个函数用来把字符串分割成一个列表,其中seq是分隔符,num是分割的次数(可省),例如:


>>> s='a b c d e f'

>>> s.split(' ')

['a', 'b', 'c', 'd', 'e', 'f']


5、replace(s1,s2,num): 这个函数需要三个参数,num参数非必须,s1将会替换成s2, 这个在做字符串替换时非常有用,例如:


>>> s='aabbccdd'

>>> s.replace('aa', 'ff')

'ffbbccdd'


6、encode(encoding,errors):字符串的编码,这个函数让我们轻松应对字符串的编码问题,其中encoding可以有很多中,例如常见的有gb2312,gbk, gb18030, bz2, zlib, big5, bzse64等,一般常用场景就是在写入文件之前统一将字符串编码格式进行转换为utf-8类型,然后写入文件中:


>>> s.encode('utf8')

'aabbccdd'


7、startswith(s,start,end):这个函数判断字符串的开头是否以s开始,如果是返回True,否则返回False,记住这个函数返回的是一个bool值,不是返回字符串,你要实现类似shell中的grep功能,就需要自己加个判断,然后print输出,例如:


>>> if s.startswith('a'):

...     print s

... 

aabbccdd


相对于startswith的还有endswith,用法基本类似,就不在举例了。

关于字符串的内建函数部门就暂时说这么多吧,后续如果有用到其它函数我们单独在说,最后我再强调一下,python中字符串对象是不可改变的,我们一旦创建一个字符串后,我们在上面用任何函数的改变都会返回一个新的字符串,原串并没有变,所以在日后的编程中请大家要注意这一点。