python 轉(zhuǎn)義序列(轉(zhuǎn)義字符)

2021-09-15 14:44 更新

練習(xí)10.那是什么?

在習(xí)題 9 中我們接觸了一些新東西。我讓你看到兩種讓字符串?dāng)U展到多行的方法。第一種方法是在月份之間用 \n (back-slash n )隔開。 這兩個(gè)字符的作用是在該位置上放入一個(gè)“新行(new line)”字符。

使用反斜杠 \(back-slash) 可以將難打印出來的字符放到字符串。針對(duì)不同的符號(hào)有很多這樣的所謂“轉(zhuǎn)義序列(escape sequences)”,但有一個(gè)特殊的轉(zhuǎn)義序列,就是 雙反斜杠(double back-slash) \\ 。這兩個(gè)字符組合會(huì)打印出一個(gè)反斜杠來。接下來我們做幾個(gè)練習(xí),然后你就知道這些轉(zhuǎn)義序列的意義了。

另外一種重要的轉(zhuǎn)義序列是用來將單引號(hào) ' 和雙引號(hào) " 轉(zhuǎn)義。想象你有一個(gè)用雙引號(hào)引用起來的字符串,你想要在字符串的內(nèi)容里再添加一組雙引號(hào)進(jìn)去,比如你想說 "I "understand" joe.",Python 就會(huì)認(rèn)為 "understand" 前后的兩個(gè)引號(hào)是字符串的邊界,從而把字符串弄錯(cuò)。你需要一種方法告訴 python 字符串里邊的雙引號(hào)是字符串而不是真正的雙引號(hào)。

要解決這個(gè)問題,你需要將雙引號(hào)和單引號(hào)轉(zhuǎn)義,讓 Python 將引號(hào)也包含到字符串里邊去。這里有一個(gè)例子:

"I am 6'2\" tall."  # 將字符串中的雙引號(hào)轉(zhuǎn)義
'I am 6\'2" tall.'  # 將字符串中的單引號(hào)轉(zhuǎn)義

第二種方法是使用“三引號(hào)(triple-quotes)”,也就是 """,你可以在一組三引號(hào)之間放入任意多行的文字。接下來你將看到用法。

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

你看到的結(jié)果

注意你打印出來的制表符,這節(jié)練習(xí)中的文字間隔對(duì)于答案的正確性是很重要的。

$ 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

轉(zhuǎn)義序列

轉(zhuǎn)義字符 實(shí)現(xiàn)功能
\ 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

這里有一小段有意思的代碼,嘗試說明它們實(shí)現(xiàn)了什么功能:

while True:
    for i in ["/","-","|","\\","|"]:
        print "%s\r" % i,

附加題

  1. 通過把它們寫在卡片上記住所有的轉(zhuǎn)義序列。
  2. 使用'''(三個(gè)單引號(hào))取代三個(gè)雙引號(hào),看看效果是不是一樣的?
  3. 結(jié)合轉(zhuǎn)義序列和格式字符串創(chuàng)建一個(gè)更復(fù)雜的格式。
  4. 記得 %r 格式化字符串嗎?使用 %r 搭配單引號(hào)和雙引號(hào)轉(zhuǎn)義字符打印一些字符串出來。 將 %r 和 %s 比較一下。 注意到了嗎?%r 打印出來的是你寫在腳本里的內(nèi)容,而 %s 打印的是你應(yīng)該看到的內(nèi)容。

常見問題

Q:如果我想把所有的月份寫在新的一行上,應(yīng)該怎么做?

像這樣寫就可以: "\nJan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug"

Q: 我還沒有完全弄明白最后一句代碼,我應(yīng)該繼續(xù)研究嗎?

當(dāng)然要繼續(xù)。把每次練習(xí)題中你不明白的地方記下來。當(dāng)你完成更多的練習(xí)的時(shí)候,定期檢查你的筆記,看看你是否可以明白筆記中的內(nèi)容。有時(shí)候你可能需要回去看看之前做過的練習(xí),并且重復(fù)的完成它們。

Q: 是什么讓\\不同于其他的轉(zhuǎn)義字符?

這是一種簡(jiǎn)單的寫出 (\)字符的方法. 自己想想為什么我們需要\\

Q:為什么我寫//或者/n的時(shí)候,代碼沒有生效。

因?yàn)槟阌玫氖?code>/ 而不是\.這兩個(gè)是不同的字符串,他們的作用也是不一樣的。

Q:當(dāng)我使用%r 格式的時(shí)候,轉(zhuǎn)義字符都沒有生效。

因?yàn)?code>%r 打印出來的是你寫在腳本里的內(nèi)容, 這當(dāng)然也會(huì)包含原始的轉(zhuǎn)移序列的字符??梢允褂?code>%s。一定要記住:%r是調(diào)試用的,而%s 才是顯示輸出用的。

Q:我沒有明白附加題3.你所說的“結(jié)合”轉(zhuǎn)義序列和格式是什么意思?

你需要明白一點(diǎn),所有的這些練習(xí)題,都可以結(jié)合起來解決一些難題。這節(jié)練習(xí)帶你了解了格式化字符串,你可以結(jié)合使用格式化字符串和轉(zhuǎn)義字符寫一些新的代碼。

Q: '''"""哪個(gè)更好?

這個(gè)只依賴于你的代碼風(fēng)格。 現(xiàn)在可以使用''' (三個(gè)單引號(hào)),但是也要做好準(zhǔn)備別人都在用的,感覺更好的方式。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)