成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊一聊 Python 的換行以及轉義

開發 前端
輸出是一樣的,因為 \ 和字符 e 無法形成具有特殊意義的字符,而且 e 也是一個普通的字符,不具備什么特殊意義。所以對于 s1 來說,就直接把 \ 完整的輸出了,但是不推薦這種寫法。

Python 里面可以通過換行來標識一行語句的結束,當你在一行的末尾敲擊 Enter 鍵時,便可開始新的一行語句。

name = "高老師"
print(name)  # 高老師

這段代碼很簡單,因為 name = "高老師" 后面已經沒有內容了,是一個換行,那么就代表這個語句結束了。但是在 Python 中我們還可以指定分號,表示該語句結束了。

name = "高老師"; print(name); age = 18; print(age)
"""
高老師
18
"""

可以看到當我們在 name = "高老師" 后面指定了分號之后,就代表該語句結束了。但是 Python 的語法解析并不會直接跳到下一行,而是繼續向后尋找,即便當中出現了空格。

由于都在一行,所以解釋器會找到 print(name),然后繼續向后尋找。盡管這么做是可以的,但不推薦這種寫法,這種寫法純屬在惡作劇,當然我們這里演示就不算了。

再比如 if 語句,有時候會出現寫在一行的情況。

a = 123
if a > 100: print("a > 100"); print("兩個 print 具有相同的縮進")
"""
a > 100
兩個 print 具有相同的縮進
"""

如果 if 語句寫在了一行,那么語句塊的代碼就應該只有一句,像我們這里的兩個 print 就不應該寫在同一行。并且這兩個 print 的縮進層級是一樣的,即:

a = 123

if a > 100: print("a > 100"); print("兩個 print 具有相同的縮進")
# 等價于
if a > 100:
    print("a > 100")
    print("兩個 print 具有相同的縮進")

關于 Python 中的語句,根據交互式界面的表現形式我們可以分為兩種:

圖片圖片

我們看到當輸入 num = 123 按下回車的時候,下一行的開始出現的是 >>>,這表示上一行語句已經結束了。但是當輸入 if num > 100: 按下回車的時候,下一行出現的是 ...,這表示這行語句還沒有結束。

像 if xx:,for xx:,while xx:,def xx():,class xx: 等等這樣帶有 : 的語句,一般是需要多行來表達的,一旦按下回車,就意味著下面肯定還有內容,而且還會帶有縮進,在交互式界面中就會出現 ...。而這樣的語句我們在一行中只能出現一次,比如:

圖片圖片

這樣寫是無法通過語法檢測的,因為當中出現了兩個 :,我們說這樣的語句一行只能出現一次。當然肯定也不會有人這么做,所以這些知道就好。

說完了換行,我們再來聊一聊反斜杠。

如果一行代碼比較長,我們需要分開多行來寫該怎么辦呢?答案是使用反斜杠 \,反斜杠在 Python 中表示轉義。

a = \
    123456
# \ 表示轉義,意思就是使后面的換行符失去效果
# 這樣 Python 就不會認為這條語句結束了
# 因為 123456 前面還有一些空格,因此等價于 a =     123456

a = \
123456
# 這行代碼就等價于 a = 123456 了

再比如字符串:

s = "這是一段很"   "長的字符串"  "具體有多長我也不知道"
print(s)  # 這是一段很長的字符串具體有多長我也不知道

Python 的字符串比較特別的是,不需要顯式的使用加號。如果使用了加號,像這段代碼就會先創建 3 個字符串,然后再拼接在一起。如果不使用加號,那么 Python 在語法解析的時候就會知道這是一個字符串,只不過分開寫了。

s = "這是一段很" \
    "長的字符串" \
    "具體有多長我也不知道"

當然我們也可以分開寫,但是要使用 \ 將換行符轉義掉。但是下面的做法則不行:

圖片圖片

如果把 \ 改成 + 號就不行了,這個在 Go 里面可以,但是不同語言的語法檢測不一樣。因為 + 后面沒有內容了,直接換行語句結束,那么這是無法通過語法檢測的,所以 + 后面出現了紅色波浪線。

而且我們看到第三行字符串兩邊也出現了紅色波浪線,這是縮進不對造成的,因為上面的語句已經結束,所以這是一條單獨的語句,應該靠左對齊。這里顯然沒有對齊,而是出現了縮進。

圖片圖片

這樣寫是可以的,此時就等價于"這是一段很長的字符串" + "具體有多長我也不知道"。

但是還有一個特殊情況,那就是出現了括號。

圖片圖片

這樣寫也是沒有問題的,因為 Python 在檢測代碼的時候發現了小括號的左半部分,那么即便出現了換行,Python 也不會認為語句結束了。只有當再找到小括號的右半部分,Python 才會認為語句結束,所以此時我們是不需要 \ 的。

再來看幾個需要動點腦筋的:

s = "這是一段很"
"長的字符串"
"具體有多長我也不知道"
print(s)
# 會打印什么呢?

只會打印這是一段很,因為遇到換行符語句結束了,下面兩行只是創建兩個字符串對象,而且還沒有賦值,因此創建完之后就被銷毀了。

s = "這是一段很" \
    "長的字符串"; \
    "具體有多長我也不知道"
print(s)
# 會打印什么呢?注意第二行出現了;

會打印這是一段很長的字符串,因為我們手動指定了 ;,表示結束這段語句。后面出現的"具體有多長我也不知道"也是只創建了一個字符串對象,沒有賦值,創建完畢直接銷毀。

因此上面的代碼就等價于:

s = "這是一段很長的字符串"; "具體有多長我也不知道"

# 或者等價于

s = "這是一段很長的字符串"
"具體有多長我也不知道"

要是我們將第二行結尾的 \ 給去掉,會怎么樣?

圖片圖片

可以看到如果把第二行的 \ 去掉了,這里又出現了紅色波浪線,這個問題我們上面說過了。因為第二行出現了 ;,那么第三行就是單獨的語句,所以應該要靠在左邊。

圖片圖片

這樣寫是沒問題的,但第三行還是如我們之前所說,只是創建了一個字符串對象。

Python 的轉義

Python 的轉義也是一個老生常談的問題了,它是通過反斜杠來實現的。但 \ 有兩個作用:

  • 和一些特定的字符組合,從而具備特殊意義(\n, \t, \r 等等)
  • 使 Python 的一些本來就具有特殊意義的字符失去其意義。
s = "my name is \nVan"
print(s)
"""
my name is 
Van
"""

s = "my name is \"Van"
print(s)
"""
my name is "Van
"""

我們看到 \ 和字符 n 組合,整體形成了換行。而 \ 和 " 組合則并不是變成新的什么東西,而是使 " 失去其本來的意義。因為遇到 " 表示字符串結束了,但是前面出現了 \,使得 " 失去了其具有的意義,遇到下一個 " 才表示字符串結束。而中間那個 " 則是正常輸出了出來,但是 \ 卻不見了,因為 \ 和 組合就等于 "

說到這兒,再補充一下 Python 字符串的幾種表示方式:

print(hex(97), hex(98), hex(99))
"""
0x61 0x62 0x63
"""
# 在字符串中,每個字符還可以使用 \x 加兩個 16 進制數字表示
print("\x61\x62\x63")
"""
abc
"""
# 或者使用 \ 加上三個 8 進制數字表示
print(oct(97), oct(98), oct(99))
"""
0o141 0o142 0o143
"""
print("\141\142\143")
"""
abc
"""

# 不過上面只能表示 ASCII 字符串,因為一個漢字占三個字節
# 所以當包含一個字節無法表示的字符時,解析就會出現亂碼
print("\xe9\xab\x98\xe8\x80\x81\xe5\xb8\x88")
"""
é??è?????
"""
print(b"\xe9\xab\x98\xe8\x80\x81\xe5\xb8\x88".decode("utf-8"))
"""
高老師
"""

當然,在 Python 里面每個字符還可以使用 \u 或者 \U 來表示。

# \u 表示 unicode,后面跟 4 個十六進制數表示的 unicode 碼點
print(hex(97), hex(98), hex(99))
"""
0x61 0x62 0x63
"""
print("\u0061 \u0062 \u0063")
"""
a b c
"""

print(ord("高"), ord("老"), ord("師"))
"""
39640 32769 24072
"""
print(hex(39640), hex(32769), hex(24072))
"""
0x9ad8 0x8001 0x5e08
"""
print("\u9ad8 \u8001 \u5e08")
"""
高 老 師
"""

# 如果是 emoji,它的碼點超出了 FFFF
# 此時 4 個 16 進制數無法表示,因此需要 8 個十六進制數
print(hex(ord("??")), hex(ord("??")))
"""
0x1f923 0x1f921
"""
# 如果是 4 個十六進制數,那么可以使用 \u 或者 \U
# 如果是 8 個十六進制數,那么只能使用 \U
print(f"\U0001f923 -> \U0001f921")
"""
?? -> ??
"""

還是蠻有趣的,Python 字符串的表示方式還挺豐富。

Python 的 r 前綴

如果字符串的開頭出現了 r,會是什么情況呢?

s1 = "my name is \nVan"
s2 = r"my name is \nVan"
print(s1)
"""
my name is 
Van
"""
print(s2)
"""
my name is \nVan
"""

如果是 r"" 這種形式,表示的是這個字符串是原生的,這里的 r 表示 raw。里面出現的任何東西都當成普通字符串,什么 \n 啊,\t 啊,就是普通的字符串。但是我們說過,\ 具有兩個作用:

  • 某些特殊字符組合,從而具備一些特殊意義
  • 使得某些本來就具有特殊意義的字符,失去其意義

而 r"" 這種形式,只會限制 的第一個作用,卻不會限制其第二個作用。

圖片圖片

我們看到即使加上了前綴 r,第一行語句還是不合法的,因為 表示字符串的邊界,即使加上了 r,對于 " 依舊是無能為力的,這時候還是需要 \ 進行轉義。

s1 = "my name is \"Van"
s2 = r"my name is \"Van"
print(s1)
print(s2)
"""
my name is "Van
my name is \"Van
"""

然后我們又觀察到了一個奇特的現象,當不加 r 的時候,\" 就表示 ",而加上了 r,\" 則表示 \",因為 r 表示原生的,\ 會原原本本的輸出出來。但我們說了,r 不會限制 \ 的第二個作用,所以 \ 不僅輸出了出來,還使得 " 失去了其原本的意義。

最后引出 Python 中一個比較讓人費解的問題,估計已經有人猜到了,那就是字符串結尾出現了 \

圖片圖片

兩行代碼都是不合法的。

第一行代碼不合法是因為右邊的 " 表示字符串的結尾,現在我們使用 讓其失去了本來的意義,而后面又是空行導致相當于寫了一半的語句結束了,所以不合法能夠理解。

第二行同樣不合法,因為 r 限制不了 \ 的第二個作用,也就是第二行的 \ 依舊會使得 失去其意義,導致同樣是寫了一半的語句強行結束了。因此解決辦法就是再來一個 \,形成 \\

s1 = "my name is Van\\"
s2 = r"my name is Van\\"
print(s1)
print(s2)
"""
my name is Van\
my name is Van\\
"""

第二行代碼的輸出多了一個 \,因為不加 r 的話,\\ 等價于 \,因為第一個 在使第二個 失去意義的時候,其使命也就結束了,因此只會輸出一個 \

但是對于有 r 前綴的字符串來說,\ 就表示普通的字符,所以是什么就輸出什么,只不過即便它是普通字符,依舊具備第二個功能。因此對于第二行有前綴 r 的字符串來說,第一個 不僅讓第二個 失去了意義,使得它不能再干擾結尾的 ",而且兩個 都會原本的輸出出來。

如果 \ 出現在其他位置呢?

s1 = "my nam\e is Van"
s2 = r"my nam\e is Van"
print(s1)
print(s2)
"""
my nam\e is Van
my nam\e is Van
"""

輸出是一樣的,因為 \ 和字符 e 無法形成具有特殊意義的字符,而且 也是一個普通的字符,不具備什么特殊意義。所以對于 s1 來說,就直接把 \ 完整的輸出了,但是不推薦這種寫法。

對于 s1 來說,應該指定兩個 \\。如果就只想寫一個 \ 的話,那么應該指定前綴 r,所以 s2 是沒問題的。

責任編輯:武曉燕 來源: 古明地覺的編程教室
相關推薦

2019-12-02 16:23:03

Python編程語言“垃圾”回收

2024-04-29 14:58:48

Python內置函數

2023-07-06 13:56:14

微軟Skype

2020-09-08 06:54:29

Java Gradle語言

2024-02-23 15:51:40

PythonBlaze延遲計算

2021-01-28 22:31:33

分組密碼算法

2023-09-22 17:36:37

2020-05-22 08:16:07

PONGPONXG-PON

2018-06-07 13:17:12

契約測試單元測試API測試

2021-08-01 09:55:57

Netty時間輪中間件

2023-09-27 16:39:38

2024-10-28 21:02:36

消息框應用程序

2021-12-06 09:43:01

鏈表節點函數

2023-09-20 23:01:03

Twitter算法

2021-03-01 18:37:15

MySQL存儲數據

2021-07-16 11:48:26

模型 .NET微軟

2024-03-28 09:02:25

PythonGetattr工具

2018-11-29 09:13:47

CPU中斷控制器

2021-02-06 08:34:49

函數memoize文檔

2021-08-04 09:32:05

Typescript 技巧Partial
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产精品99久久久久久久久 | 日韩欧美在线免费 | 亚洲在线| 国产一区二区三区在线看 | 狠狠操狠狠干 | 中文字幕精品一区二区三区精品 | 99欧美精品 | 国产一区二区精品在线观看 | 日韩午夜激情 | 欧美成人一区二区三区 | 国产在线一区观看 | 欧美日韩在线观看一区 | 日韩视频区 | 91电影院| 亚洲精品一区二区三区四区高清 | 国产精品国产 | 欧美精品二区 | 99久久精品国产一区二区三区 | 中文字幕第90页 | 久久99视频精品 | 荷兰欧美一级毛片 | 亚洲午夜精品 | 久久久久久久久一区 | 综合激情av | 91久久精品一区二区二区 | 国产一级片在线观看视频 | 精品伊人 | 久久99精品久久久久久青青日本 | 国产成人精品一区二区三 | 久久1区| 国产精品久久久久久久久婷婷 | 精品粉嫩aⅴ一区二区三区四区 | 农村妇女毛片精品久久久 | 国产专区在线 | 久久精品色欧美aⅴ一区二区 | 日韩精品一区二区三区在线观看 | 日韩三极 | 国产一级一级 | 一级片av | 亚洲色图综合网 | 妖精视频一区二区三区 |