python基础03-字符串操作

上一篇《python基础02-安装、基本语法和数据类型》我们介绍了Python的安装和基本的数字类型,从这篇开始我们学习几个python核心的序列类型,我们先从字符串开始,在开始前我先给大家纠正一个关于编程学习的误区,就是可能很多人认为程序员非常擅长数学,数学不好的人估计很难学好编程,所以有的人还没开始就放弃了,就我个人感觉,在某些领域的编程数学肯定是很重要,但对一般我们日常需求还远没有到离开数学就无法编程的地步,当然这是我的想法,所以为了验证我自己的想法,我特意采访了我们公司大概10几位程序员,他们编程时间最短的2年,最长的大概有10年,其中还有一位数学本科生,他们给出的答案基本相似,包括那位数学专业毕业的同事,说他们现在编程根本用不到什么数学知识,编程内容主要还是处理业务逻辑,所以基本可以看出,学好数学不是学好编程的必要条件,但编程需要逻辑思维,那什么是逻辑思维?说白了就是做事的先后顺序,这个我们每个人都会,比如你有5件事要做,编号从1到5,最简单的一种是你从第一件事开始一个一个做,做完这5件事,但有时候并不能按照我们意愿来,比如你完成了第一件事,突然来个电话,你不得不放弃做现在的事,等接完电话在继续,又或者某件事跟另一件事有某种关联,你不得不完成第三件事才能继续第二件事,总之就是事件完成要有先有后,并能等待某个事件处理完毕后继续进行处理,这就是编程中的逻辑,好吧说了这么多解释这件事就是希望每个人不要轻易放弃,大胆学习编程吧,它没有你想想的难,每个人都可以学会。

上一段我们花了大段篇幅解释了数学和编程的关系,那既然日常编程中碰不到大量的数学问题,那都在处理什么,这就要到我们的正题了,其实大部分程序员编程中很多代码都在处理字符串,在Python中操作字符串非常的方便,让我们开始吧:

1、单引号,双引号,三引号字符串

在Python中我们可能看到对字符串有的人用双引号来括起来,有的用单引号括起来,他们有什么不同吗?答案是它们没有区别,那为什么要用到双引号呢,因为如果一个字符串中已经有单引号了,在最外层就必须要用双引号,否则就会报错,如下:

>>> 'Let's go!'
  File "<stdin>", line 1
    'Let's go!'
         ^
SyntaxError: invalid syntax
>>> "Let's go!" 
"Let's go!"

那三引号的作用是做什么的呢?三引号是用来解决如果一行很长,而且里面又包括一些特殊字符比如换行符等,这时候就用到三引号了,比如:

>>> '''Simple million word count program.
...     main idea is Python pairs words
...     with the number of times
...     that number appears in the triple quoted string.
...     Credit to William J. Turkel and Adam Crymble for the word
...     frequency code used below. I just merged the two ideas.
... '''

2、字符串的转义、拼接、复制

python中的转义最好理解,它跟shell下一样,就是在字符前加\就可以转义一个字符,比如\n就是回车换行,\t就是制表符,如果一个字符串中有单引号或双引号或者\都可以进行转义,如下:

>>> print '\\' 
\
>>> print '\''
'
>>> print '\"'
"

在Python下字符串拼接是用+号符操作的,非常直观,例如:

>>> x = 'hello'
>>> y = ' codepku.com'
>>> z = x + y >>> print z hello codepku.com

字符串的复制也非常简单,可以通过*操作符,例如复制20个#符:

>>> print '#' * 20
####################

3、字符串切片

切片操作是字符串的重要特性,在字符串 后面加入[]就可以提取该位置的单个字符,如果顺序是从左到右,记住第一个字符是从0开始,如果是从右到左从-1开始,如下:

>>> letter = 'continuation'
>>> letter[0]
'c'
>>> letter[-1]
'n'
>>> letter[-2]
'o'
>>> letter[1] 
'o'

除了获取单个字符,我们还可以用更复杂的方式获取一段字符,操作格式是[开始:结束:步长],这三个参数没有严格要求必须同时存在,但如果要获取某段字符至少要有开始或结束,如果都不写就是获取整个字符串内容了,如下:

>>> letter[0:4]  
'cont'
>>> letter[-5:]
'ation'
>>> letter[0:10:2]
'cniut'
>>> letter[:]     
'continuation'

4、字符串格式化

字符串格式化就是对字符输出时处理,类似C语言的 printf()函数,打印出字符,以下是Python格式化符号表:

   符   号

   说     明

     %c

   格式化字符及其ASCII码

     %s

   格式化字符串

     %d

   格式化整数

     %o

   格式化无符号八进制数

     %x

   格式化无符号十六进制数

     %X

   格式化无符号十六进制数(大写)

     %f

   格式化定点数,可指定小数点后的精度

     %e

   用科学计数法格式化定点数

     %E

   作用同%e,用科学计数法格式化定点数

     %g

   根据值的大小决定使用%f活%e

     %G

   作用同%g,根据值的大小决定使用%f或者%E

最简单的格式化例子如下:

>>> letter
'continuation'
>>> print '%s' %letter
continuation

如果要打印指定点数可以用%f,保留小数点后二位,如下:

>>> num = 0.863
>>> print '%.2f' %num  
0.86

从Python2.6版本开始字符串格式化增加了format方法进行格式化,它的格式没有了%,用{}来替代,如下:

>>> '{name},{url}'.format(name='kids',url='codepku.com')     
'kids,codepku.com'
>>> '{name},{url}'.format(url='codepku.com', name='kids')                 
'kids,codepku.com'

用format的好处是后面的参数可以不按顺序,如我们的例子,name在前或在后对输出没有影响,另外还要记住就是在Python2.6的版本{}里的内容不能为空,2.7的版本可以支持为空:

>>> '{},{}'.format('kids', 'codepku.com')             
'kids,codepku.com'

所以有时候你下载一些模块安装不上,如果出现这个format错误,就表示你目前系统的版本比较低,你要做的要么升级当前版本,要么修改下源代码就可以通过,我是之前碰到过几次。


接下来说下字符串的不变性,在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中字符串对象是不可改变的,我们一旦创建一个字符串后,我们在上面用任何函数的改变都会返回一个新的字符串,原串并没有变,所以在日后的编程中请大家要注意这一点。


来源:公众号(python运维技术),经作者授权转载



相关文章