收錄于話題 #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.rxbbx.com)部分圖文轉自網絡,刊登本文僅為傳播信息之用,絕不代表贊同其觀點或擔保其真實性。若有來源標注錯誤或侵犯了您的合法權益,請作者持權屬證明與本網聯系,我們將及時更正、刪除,謝謝