《Python完全自学教程》免费在线连载4.2.2
收录于话题 #Python语言 69 个 #python 42 个 4.2.2 转义符
如果在交互模式中这样输入:
>>>print('what'syourname?')File"",line1print('what'syourname?')^SyntaxError:invalidsyntax
出现了 SyntaxError(语法错误)引导的提示, SyntaxError 是一种错误类型(参阅第10章10.1节),其后的内容是对此错误的解释:“invalid syntax”(无效的语法)。
产生错误的原因是 'what's your name?' 中出现了三个“单引号”。如果学过英语者理解此字符串,第二个“引号”(“what's”)是“ what is ”的缩写,不是构成字符串的引号的组成部分。但是,Python 解释器无法分辨。解决此错误的方法之一是使用双引号和单引号的嵌套。
>>>print("what'syourname?")what'syourname?
用双引号来包裹,双引号里面允许出现单引号。其实,反过来,单引号里面也可以包裹双引号。
>>>print('youarelearning"PythonBook"')youarelearning"PythonBook"
此外,还有一种解决方法:使用
转义符
( Escape Character )。
>>>print('what'syourname?')#(8)what'syourname?>>>print("youarelearning"PthonBook"")#(9)youarelearning"PthonBook"
注释(8)中第二个“引号”前面增加了反斜杠( ),就得到了想要的输出结果。此处所用的反斜杠( )就是转义符,它的作用是使后面的“引号”(')不再具有其单独出现的语义。注释(9)中则用转义符分别使两个双引号(") 不再具有其单独出现的语义。
以上是转义符的一个作用,它的另外一个作用是表示无法从键盘录入的字符,比如换行符——除非用4.2.1节中的注释(5)所定义的“多行字符串”。
>>>poem'我住长江头, 君住长江尾。'>>>print(poem)我住长江头,君住长江尾。
在返回的字符串中出现了一个 ,它就是换行符。如果不用“多行字符串”,可以这么做:
>>>poem2="日日思君不见君, 共饮长江水。">>>print(poem2)日日思君不见君,共饮长江水。
此处在定义字符串 poem2 时并未使用“三引号”,只是在其中增加了回车符( ),print(poem2) 的输出结果中就在 的位置换行。表4-2-1中列出了 Python 中常用的转义字符及其说明,供应用时查阅。
表4-2-1 转义字符
转义字符描述
(在行尾时)续行符,即一行未完,转下一行
反斜杠符号
'单引号
"双引号
响铃
退格(Backspace)
e转义
空
换行
纵向制表符
横向制表符
回车
换页
oyy八进制数。yy 代表的字符,例如:12 代表换行
xyy十六进制数。yy 代表的字符,例如:0a 代表换行
other其他的字符以普通格式输出
建议读者在交互模式中测试上述转义符的显示效果。
对于使用 Windows 系统的读者特别要注意,在此操作系统中,文件和目录的路径写法与类 Unix 系统不同。
#以下是MacOS系统的路径,Linux与此一致/Users/qiwsir/Documents#以下是Windows系统的路径C: ew_bookspython
如果在 Python 中建立 Windows 路径的字符串:
>>>pth='c: ew_bookspython'#(10)>>>print(pth)c:ew_bookspython
print(pth) 的结果则是被分割为两行,且路径名称有误,这是因为注释(10)的字符串中,Python 解释器将其中的 作为“换行”转义符了。为此,修改为:
>>>pth='c:\new_bookspython'#(11)>>>print(pth)c: ew_bookspython
比较注释(11)和(10)的差异,在(11)中用转义符 将其后的 符号“转义”,令其不再具有表4-2-1中的含义。
此外,还有一种方法:
>>>pth=r'c: ew_bookspython'#(12)>>>print(pth)c: ew_bookspython>>>pth'c:\new_books\python'>>>type(pth)
注释(12)中以字母 r 作为字符串的前缀,这样所定义的对象称为
原始字符串
( raw string )——依然是字符串类型。对字符串的引号所包裹着的内容,常称为
字面量
( literal )。前缀 r 的作用效果就是自动在字面量中的 符号前面再添加 符号,从而达到令字面量中的 符号转义之目的。
但是,原始字符串并非总能实现上面的效果,例如:
>>>pth=r'c: ew_bookspython'#(13)File"",line1pth=r'c: ew_bookspython'^SyntaxError:EOLwhilescanningstringliteral
在报错信息中出现的 EOL ,完整表述为“ End of Line ”,即行结尾处出现了错误。后面还有一个状语 while scanning string literal ,即告诉我们 Python 解释器在“扫描”字符串字面量时,结尾处有错误。有点疑惑!?
从注释(13)的创建来看,其字符串字面量是“ c: ew_bookspython ”,结尾处的 符号是这个 Windows 路径的组成部分。但是,当写成注释(13)那样的时候,Python 解释器会把“ ' ”组合起来视为表4-2-1中所示的单引号,且是字面量的组成部分。这样,作为字符串的标志的单引号就少了一半,于是出现了 SyntaxError 异常。类似于:
>>>p='pythonFile"",line1p='python^SyntaxError:EOLwhilescanningstringliteral
因此,官方网站的文档中特别提示: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: ew_bookspython>>>pth=r'c: ew_bookspython'+'\'#(15)>>>pth'c:\new_books\python\'>>>print(pth)c: ew_bookspython
注释(14)没有使用原始字符串,毫无疑问可以打印得到字符串字面量;注释(15)中则是原始字符串和字符串“相加”,也得到了同样效果——虽然解决了前面的报错,但是又出现了“字符串相加”这样一个令人迷茫的操作,正可谓“才下眉头,却上心头”。
更多《Python完全自学教程》内容,请点击【阅读原文】
作者: 老齐
来源公众号:老齐教室
本站(www.100xue.net)部分图文转自网络,刊登本文仅为传播信息之用,绝不代表赞同其观点或担保其真实性。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本网联系(底部邮箱),我们将及时更正、删除,谢谢