Python基础教程 1.10 字符串

1.10 字符串

前一节的代码"Hello, " + name + "!"是什么意思呢?本章的第一个程序只包含如下代码:

print("Hello, world!")

编程教程通常以类似的程序开篇,问题是我还未全面阐述其工作原理。你已掌握了print语句的基本知识(后面将更详细地介绍它),但"Hello, world!"是什么呢?这是一个字符串(string)。几乎所有真实的Python程序中都有字符串的身影。字符串用途众多,但主要用途是表示一段文本,如感叹句“Hello, world!”。

1.10.1 单引号字符串以及对引号转义

与数一样,字符串也是值:

>>> "Hello, world!"

'Hello, world!'

在这个示例中,有一点可能让你颇感意外: Python在打印字符串时,用单引号将其括起,而我们使用的是双引号。这有什么差别吗?其实没有任何差别。

>>> 'Hello, world!'

'Hello, world!'

这里使用的是单引号,结果却完全相同。既然如此,为何同时支持单引号和双引号呢?因为在有些情况下,这可能会有用。

>>> "Let's go!"

"Let's go!"

>>> '"Hello, world!" she said'

'"Hello, world!" she said'

在上述代码中,第一个字符串包含一个单引号(就这里而言,可能称之为撇号更合适),因此不能用单引号将整个字符串括起,否则解释器将报错(做出这样的反应是正确的)。

>>> 'Let's go!'

SyntaxError: invalid syntax

在这里,字符串为'Let',因此Python不知道如何处理后面的s(更准确地说是当前行余下的内容)。第二个字符串包含双引号,因此必须使用单引号将整个字符串括起,原因和前面一样。实际上,并非必须这样做(这样做只是出于方便考虑)。可使用反斜杠(\)对引号进行转义,如下所示:

>>> 'Let\'s go!'

"Let's go!"

这样Python将明白中间的引号是字符串的一部分,而不是字符串结束的标志。虽然如此,Python打印这个字符串时,还是使用了双引号将其括起。与你预期的一样,对于双引号可采用同

样的处理手法。

>>> "\"Hello, world!\" she said"

'"Hello, world!" she said'

像这样对引号进行转义很有用,且在有些情况下必须这样做。例如,在字符串同时包含单引号和双引号(如'Let\'s say "Hello, world!"')时,如果不使用反斜杠进行转义,该如何办呢?

注意:厌烦了反斜杠?你在本章后面将看到,在大多数情况下,可通过使用长字符串和原始字符串(可结合使用这两种字符串)来避免使用反斜杠。

1.10.2 拼接字符串

为处理前述不太正常的示例,来看另一种表示这个字符串的方式:

>>> "Let's say " '"Hello, world!"'

'Let\'s say "Hello, world!"'

我依次输入了两个字符串,而Python自动将它们拼接起来了(合并为一个字符串)。这种机制用得不多,但有时候很有用。然而,仅当你同时依次输入两个字符串时,这种机制才管用。

>>> x = "Hello, "

>>> y = "world!"

SyntaxError: invalid syntax

换而言之,这是一种输入字符串的特殊方式,而非通用的字符串拼接方法。那么应该如何拼接字符串呢?就像将数相加一样,将它们相加:

>>> "Hello, " + "world!"

'Hello, world!'

>>> x = "Hello, "

>>> y = "world!"

'Hello, world!'

1.10.3 字符串表示 str 和 repr

Python打印所有的字符串时,都用引号将其括起。你可能通过前面的示例发现了这一点。这是因为Python打印值时,保留其在代码中的样子,而不是你希望用户看到的样子。但如果你使用print,结果将不同。

>>> "Hello, world!"

'Hello, world!'

>>> print("Hello, world!")

Hello, world!

如果再加上表示换行符的编码\n,差别将更明显。

>>> "Hello,\nworld!"

'Hello,\nworld!'

>>> print("Hello,\nworld!")

Hello,

world!

通过两种不同的机制将值转换成了字符串。你可通过使用函数str和repr①直接使用这两种机制。使用str能以合理的方式将值转换为用户能够看懂的字符串。例如,尽可能将特殊字符编码转换为相应的字符。然而,使用repr时,通常会获得值的合法Python表达式表示。

>>> print(repr("Hello,\nworld!"))

'Hello,\nworld!'

>>> print(str("Hello,\nworld!"))

Hello,

world!

1.10.4 长字符串、原始字符串和字节

有一些独特而有用的字符串表示方式。例如,有一种独特的语法可用于表示包含换行符或反斜杠的字符串(长字符串和原始字符串)。对于包含特殊符号的字符串, Python 2还提供了一种专用的表示语法,结果为Unicode字符串。这种语法现在依然管用,但是多余,因为在Python 3中,所有的字符串都是Unicode字符串。 Python 3还引入了一种新语法,用于表示大致相当于老式字符串的字节对象。你将看到,在处理Unicode编码方面,这种对象依然扮演着重要的角色。

1. 长字符串

要表示很长的字符串(跨越多行的字符串),可使用三引号(而不是普通引号)。

print('''This is a very long string. It continues here.

And it's not over yet. "Hello, world!"

Still here.''')

还可使用三个双引号,如"""like this"""。请注意,这让解释器能够识别表示字符串开始和结束位置的引号,因此字符串本身可包含单引号和双引号,无需使用反斜杠进行转义。

提示:常规字符串也可横跨多行。只要在行尾加上反斜杠,反斜杠和换行符将被转义,即被忽略。

例如,如果编写如下代码:print("Hello, \ world!")

它将打印Hello, world!。这种处理手法也适用于表达式和语句。

>>> 1 + 2 + \

4 + 5

12

>>> print \

('Hello, world')

Hello, world

2. 原始字符串

原始字符串不以特殊方式处理反斜杠,因此在有些情况下很有用②。在常规字符串中,反斜杠扮演着特殊角色:它对字符进行转义,让你能够在字符串中包含原本无法包含的字符。例如你已经看到可使用\n表示换行符,从而像下面这样在字符串中包含换行符:

>>> print('Hello,\nworld!')

Hello,

world!

这通常挺好,但在有些情况下,并非你想要的结果。如果你要在字符串中包含\n呢?例如,你可能要在字符串中包含DOS路径C:\nowhere。

>>> path = 'C:\nowhere'

'C:\nowhere'

这好像没问题,但如果将其打印出来,就会出现问题。

>>> print(path)

C:

owhere

这并非你想要的结果,不是吗?那该怎么办呢?可对反斜杠本身进行转义。

>>> print('C:\\nowhere')

C:\nowhere

这很好,但对于很长的路径,将需要使用大量的反斜杠。

path = 'C:\\Program Files\\fnord\\foo\\bar\\baz\\frozz\\bozz'

在这样的情况下,原始字符串可派上用场,因为它们根本不会对反斜杠

特殊处理,而是让字符串包含的每个字符都保持原样。

>>> print(r'C:\nowhere')

C:\nowhere

>>> print(r'C:\Program Files\fnord\foo\bar\baz\frozz\bozz')

C:\Program Files\fnord\foo\bar\baz\frozz\bozz

如你所见,原始字符串用前缀r表示。看起来可在原始字符串中包含任何字符,这大致是正确的。一个例外是,引号需要像通常那样进行转义,但这意味着用于执行转义的反斜杠也将包含在最终的字符串中。

>>> print(r'Let\'s go!')

Let\'s go!

另外,原始字符串不能以单个反斜杠结尾。换而言之,原始字符串的最后一个字符不能是反斜杠,除非你对其进行转义(但进行转义时,用于转义的反斜杠也将是字符串的一部分)。根据前一个示例,这一点应该是显而易见的。如果最后一个字符(位于结束引号前面的那个字符)为反斜杠,且未对其进行转义, Python将无法判断字符串是否到此结束。

>>> print(r"This is illegal\")

SyntaxError: EOL while scanning string literal

这合乎情理,但如果要指定以反斜杠结尾的原始字符串(如以反斜杠结尾的DOS路径),该如何办呢?本节介绍了大量技巧,应该能够帮助你解决这个问题,但基本技巧是将反斜杠单独作为一个字符串,下面是一个简单的示例:

>>> print(r'C:\Program Files\foo\bar' '\\')

C:\Program Files\foo\bar\

请注意,指定原始字符串时,可使用单引号或双引号将其括起,还可使用三引号将其括起。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180820G1T9PZ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励