如果在交互模式中这样输入:
>>> 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 解释器无法分辨。解决此错误的方法之一是使用双引号和单引号的嵌套。
>>> print("what's your name?")
what's your name?
用双引号来包裹,双引号里面允许出现单引号。其实,反过来,单引号里面也可以包裹双引号。
>>> print('you are learning "Python Book"')
you are learning "Python Book"
此外,还有一种解决方法:使用转义符( Escape Character )。
>>> 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)所定义的“多行字符串”。
>>> poem
'我住长江头,\n君住长江尾。'
>>> print(poem)
我住长江头,
君住长江尾。
在返回的字符串中出现了一个 \n
,它就是换行符。如果不用“多行字符串”,可以这么做:
>>> 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 系统不同。
# 以下是 MacOS 系统的路径,Linux与此一致
/Users/qiwsir/Documents
# 以下是 Windows 系统的路径
C:\new_books\python
如果在 Python 中建立 Windows 路径的字符串:
>>> pth = 'c:\new_books\python' # (10)
>>> print(pth)
c:
ew_books\python
print(pth)
的结果则是被分割为两行,且路径名称有误,这是因为注释(10)的字符串中,Python 解释器将其中的 \n
作为“换行”转义符了。为此,修改为:
>>> pth = 'c:\\new_books\python' # (11)
>>> print(pth)
c:\new_books\python
比较注释(11)和(10)的差异,在(11)中用转义符 \
将其后的 \n
符号“转义”,令其不再具有表4-2-1中的含义。
此外,还有一种方法:
>>> 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
的作用效果就是自动在字面量中的 \
符号前面再添加 \
符号,从而达到令字面量中的 \
符号转义之目的。
但是,原始字符串并非总能实现上面的效果,例如:
>>> 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
异常。类似于:
>>> 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).
如何修改?
>>> 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)中则是原始字符串和字符串“相加”,也得到了同样效果——虽然解决了前面的报错,但是又出现了“字符串相加”这样一个令人迷茫的操作,正可谓“才下眉头,却上心头”。