Python 中的字符串,是门大学问。

 
   

Python 中的字符串,是门大学问。_第1张图片

 
   
公众号后台回复“图书“,了解更多号主新书内容

     作者:Rocky0429

     来源:Python空间

上一篇文章中讲了 Python 数据类型中的数字类型,这篇文章轮到数据类型中另一重磅 - 字符串(String)。

话不多说,直接开始,内容有点多,要慢慢食用。

Python 中的字符串,是门大学问。_第2张图片

f2ced484f39d25c3903fdc4081312c9f.png

认识字符串

字符串官方的说法是:

字符串是由零个或者多个字符组成的有限串。

看着说的挺洋气的,说白了就是一堆的字符。我们和编程爱情的开始“Hello World” 就是一个字符串。

字符串不止有字母,不管是中文还是英文或者空格等特殊字符都可以作为字符串来看待。

在 Python 中,字符串类型用 str 表示,用英文的单引号或双引号括起来。

>>> 'good good study'
'good good study'
>>> "day day up"
'day day up'

上篇文章中讲过,数字可以有变量指向它,作为和数字类型一样,同属于数据类型的字符串当然也可以。

>>> string = 'Hello World'
>>> string
'Hello World'
>>> print(string)
Hello World

字符串连接

如果我有两个字符串,分别是 'Hello' 和 'World',那么我想得到 'Hello World' 要怎么做呢?

这里用到字符串的连接。

Python 里提供了特别简单的办法,那就是相加,就是加减乘除的那个加。

>>> a = 'Hello'
>>> b = 'World'
>>> a + b
'HelloWorld'
>>> a + ' ' + b
'Hello World'

不过这也是有限制的:相加的只能是同种类型的。比如字符串和字符串相加、数字和数字相加。

这里再多补充一点,字符串除了加以外,还可以用乘。

>>> string = 'Python'
>>> string * 3
'PythonPythonPython'

至于减和除,没有。

转义&不转义字符

转义字符

首先我们先来看一个例子:

>>> 'what's your name'
 File "", line 1
   'what's your name'
         ^
SyntaxError: invalid syntax

输出结果报错,为啥呢?

这是因为第一行字符串里有三个单引号,解释器懵圈了,不知道哪两个单引号是一对,只好报个错装死。

出现这种问题咋解决呢?有两种解决办法。

第一种:用双引号包裹整个字符串。

>>> "what's your name"
"what's your name"

第二种:就是用标题里所说的“转义字符”。

>>> 'what\'s your name'
"what's your name"

上面加了个反斜杠就解决了问题,’\'‘ 意思就是单引号的意思。

那通过上面,我们知道转义字符是不采用符号本身的含义,而采用的是一种规定好的含义。

下面是图中是常用的转义字符。

Python 中的字符串,是门大学问。_第3张图片

转义字符好用,但是对于那些失去了自身意义的字符来说,也挺惨,都没法当自己。

那它们怎么才能当自己呢?那就是想办法当个不转义字符。

不转义字符

为了迎合上个标题,将这个标题取为不转义字符有点不恰当,更恰当的应该是当自己 - 原始字符。

在上面常用的转义字符中,'\n' 是换行的意思。

>>> string = "c:\now"
>>> print(string)
c:
ow

人家 '\n' 就只想当 '\n',不想当换行,咋整?

简单,在 Python 的串串前面,加个 'r' 字母:

>>> print(r'c:\now')
c:\now

操作字符串

在 Python 中,操作字符串常用两种,第一种是索引+切片,第二种是字符串函数。


索引 + 切片

首先来说索引。

索引看起来洋气的名字,说白了就是编号,就像考试有名次一样,这个是所有编程语言都有的。

>>> string = 'I love Python'
>>> string[0]
'I'
>>> string[5]
'e'

Python 中的索引和现实中的排名稍微区别点的是,它是从 0 开始的。要想得到第一个字符,就用 string[0],以后依次类推。

还记得我上面说过的空格等特殊的也是字符,所以它们也是有编号的,这是正向的表示。

在 Python 中,字符串的索引还可以倒着表示,从最后一个开始 分别是 -1,-2,-3,.....

>>> string = 'I love Python'
>>> string[-1]
'n'
>>> string[-2]
'o'

通过索引可以一个一个的索出字符,那我想找其中的一个子串怎么办?

这时候我们的切片就闪亮登场了,直接切!

我想要 love 这个子串:

>>> string = 'I love Python'
>>> string[2:6]
'love'

在 Python 中,切片的作用区间是是左闭右开的,string 字符串中,l 的索引是 2,e 的索引是 5,所以想切出 love 子串,需要 string[2:6],即[2, 6)。

这里还有一点要说的是,字符串的切片对原字符串没有影响,不会改变它

除了这个以外,切片的操作还有很多姿势,可以切的多姿多彩。

>>> string = 'I love Python'
>>> a = string[3:]  #得到从3号到最后的字符串
>>> a
'ove Python'
>>> b = string[:8] #得到从第1个字符到第7个字符
>>> b
'I love P'
>>> c = string[:] #得到所有的字符
>>> c
'I love Python'

当然,上面这些只是其中的一点点,更多切片解锁自己去摸索一下,成就感的不要不要的。

字符串函数

字符串里的方法有很多,这里仅仅列举几个常用的。

find()

检测字符串是否包含特定字符,如果包含,则返回开始的索引;否则,返回-1。

index()

检测字符串是否包含指定字符,如果包含,则返回开始的索引值,否则,提示错误。

count(str1,start,end)

返回str1在string中指定索引范围内[start, end)出现的次数。

replace(str1,count)

将str1中的str1替换成str2,如果指定count,则不超过count次。

split('分界符',maxsplit)

maxSplit默认值为-1,表示根据定界符分割所有能分割的,返回值为列表,如果 maxsplit有指定值,则仅分割 maxsplit 个子字符串。

strip()

去掉字符串左右两边的空白字符。

>>> string = 'i love python'
>>> string.find('ov') #检查 str 是否在 string 里面
3
>>> string.index('l')
2
>>> string.count('i',0,5)
1

我这里就随便写了前三个,当然字符串的方法不只这些,可以通过 dir(str) 查看。

>>> dir(str)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_s
ubclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__
subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifie
r', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip
', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

这些函数在交互模式里很好实现,具体想使用哪个,可以用 help() 函数查看,比如查看 split() 函数。

>>> help(str.split)
Help on method_descriptor:


split(self, /, sep=None, maxsplit=-1)
    Return a list of the words in the string, using sep as the delimiter string.


    sep
      The delimiter according which to split the string.
      None (the default value) means split according to any whitespace,
      and discard empty strings from the result.
    maxsplit
-- More  --

如果没事的话可以随时看几个。

在交互模式里按照我上面的样子自己动手试试,这样在用到某个方法的时候才能想起来有,否则的话再自己去写很多代码去实现本身就存在的方法,很是浪费时间。

字符串输出

操作字符串必然伴随着字符串的输出。

在实际项目中,对于字符串的输出肯定不是随随便便,必然模板式的输出,这就涉及到了字符串的格式化。

字符串的格式化是先定义一个模板,然后在这个模板的一处或者几处地方留出空位来,然后在那些空位上填上符合设定条件的字符串,并显示结果。

我们来看一个例子:

>>> 'I love %s'
'I love %s'
>>> 'I love %s' %'Python'
'I love Python'

上面的 '%s' 就是我说的空位,专业术语叫占位符

这种方法是原先很常用的一种方法,现在用的更多的是 format() 方法,下面我来展示具体的用法:

>>> 'I love {0} and {1}'.format('C++','Python')
'I love C++ and Python'

在 format 里面 {0},{1} 就成了占位符,然后不要忘了字符串和 format 中间那个很重要的英文句号。

这里只是简单的介绍了一下,更多关于字符串格式化,可以看我之前写过的一篇文章。

Python 格式化字符串,这个方法真的即丝滑又舒服!

字符编码

字符编码是我们在实际操作中必然会遇到的一个坑,在我一开始的打算中是不准备写这个知识点的,但是我怕小可爱们在之后遇到的时候不知道是什么,而且它又是那么的重要。

字符编码不只是计算机中的一个基础知识,而且还是一个有历史过程的事情。

编码

要讲字符编码,首先我们要从编码开始谈起。

编码这个东西如果单说具体的定义的话可能很难理解,下面我用一个例子解释一下:

大家应该都看过战争片,一般要强攻的时候,长官下令冲锋,然后就有一个小兵拿起小喇叭吹冲锋号,这里其实就是一次编码

Python 中的字符串,是门大学问。_第4张图片

长官下达冲锋命令,小兵将这个命令编码为冲锋号“嘟嘟嘟嘟”的声音,然后声音在空气中传播,士兵们听到之后一般都会知道这是冲锋的意思,不会听成是打呼噜的声音。

长官下达的命令你可能离着远了听不清啥意思,但是一听冲锋号吹起来,接受过训练的人就知道这是要冲锋的意思,不会理解错意思,这也是编码的优势所在。

这里要说的是士兵接收到进攻命令,这叫做解码,解码完毕后士兵们明白了,然后才行动。

当然以上过程说的很简单,真实的编码和解码过程肯定比这个复杂的多,但是总的原理,其实就是这么个意思。

字符编码

编码我们说完了,那我们再来说说什么是字符编码。

我们都知道计算机只能处理数字 ,因为电是驱使计算机工作的基本,而电的特征就是高低电平,高电平是 1,低电平是 0

编程的目的是为了让计算机给我们干活,从而实现我们的目的,它说白了就是一堆字符。

一堆字符想要驱使计算机干活,而计算机又只能处理数字,所以说这里面涉及到一点,那就是从字符到数字的这么一个过程,这个过程其实就是一个字符如何对应一个特定数字的标准,这个标准就是字符编码

字符编码发展史

计算机的字符编码并不是一蹴而就的,而是有一个发展的过程。

当然这个发展史看起来很无趣,可以直接跳过看下一节。

Python 中的字符串,是门大学问。_第5张图片

1. ASCII 码

20 世纪 60 年代,计算机发明的早期,那时候美国是计算机领域的大爹,于是他们自己制定了一套字符编码,解决了英文和二进制间的对应关系,这个被称为 ASCII 码。

ASCII 码是基于拉丁字母的一套电脑编码系统,主要用于现代英语,因为英语用 128 个字符就够了,但是计算机又不单单只是英语系国家用,如果表示其他语言,128 个字符是远远不够的,于是其他的国家,都是在 ASCII 码的基础上,又发明了很多别的编码。

2. Unicode 码

在编码上,由于出现了很多不同的形式,于是就出现了 “乱码” 。

比如互发邮件的双方,如果使用的编码方式不一样,那么收信人就只能看乱码。于是 Unicode 应运而生,只看它的名字也应该知道,就是要统一符号的编码。

Unicode 对世界上绝大多数的文字系统进行了整理,编码,使得电脑可以用更为简单的方式来呈现和处理文字。它伴随着通用字符集的标准而发展,同时也以书本的形式对外发表。 

Unicode 直到今天仍在不断的增修,每个新版本都加入了更多的字符,它涵盖的数据除了视觉上的字形,编码方法,标准的字符编码外,还包含了诸如大小写字母等的字符特性。

它虽然这么能干,你也要保持清醒,它也不是完美的,仍需继续改进。

3. UTF-8

UTF 就是 Unicode 的实现方式,而 UTF-8 是现在互联网上流传最广的 Unicode 实现方式,虽然它只是 Unicode 实现方式中的一种,但也隐约有武林盟主的地位。

UTF-8 是一种针对 Unicode 的可变长度字符编码,也是一种前缀码,它可以用来表示 Unicode 标准中的任何字符,它也是现在电子邮件,网页以及其他存储或者发送文字的应用优先采用的编码。

所以,我们在以后的 Python 程序开发中,最好都要用 UTF-8 编码。


Python 字符编码

在 Python3 中,所有的字符串都是 Unicode 字符串

如果你想查看一下当前环境的编码格式,可以用 sys 中的 getdefaultencoding() 函数查看。

>>> import sys
>>> sys.getdefaultencoding()
'utf-8'

Python3 支持的是 Unicode,所以每个汉字都对应着一个编码数字。

如果想知道某个汉字对应的编码数字,可以用 ord() 函数。

>>> ord('李')
26446

同样如果你想知道某个数字对应的汉字,可以用 chr() 函数。

>>> chr(26446)
'李'

416ac8c260e6b5e7d9c82e203f54fd8a.png

好啦,Python 字符串到这基本就结束啦,内容很多,建议细看。

如果觉得有帮助的话,记得帮我分享一下,点赞再看的加持是我写作的小马达。

◆ ◆ ◆  ◆ ◆
麟哥新书已经在当当上架了,我写了本书:《拿下Offer-数据分析师求职面试指南》,目前当当正在举行活动,大家可以用相当于原价5折的预购价格购买,还是非常划算的:
 
   
数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。

管理员二维码:


猜你喜欢

● 卧槽!原来爬取B站弹幕这么简单
● 厉害了!麟哥新书登顶京东销量排行榜!
● 笑死人不偿命的知乎沙雕问题排行榜

● 用Python扒出B站那些“惊为天人”的阿婆主!
● 你相信逛B站也能学编程吗

你可能感兴趣的:(字符串,python,编程语言,人工智能,java)