# 練習10.那是什么?
在習題 9 中我們接觸了一些新東西。我讓你看到兩種讓字符串擴展到多行的方法。第一種方法是在月份之間用 `\n` (back-slash n )隔開。 這兩個字符的作用是在該位置上放入一個“新行(new line)”字符。
使用反斜杠 `\`(back-slash) 可以將難打印出來的字符放到字符串。針對不同的符號有很多這樣的所謂“轉義序列(escape sequences)”,但有一個特殊的轉義序列,就是 雙反斜杠(double back-slash) `\\` 。這兩個字符組合會打印出一個反斜杠來。接下來我們做幾個練習,然后你就知道這些轉義序列的意義了。
另外一種重要的轉義序列是用來將單引號 ' 和雙引號 " 轉義。想象你有一個用雙引號引用起來的字符串,你想要在字符串的內容里再添加一組雙引號進去,比如你想說 `"I "understand" joe."`,Python 就會認為 "understand" 前后的兩個引號是字符串的邊界,從而把字符串弄錯。你需要一種方法告訴 python 字符串里邊的雙引號是字符串而不是真正的雙引號。
要解決這個問題,你需要將雙引號和單引號轉義,讓 Python 將引號也包含到字符串里邊去。這里有一個例子:
~~~
"I am 6'2\" tall." # 將字符串中的雙引號轉義
'I am 6\'2" tall.' # 將字符串中的單引號轉義
~~~
第二種方法是使用“三引號(triple-quotes)”,也就是 `"""`,你可以在一組三引號之間放入任意多行的文字。接下來你將看到用法。
~~~
tabby_cat = "\tI'm tabbed in."
persian_cat = "I'm split\non a line."
backslash_cat = "I'm \\ a \\ cat."
fat_cat = """
I'll do a list:
\t* Cat food
\t* Fishies
\t* Catnip\n\t* Grass
"""
print tabby_cat
print persian_cat
print backslash_cat
print fat_cat
~~~
## 你看到的結果
注意你打印出來的制表符,這節練習中的文字間隔對于答案的正確性是很重要的。
~~~
$ python ex10.py
I'm tabbed in.
I'm split
on a line.
I'm \ a \ cat.
I'll do a list:
* Cat food
* Fishies
* Catnip
* Grass
~~~
## 轉義序列
| 轉義字符 | 實現功能 |
|-----|-----|
| \ | Backslash () |
| \' | Single-quote (') |
| \" | Double-quote (") |
| \a | ASCII bell (BEL) |
| \b | ASCII backspace (BS) |
| \f | ASCII formfeed (FF) |
| \n | ASCII linefeed (LF) |
| \N{name} | Character named name in the Unicode database (Unicode only) |
| \r ASCII | Carriage Return (CR) |
| \t ASCII | Horizontal Tab (TAB) |
| \uxxxx | Character with 16-bit hex value xxxx (Unicode only) |
| \Uxxxxxxxx | Character with 32-bit hex value xxxxxxxx (Unicode only) |
| \v | ASCII vertical tab (VT) |
| \ooo | Character with octal value ooo |
| \xhh | Character with hex value hh |
這里有一小段有意思的代碼,嘗試說明它們實現了什么功能:
~~~
while True:
for i in ["/","-","|","\\","|"]:
print "%s\r" % i,
~~~
## 附加題
> 1. 通過把它們寫在卡片上記住所有的轉義序列。
> 1. 使用`'''`(三個單引號)取代三個雙引號,看看效果是不是一樣的?
> 1. 結合轉義序列和格式字符串創建一個更復雜的格式。
> 1. 記得 %r 格式化字符串嗎?使用 %r 搭配單引號和雙引號轉義字符打印一些字符串出來。 將 %r 和 %s 比較一下。 注意到了嗎?%r 打印出來的是你寫在腳本里的內容,而 %s 打印的是你應該看到的內容。
## 常見問題
### Q:如果我想把所有的月份寫在新的一行上,應該怎么做?
> 像這樣寫就可以: `"\nJan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug"`
### Q: 我還沒有完全弄明白最后一句代碼,我應該繼續研究嗎?
> 當然要繼續。把每次練習題中你不明白的地方記下來。當你完成更多的練習的時候,定期檢查你的筆記,看看你是否可以明白筆記中的內容。有時候你可能需要回去看看之前做過的練習,并且重復的完成它們。
### Q: 是什么讓`\\`不同于其他的轉義字符?
> 這是一種簡單的寫出 (`\`)字符的方法. 自己想想為什么我們需要`\\`
### Q:為什么我寫`//`或者`/n`的時候,代碼沒有生效。
> 因為你用的是`/` 而不是`\`.這兩個是不同的字符串,他們的作用也是不一樣的。
### Q:當我使用`%r` 格式的時候,轉義字符都沒有生效。
> 因為`%r` 打印出來的是你寫在腳本里的內容, 這當然也會包含原始的轉移序列的字符。可以使用`%s`。一定要記住:`%r`是調試用的,而`%s` 才是顯示輸出用的。
### Q:我沒有明白附加題3.你所說的“結合”轉義序列和格式是什么意思?
> 你需要明白一點,所有的這些練習題,都可以結合起來解決一些難題。這節練習帶你了解了格式化字符串,你可以結合使用格式化字符串和轉義字符寫一些新的代碼。
### Q: `'''` 和`"""`哪個更好?
> 這個只依賴于你的代碼風格。 現在可以使用`'''` (三個單引號),但是也要做好準備別人都在用的,感覺更好的方式。
- 序言
- 前言
- 簡介
- 0:安裝和準備
- 1:第一個程序
- 2:注釋和“#”井號
- 3:數字和數學計算
- 4:變量和命名
- 5:更多的變量和打印
- 6:字符串和文本
- 7:更多的打印(輸出)
- 8:打印, 打印
- 9:打印, 打印, 打印
- 10:那是什么?
- 11:提問
- 12:提示別人
- 13:參數, 解包, 變量
- 14:提示和傳遞
- 15:讀文件
- 16:讀寫文件
- 17:更多文件操作
- 18:命名, 變量, 代碼, 函數
- 19:函數和變量
- 20:函數和文件
- 21:函數的返回值
- 22:到目前為止你學到了什么?
- 23:閱讀代碼
- 24:更多的練習
- 25:更多更多的練習
- 26:恭喜你,可以進行一次考試了
- 27:記住邏輯
- 28:布爾表達式
- 29:IF 語句
- 30:Else 和 If
- 31:做出決定
- 32:循環和列表
- 33:while循環
- 34:訪問列表元素
- 35:分支和函數
- 36:設計和調試
- 37:復習符號
- 38:列表操作
- 39:字典,可愛的字典
- 40:模塊, 類和對象
- 41:學會說面向對象
- 42:對象、類、以及從屬關系
- 43:基本的面向對象的分析和設計
- 44:繼承Vs.包含
- 45:你來制作一個游戲
- 46:項目骨架
- 47:自動化測試
- 48:更復雜的用戶輸入
- 49:寫代碼語句
- 50:你的第一個網站
- 51:從瀏覽器獲取輸入
- 52:開始你的web游戲
- 來自老程序員的建議
- 下一步
- 附錄A:命令行教程
- 簡介
- 安裝和準備
- 路徑, 文件夾, 名錄 (pwd)
- 如果你迷路了
- 創建一個路徑 (mkdir)
- 改變當前路徑 (cd)
- 列出當前路徑 (ls)
- 刪除路徑 (rmdir)
- 目錄切換(pushd, popd)
- 生成一個空文件(Touch, New-Item)
- 復制文件 (cp)
- 移動文件 (mv)
- 查看文件 (less, MORE)
- 輸出文件 (cat)
- 刪除文件 (rm)
- 退出命令行 (exit)
- 下一步