首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >《Python完全自学教程》免费在线连载4.2.2

《Python完全自学教程》免费在线连载4.2.2

作者头像
老齐
发布2022-04-01 10:04:59
发布2022-04-01 10:04:59
72400
代码可运行
举报
文章被收录于专栏:老齐教室老齐教室
运行总次数:0
代码可运行

4.2.2 转义符

如果在交互模式中这样输入:

代码语言:javascript
代码运行次数:0
运行
复制
>>> print('what's your name?')
  File "<stdin>", line 1
    print('what's your name?')
                ^
SyntaxError: invalid syntax

出现了 SyntaxError(语法错误)引导的提示, SyntaxError 是一种错误类型(参阅第10章10.1节),其后的内容是对此错误的解释:“invalid syntax”(无效的语法)。

产生错误的原因是 'what's your name?' 中出现了三个“单引号”。如果学过英语者理解此字符串,第二个“引号”(“what's”)是“ what is ”的缩写,不是构成字符串的引号的组成部分。但是,Python 解释器无法分辨。解决此错误的方法之一是使用双引号和单引号的嵌套。

代码语言:javascript
代码运行次数:0
运行
复制
>>> print("what's your name?")
what's your name?

用双引号来包裹,双引号里面允许出现单引号。其实,反过来,单引号里面也可以包裹双引号。

代码语言:javascript
代码运行次数:0
运行
复制
>>> print('you are learning "Python Book"')
you are learning "Python Book"

此外,还有一种解决方法:使用转义符( Escape Character )。

代码语言:javascript
代码运行次数:0
运行
复制
>>> print('what\'s your name?')                # (8)
what's your name?
>>> print("you are learning \"Pthon Book\"")   # (9)
you are learning "Pthon Book"

注释(8)中第二个“引号”前面增加了反斜杠( \ ),就得到了想要的输出结果。此处所用的反斜杠( \ )就是转义符,它的作用是使后面的“引号”(')不再具有其单独出现的语义。注释(9)中则用转义符分别使两个双引号(") 不再具有其单独出现的语义。

以上是转义符的一个作用,它的另外一个作用是表示无法从键盘录入的字符,比如换行符——除非用4.2.1节中的注释(5)所定义的“多行字符串”。

代码语言:javascript
代码运行次数:0
运行
复制
>>> poem
'我住长江头,\n君住长江尾。'
>>> print(poem)
我住长江头,
君住长江尾。

在返回的字符串中出现了一个 \n ,它就是换行符。如果不用“多行字符串”,可以这么做:

代码语言:javascript
代码运行次数:0
运行
复制
>>> poem2 = "日日思君不见君,\n共饮长江水。"
>>> print(poem2)
日日思君不见君,
共饮长江水。

此处在定义字符串 poem2 时并未使用“三引号”,只是在其中增加了回车符( \n),print(poem2) 的输出结果中就在 \n 的位置换行。表4-2-1中列出了 Python 中常用的转义字符及其说明,供应用时查阅。

表4-2-1 转义字符

转义字符

描述

\

(在行尾时)续行符,即一行未完,转下一行

\

反斜杠符号

\'

单引号

\"

双引号

\a

响铃

\b

退格(Backspace)

\e

转义

\000

\n

换行

\v

纵向制表符

\t

横向制表符

\r

回车

\f

换页

\yyy

八进制数。yy y代表的字符,例如:012 代表换行

\xyy

十六进制数。yy 代表的字符,例如:0a 代表换行

\other

其他的字符以普通格式输出

建议读者在交互模式中测试上述转义符的显示效果。

对于使用 Windows 系统的读者特别要注意,在此操作系统中,文件和目录的路径写法与类 Unix 系统不同。

代码语言:javascript
代码运行次数:0
运行
复制
# 以下是 MacOS 系统的路径,Linux与此一致

/Users/qiwsir/Documents

# 以下是 Windows 系统的路径

C:\new_books\python

如果在 Python 中建立 Windows 路径的字符串:

代码语言:javascript
代码运行次数:0
运行
复制
>>> pth = 'c:\new_books\python'    # (10)
>>> print(pth)
c:
ew_books\python

print(pth) 的结果则是被分割为两行,且路径名称有误,这是因为注释(10)的字符串中,Python 解释器将其中的 \n 作为“换行”转义符了。为此,修改为:

代码语言:javascript
代码运行次数:0
运行
复制
>>> pth = 'c:\\new_books\python'    # (11)
>>> print(pth)
c:\new_books\python

比较注释(11)和(10)的差异,在(11)中用转义符 \ 将其后的 \n 符号“转义”,令其不再具有表4-2-1中的含义。

此外,还有一种方法:

代码语言:javascript
代码运行次数:0
运行
复制
>>> pth = r'c:\new_books\python'    # (12)
>>> print(pth)
c:\new_books\python
>>> pth
'c:\\new_books\\python'
>>> type(pth)
<class 'str'>

注释(12)中以字母 r 作为字符串的前缀,这样所定义的对象称为原始字符串( raw string )——依然是字符串类型。对字符串的引号所包裹着的内容,常称为字面量( literal )。前缀 r 的作用效果就是自动在字面量中的 \ 符号前面再添加 \ 符号,从而达到令字面量中的 \ 符号转义之目的。

但是,原始字符串并非总能实现上面的效果,例如:

代码语言:javascript
代码运行次数:0
运行
复制
>>> pth = r'c:\new_books\python\'    # (13)
  File "<stdin>", line 1
    pth = r'c:\new_books\python\'
                                 ^
SyntaxError: EOL while scanning string literal

在报错信息中出现的 EOL ,完整表述为“ End of Line ”,即行结尾处出现了错误。后面还有一个状语 while scanning string literal ,即告诉我们 Python 解释器在“扫描”字符串字面量时,结尾处有错误。有点疑惑!?

从注释(13)的创建来看,其字符串字面量是“ c:\new_books\python\ ”,结尾处的 \ 符号是这个 Windows 路径的组成部分。但是,当写成注释(13)那样的时候,Python 解释器会把“ \' ”组合起来视为表4-2-1中所示的单引号,且是字面量的组成部分。这样,作为字符串的标志的单引号就少了一半,于是出现了 SyntaxError 异常。类似于:

代码语言:javascript
代码运行次数:0
运行
复制
>>> p = 'python
  File "<stdin>", line 1
    p = 'python
               ^
SyntaxError: EOL while scanning string literal

因此,官方网站的文档中特别提示:Specifically, a raw literal cannot end in a single backslash (since the backslash would escape the following quote character).

如何修改?

代码语言:javascript
代码运行次数:0
运行
复制
>>> pth = 'c:\\new_books\\python\\'        # (14)
>>> print(pth)
c:\new_books\python\
>>> pth = r'c:\new_books\python' + '\\'    # (15)
>>> pth
'c:\\new_books\\python\\'
>>> print(pth)
c:\new_books\python\

注释(14)没有使用原始字符串,毫无疑问可以打印得到字符串字面量;注释(15)中则是原始字符串和字符串“相加”,也得到了同样效果——虽然解决了前面的报错,但是又出现了“字符串相加”这样一个令人迷茫的操作,正可谓“才下眉头,却上心头”。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老齐教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 4.2.2 转义符
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档