4. 数据类型 —— 字符串

字符串属于标量存储、不可改变、顺序访问的数据类型。字符串属于序列的一种,因此对字符串可行的序列操作对类似元组和列表同样适用。

1. 字符串的创建

类似于数字类型的创建,直接将字符串赋值给变量即可创建一个新的字符串对象。

>>> a = 'string'                # 使用单引号
>>> a = "string"                # 使用双引号,在 Python 中,单引号和双引号没有区别
>>> a = '''
... a
... string 
... block '''                   # 使用三引号,字符串块(三引号在某些情况下可以起到注释掉不需要执行的代码的作用)
>>> a
'\na\nstring\nblock '
>>> a = ''
''                              # 空字符

对变量重新赋值一个新的字符串即可 “ 更新 ” 变量

>>> a = 'string1'
>>> a
'string1'
>>> a = 'string2'
>>> a
'string2'

2. 转义字符

一个反斜线加一个单一字符,可以表示一些通常情况下不可打印的字符,这种组合称为转义字符。

>>> a = 'string1\nstring2'                # \n 代表换行符,虽然由两个字符组成,但在最终表示中会被一个单一字符替代
>>> print a
string1
string2

常用的转义字符包括:

转义字符 代表含义
\n 换行
\t 横向制表符(tab)
\\ 反斜线( \ )
' 单引号
" 双引号
\u 后跟四位十六进制数,表示 Unicode 字符串

当我们不需要对字符进行转义时,可以使用原始字符串操作符 raw 字符串。在原始字符串中,所有的字符都是直接按照输入的字符来使用,没有转义或不能打印的字符。使用 raw 只需要在字符串前加 r/R 即可。

>>> a = r'string1\nstring2'
>>> print a
string1\nstring2                # 输出的结果和输入一样,没有进行转义
>>> a
'string1\\nstring2'             # Python 自身在显示 '\' 时也会使用转义字符 '\\'
  • 注:在交互模式下 print a 和直接显示 a 的区别:使用 print 可以显示变量格式化以后的显示效果,而直接输入变量名则会显示变量的值在 Python 内部的表示形式。

3. Unicode 字符串

如果需要使用 Unicode 字符串时,可以在字符串前加 u/U 即可使用 Unicode 字符串

>>> a = u'abc'
>>> a
u'abc'
>>> a = u'\u1234'                 # 使用 \u 转义字符,\u 后为十六进制
>>> print a
ሴ

4. 基本操作(适用于所有序列对象)

  • 比较操作

    字符串进行比较操作时按照在 ASCII 或 Unicode 中的数值大小进行比较

  • 连接操作

    可以使用 ' +' 操作符对字符串进行连接

a = 'a'
b = 'b'
a + b
'ab'
```

  • 重复操作

    使用 '*' 操作符将字符串重复 N 次

a = 'a'
a * 7
'aaaaaaa'
```

  • 成员操作

    in / not in 可以用于判断一个字符或字符串是否出现在另一个字符串中

'ab' in 'abcd'
True
'ac' in 'abcd'
a = 'string1'
>>> a
'string1'
>>> a = 'string2'
>>> a
'string2'
### 2. 转义字符 一个反斜线加一个单一字符,可以表示一些通常情况下不可打印的字符,这种组合称为转义字符。
>>> a = 'string1\nstring2' # \n 代表换行符,虽然由两个字符组成,但在最终表示中会被一个单一字符替代
>>> print a
string1
string2
常用的转义字符包括: | 转义字符 | 代表含义 | | ------------ | ------------ | | \n | 换行 | | \t | 横向制表符(tab)| | \\\ | 反斜线( \ )| | \' | 单引号 | | \" | 双引号 | | \u | 后跟四位十六进制数,表示 Unicode 字符串 | 当我们不需要对字符进行转义时,可以使用原始字符串操作符 raw 字符串。在原始字符串中,所有的字符都是直接按照输入的字符来使用,没有转义或不能打印的字符。使用 raw 只需要在字符串前加 r/R 即可。
>>> a = r'string1\nstring2'
>>> print a
string1\nstring2 # 输出的结果和输入一样,没有进行转义
>>> a
'string1\nstring2' # Python 自身在显示 '' 时也会使用转义字符 '\'
- 注:在交互模式下 `print a` 和直接显示 `a` 的区别:使用 `print` 可以显示变量格式化以后的显示效果,而直接输入变量名则会显示变量的值在 Python 内部的表示形式。 ### 3. Unicode 字符串 如果需要使用 Unicode 字符串时,可以在字符串前加 u/U 即可使用 Unicode 字符串
>>> a = u'abc'
>>> a
u'abc'
>>> a = u'\u1234' # 使用 \u 转义字符,\u 后为十六进制
>>> print a

### 4. 基本操作(适用于所有序列对象) - 比较操作 字符串进行比较操作时按照在 ASCII 或 Unicode 中的数值大小进行比较 - 连接操作 可以使用 ' +' 操作符对字符串进行连接
>>> a = 'a'
>>> b = 'b'
>>> a + b
'ab'
- 重复操作 使用 '*' 操作符将字符串重复 N 次
>>> a = 'a'
>>> a * 7
'aaaaaaa'
- 成员操作 in / not in 可以用于判断一个字符或字符串是否出现在另一个字符串中
>>> 'ab' in 'abcd'
True
>>> 'ac' in 'abcd'
False
'ac' not in 'abcd'
True
```

5. 索引和切片(适用于所有的列表和对象)

序列对象从 0 开始进行索引,通过指定元素索引或切片对序列对象中的元素进行访问,语法如下:squence[index]

>>> a = 'string'
>>> a[0]
's'                                  # 序列的索引从 0 开始
>>> a[5]
'g'                                  # 序列索引的最大值比序列的长度小 1 

除此之外,还可以使用 负索引,范围是 -1 到序列的负长度。正负索引的区别在于正索引以序列的开始为起点( 0 ),负索引以序列的结束为起点( -1 )。负索引 + 序列长度 = 正索引

>>> a[-1]
'g'                                  # 负索引从 -1 开始
>>> a[-6]
'a'                                  # 负索引的最大值是序列的负长度,正索引的最大值是长度 len(squence) - 1

如果在访问序列的索引越界会引发一个异常:

>>> a[6]                                      # 正索引的最大值应该是长度 - 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range

通过索引可以访问指定偏移量的某一个元素,而切片操作则可用来访问序列中指定的多个元素。切片操作只需要给出切片的开始和结束的索引值,中间用 ' : ' 分隔开即可: squence [ start_index : end_index ]

>>> a[1:3]
'tr'                            # 切片会截取从起始索引到结束索引,但不包括结束索引
>>> a[:3]
'str'                           # 如果不指定起始索引,默认为序列的开始
>>> a[1:]     
'tring'                         # 如果不指定结束索引,默认到序列的结束
>>> a[:]
'string'                        # 需要指出的是,所有字符串的操作都相当于创建了一个新的字符串,通过这种方法可以对字符串进行拷贝
>>> a[1:-1]
 'trin'                         # 在切片中同样可以使用负索引

切片操作还有第三个参数,起到类似步长的作用。不指定时默认为 1

>>> a[::2]
'srn'
>>> a[::-1]
'gnirts'                        # 可以通过这样来获得一个序列的倒序

切片不同于索引,不存在越界引起的异常

>>> a[-100:100]
'string'                        # 在切片中当起始或结束索引越界会使用默认值

在切片中使用 None

>>> a[:0]
''                              # 在结束索引使用 0 时会返回空字符串
>>> a[:None]
'string'                        # 使用 None 则会返回整个字符串
>>> a[None:]
'string'                        
>>> a[None:None]
'string'

6. 序列的一些内建函数

对序列对象有一些通用且常用的内建函数:

  • len():返回序列中元素的长度
>>> len(a)
6                               # 返回字符串的长度
  • max()min():返回序列中的最大值和最小值
>>> max(a)
't'                             # 返回字符串元素中的最大值
>>> min(a)
'g'                             # 返回字符串元素中的最小值
  • sorted():对序列中的对象进行排序
>>> sorted(a)
['g', 'i', 'n', 'r', 's', 't']
  • reversed():对列表中的所有元素反序输出
>>> for  i in reversed(a):
...    print i,
g n i r t s
  • enumerate():生成一个 enumerate 对象,该对象为每个元素的索引和值组成的元组
>>> for i in enumerate(a):
...     print i
...
(0, 's')
(1, 't')
(2, 'r')
(3, 'i')
(4, 'n')
(5, 'g')
  • zip():接受两个序列参数,生成一个列表,列表中的元素分别为由两个参数按顺序的两个元素所组成的元组
>>> zip(a, a)
[('s', 's'), ('t', 't'), ('r', 'r'), ('i', 'i'), ('n', 'n'), ('g', 'g')]

7. 字符串类型函数

  • raw_input():可以使用给定的字符串提示用户输入并将输入返回赋值给变量。
>>> a = raw_input("Please input something: ")    # 函数接受的字符串参数即为输出在屏幕上提示用户输入的字符串
Please input something: string                   # 输入字符串:string
>>>
>>> print a                                      # 上边的输入 string 已经赋值给变量 a
string
  • chr()unichr():chr 接受一个ASCII 码,即 0-255 之间的整数,返回对应的字符。unichr 则接受一个 Unicode 码,返回对应的 Unicode 字符

  • ord():ord 作为 chr 和 unichr 的对应函数,返回一个字符的 ASCII 或 Unicode 数值

>>> chr(97)
'a'                                        # 接受一个 0-255 的整数,返回对应的ASCII 字符
>>> unichr(1234)
u'\u04d2'                                  # 接受一个 0-65535 的整数,返回对应的Unicode 码
>>> print unichr(1234)
Ӓ
>>> ord('a')
97                                         # 接受一个 ASCII 字符,返回对应的数值
>>> ord(u'\u04d2')
1234                                       # 接受一个 Unicode 字符,返回对应的数值
  • str()unicode():将参数转换为字符串或 unicode 字符串
>>> str(123)
'123'                                      # 将数字 123 转换为字符串
>>> unicode(123)
u'123'                                     # 将数字转换为 unicode 字符串

8. 字符串内建函数

  • string.strip():删除 sting 字符串开头和末尾的空格

a = '\tstring\n'
a.strip()
'string' # 将字符串前后空格都删除,lstrip() 和 rstrip() 分别删除开头和结尾的空格
```

  • string.split(str):以 str 为分隔符将字符串进行分隔

a = 's t r i n g'
a.split(' ')
['s', 't', 'r', 'i', 'n', 'g'] # 以空格为分隔符将字符串进行分隔
```

  • string.join(seq):以 string 为分隔符,将 seq 中的所有元素合并为一个新的字符串

a = ['s', 't', 'r', 'i', 'n', 'g']
' '.join(a)

>>> print a # 上边的输入 string 已经赋值给变量 a
string
- __chr()__ 和 __unichr()__:chr 接受一个ASCII 码,即 0-255 之间的整数,返回对应的字符。unichr 则接受一个 Unicode 码,返回对应的 Unicode 字符 - __ord()__:ord 作为 chr 和 unichr 的对应函数,返回一个字符的 ASCII 或 Unicode 数值
>>> chr(97)
'a' # 接受一个 0-255 的整数,返回对应的ASCII 字符
>>> unichr(1234)
u'\u04d2' # 接受一个 0-65535 的整数,返回对应的Unicode 码
>>> print unichr(1234)
Ӓ
>>> ord('a')
97 # 接受一个 ASCII 字符,返回对应的数值
>>> ord(u'\u04d2')
1234 # 接受一个 Unicode 字符,返回对应的数值
- __str()__ 和 __unicode()__:将参数转换为字符串或 unicode 字符串
>>> str(123)
'123' # 将数字 123 转换为字符串
>>> unicode(123)
u'123' # 将数字转换为 unicode 字符串
### 8. 字符串内建函数 - __string.strip()__:删除 sting 字符串开头和末尾的空格
>>> a = '\tstring\n'
>>> a.strip()
'string' # 将字符串前后空格都删除,lstrip() 和 rstrip() 分别删除开头和结尾的空格
- __string.split(str)__:以 str 为分隔符将字符串进行分隔
>>> a = 's t r i n g'
>>> a.split(' ')
['s', 't', 'r', 'i', 'n', 'g'] # 以空格为分隔符将字符串进行分隔
- __string.join(seq)__:以 string 为分隔符,将 seq 中的所有元素合并为一个新的字符串
>>> a = ['s', 't', 'r', 'i', 'n', 'g']
>>> ' '.join(a)
's t r i n g' # 用空格将 a 中的元素合并成新的字符串
''.join(a)
'string' # 当不指定 string 时,直接合并
```

  • string.find(sr):检测 str 是否在字符串中,如果时返回索引,否则返回 -1

a = 'strings'
a.find('s')
0 # 结果总是返回第一个找到的索引
a.find('a')
-1 # 没有找到时返回 -1
```

  • string.index(str):与 find 类似,但不存在时引发一个异常

a = 'strings'
a.index('s')
0 # 同样返回第一个 str 的索引
a.index('a') # 与 find 不同,str 不存在时引发一个异常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found
```

  • string.count(str):返回 str 在字符串中出现的次数

a = 'strings'
a.count('s')
2
```

  • string.upper()string.lower():分别将字符串字符转换为大写和小写
>>> a = 'String123'
>>> a.upper()
'STRING123'                             # 将字符串 a 中的所有字母大写,非字母不变
>>> a.lower()
'string123'                             # 将字符串 a 中的所有字母小写,非字母不变
  • string.partition(str):find() 和 split() 的结合,从 str 出现的第一个位置起,将 string 分成三元组 (string_pre_str, str, string_post_str), 如果不包含 str,string_pre_str = string

a = 'string'
a.partition('r')
('st', 'r', 'ing')
a.partition('a')
('string', '', '')
```

  • string.replace(str1,str2) :把 str1 替换为 str2

a = 'strings'
a.replace('s', 'x')
'xtringx' # 把 string 中所有的 str1 替换为 str2,可以指定替换的次数参数
a.replace('a', 'x')
'string' # string 中不包含 str1 时,不做任何操作
```

更多关于字符串的内建函数参考:String Method

9.字符串格式化

Python 中的字符串格式化操作,类似于 C 语言中的 printf() 函数的字符串格式化,语法如下:

  1. 在 % 操作符的左侧放置一个需要进行格式化的字符串,这个字符串带有一个或多个嵌入的转换目标,都以 % 开头。

  2. 在 % 操作符的右侧放置一个或多个(元组)对象,这些对象会插入到左侧需要进行格式化的一个或多个转换目标的位置上去。

>>> "That is %d %s bird!" % (1, 'little')
That is 1 little bird!

在上边这个例子中,整数 1 替换在格式化字符串左侧的 %d, 字符串 'little' 替换 %s,从而得到一个新的格式化了的字符串。

如果不使用格式化字符串,我们可以使用多次字符串的合并和转换来达到目的,但十分麻烦。

>>> "That is " + str(1) + " little " "bird !"
That is 1 little bird!

通常根据需要转换的目标不同,左侧 % 操作符后边的符号也不相同,常见的格式化代码如下

代码 意义
%s 字符串
%r 使用 repr 的字符串
%d 十进制整数
%i 整数
%f 浮点十进制数

从高级的应用来说,表达式左侧的转换目标有一套完整的语法:

     `%[(name)][flag][width][.precision]typecode`

上表中的字符码出现在目标字符串的尾部,在 % 和字符码之间,可以有以下操作:

  • 放置一个字典的键 [(name)]
  • 列出左对齐 -、正号 + 和补零 0 的标志位 [flag]
  • 给出数字的整体长度和小数点后的位数等 [width] [.precision]
>>> "***%d***%-6d***%06d***%+d***" % (123, 123, 123, 123)
'***123***123   ***000123***+123***'                           # %-6d 表示左对齐,%06d 表示补零
>>> "***%.2f***" % (123.456)
***123.46***                                                    # %.2f 表示保留浮点数小数点后2位
>>> "That is %(number)d little %(name)s !" % {'number':1, 'name':'bird'}
That is 1 little bird !                                         # 使用字典进行格式化

format() 方法:在 Python 2.6 和 3.0 以后的版本引入了一种新的格式化方法,format() 函数

>>> "That is {0} little {1} !".format(1, 'bird')
That is 1 little bird !
  • 格式化总是会返回新的字符串作为结果而不是对左侧的字符串进行修改,如果需要的话,必须将格式化字符串赋值给一个变量来保存结果。

  • 更多关于字符串格式化的参考:String format

更多关于字符串的参考:Sequence Type

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容