你真的了解python中的換行以及轉義嗎?


python中的分號

在python中默認是以換行來標志一行語句的結束。

a = "xxxx"
print(a)  # xxxx

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

a = "xxxx"   ;      print(a)  ; b = 1;  print(b)
# 輸出內容
"""
xxxx
1
"""

可以看到當我們在a = "xxxx"后面指定了分號之后,就代表該語句結束了。然后python的語法解析並不會直接跳到下一行,而是會繼續向后尋找,即便當中出現了空格,但是都在一行,所以python會找到print(a),然后繼續向后尋找。盡管這么做是可以的,但是我們不推薦這種寫法,這種寫法純屬有病,當然我們這里演示就不算了。

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

a = 123
if a > 100: print("a > 100"); print("這一個print和上一個print具有相同的縮進")
else: print("a < 100")
"""
a > 100
這一個print和上一個print具有相同的縮進
"""

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

a = 123
# 這行代碼
if a > 100: print("a > 100"); print("這一個print和上一個print具有相同的縮進")
# 等價於:
if a > 100:
    print("a > 100")
    print("這一個print和上一個print具有相同的縮進")

因此我們一行只寫一個語句,不要試圖使用分號將多行語句寫在一行。對於if語句、for循環等等,如果其內部的代碼只有一行,那么可以寫在一行,可以寫成if condition: statement或者for i in loop: print(i)這種形式,但是注意如果語句塊有多行,再寫成這樣會給人帶來困惑的。

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

我們看到當我們輸入a = 1按下回車的時候,下一行的開始出現的是>>>,這表示上一行語句已經結束了。但是當我們輸入if 2 > 1:按下回車的時候,下一行出現的是...,這表示這行語句還沒有結束,像if xx:for xx:while xx:def xx():class xx:等等這樣帶有:的語句,一般是需要多行來表達的,一旦這樣寫按下回車,就意味着下面肯定還有內容,而且還會帶有縮進,在交互式界面中就會出現...。而這樣的語句我們在一行中只能出現一次,比如:

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

python中的反斜杠

首先在python中,默認是以換行符作為語句的結束的,但是如果一行代碼比較長,我們需要分開多行來寫該怎么辦呢?答案是使用反斜杠\,反斜杠在python中表示轉義。

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

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

再比如字符串

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

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

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

當然我們也可以分開寫,但是要使用\將換行符轉義掉。

如果把\改成+號則是不行的,這個在golang里面可以,但是不同的語言的語法檢測不一樣,python中是以換行符作為語句結束的,當我們出現了+之后,后面啥也沒有了,直接換行語句結束,那么這是無法通過語法檢測的。所以+后面出現了紅色波浪線,而且我們看到第三行字符串兩邊也出現了紅色波浪線,這是因為縮進不對造成的,因為上面的語句已經結束,這是一條單獨的語句,因該靠在左對齊,而這里顯然沒有對齊,而是出現了縮進或者空格。/font>

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

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

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

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

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

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

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

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

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

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

python中的轉義與r""

python中的轉義,也是一個老生常談的問題了。python中的轉義我們上面說了是通過反斜杠來實現的,\有兩個作用:一個是和一些特定的字符組合從而具備特殊意義(\n,\t,\r等等),另一個就是使python中的某些本來就具有特殊意義的字符失去其意義。

a = "my name is \nVan"
print(a)
"""
my name is 
Van
"""

b = "my name is \"van"
print(b)  # my name is "van

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

當然上面都很簡單,我想說的是如果字符串的開頭出現了r,會是什么情況呢?

a = "my name is \nVan"
b = r"my name is \nVan"
print(a)
"""
my name is 
Van
"""
print(b)  # my name is \nVan

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

1:和某些特殊字符組合,從而具備一些特殊意義

2:使得某些本來就具有特殊意義的字符,失去其意義。

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

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

a = "my name is \"Van"
b = r"my name is \"Van"
print(a)  # my name is "Van
print(b)  # my name is \"Van

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

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

這個時候我們發現,這兩行代碼都是不合法的。第一行代碼不合法我們能理解,因為右邊的"表示字符串的結尾,現在我們使用\讓其失去了其本來的意義,而后面又是空行導致相當於寫了一半的語句結束了,所以不合法能夠理解。但是第二行呢?不是說\表示原生的嗎?為什么還是不合法的呢?顯然還是如我們之前說的,r限制不了\的第二個作用,也就是第二行的\依舊會使得"失去其意義,導致同樣是寫了一半的語句強行結束了。因此解決辦法就是再來一個\,形成\\

a = "my name is Van\\"
b = r"my name is Van\\"
print(a)  # my name is Van\
print(b)  # my name is Van\\

但是我們發現第二行代碼的輸出多了一個\,因為不加r的話,\\等價於\,因為第一個\再使得第二個\失去意義的時候,其使命也就結束了,因此只會輸出一個\。但是對於有r的字符串來說,\就表示普通的字符,所以是什么就輸出什么,只不過即便它是普通字符,依舊具備第二個功能。因此對於第二行有r的字符串來說,第一個\不僅讓第二個\失去了意義,使得它不能再干擾結尾的",而且兩個\都會原本的輸出出來。

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

a = "my nam\e is Van"
b = "my nam\\e is Van"
print(a)  # my nam\e is Van
print(b)  # my nam\e is Van

我們發現對於兩個結果輸出是一樣的,因為\和字符e無法形成具有特殊意義的字符,而且e也是一個普通的字符串,不具備什么特殊意義。所以對於第一個來說,就直接把\完整的輸出了,但是不推薦這種寫法。如果想加上一個\的話,第二行代碼才是正規做法,兩個\\表示一個\。如果就只想寫一個\的話,可以用我們之前說的r""這種形式。

a = r"my nam\e is Van"
b = r"my nam\\e is Van"
print(a)  # my nam\e is Van
print(b)  # my nam\\e is Van

通過r""也是可以實現的。

a = "\u6398"
b = "\\u6398"
c = r"\u6398"
print(a)  # 掘
print(b)  # \u6398
print(b)  # \u6398

而且python中\u前綴表示的是Unicode,如果不想讓其顯示成漢字的話,那么也是有兩種做法,要么是通過多加一個\,要么通過r""這種形式聲明一個字符串。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM