Python 在 for 或者 if 語句後的冒號是冗餘嗎?
似乎沒有這個冒號也不會產生什麼歧義。
對於縮進很重要的語言, 冒號更符合邏輯而且易讀, 如果是單行表達的話, 冒號就很重要了:
if "foo": "bar"
if "foo" "bar"
的確就是美學,也可以說成是Explicit is better than implicit。所有複合語句都用冒號結尾,這樣接下來一段就變成上面這一行的一部分,風格比較統一,而且不覺得它跟Python里的dict的key-value結構也有一些相似嗎。去掉冒號的話,有些單行的是單行語句,另一些是複合語句,取決於上一行語法的解釋,這樣不夠清晰不夠純粹。
不是冗餘的。
的確,在換行的情況下,看上去縮進就可以替代冒號的作用了。但是Python中單行代碼可能含有多行語句,在不換行的情況下,冒號`for`循環和`if`語句後面的內容都可以放在同一行:
for i in range(3): print("+1s"); print("+2s")
if len("excited") &> 0: print("big news!"); print("+1s")
這時候分號的作用就體現出來了。沒有分號的話,解析器不知道if的判斷語句到哪裡終止。
如果對上面的用法還有疑議,那再看看下面這種合法但大部分情況下沒什麼用的寫法:
&>&>&> if 3 &> 4: + 5; + 4; + 5
&>&>&> if 3 &> 4 + 5: + 4; + 5;
這裡用冒號分割判斷語句和後面的語句塊。如果用分號分割,那又無法判斷哪裡分割的是if判斷語句與if語句塊的分割點,哪裡是if語句塊中各語句的分割點。
你可以參考 stackoverflow 上的同一個問題:
What is the purpose of the colon before a block in Python?確實是可以不要的。這個冒號的作用就是為了更好的可讀性、編輯器自動縮進(來自 Python 官方文檔:Design and History FAQ)。
P.S. 最後的回答是,可以去掉但我不覺得是冗餘除了讓你自己看代碼邏輯非常清爽以外,編輯器看到你打了個冒號,下一行就會自動縮進。
也就是說,有冒號對編輯器比較友好,不然編輯器還得去識別你上面是if while還是什麼其他的東西,而且上一行有if不一定代表下一行要換行(比方說a=1 if b&>2 else 3),帶來無窮多的麻煩。其實也有歧義的。有人說到單行語句了。冒號表示的是控制語句結構,非冒號表示的表達式結構。盡量少地出現控制語句會比較美。
感覺加冒號不符合Python的氣質,畢竟花括弧都省略了,為什麼就不能省略冒號呢。
我剛接觸Python時也想過這個問題。
竊以為完全可以省去,很多人說在單行語句中冒號和分號很有必要,但多條語句寫在同一行本身就不夠Pythonic。其實完全可以捨棄冒號(或者在單行單條語句中可以省略冒號,就像可以省略分號一樣)。如無必要,勿增實體。
至於優點,代碼量更小,開發效率更高(雖然只是一點點)。在可讀性上,畢竟有縮進存在其實也沒啥差,說有差的可能是先入為主,習慣了python的語法。
至於說編輯器判斷縮進不夠方便的,其實只用檢測到上一行開頭有for,if,while,try等關鍵字時下一行就自動縮進也不是什麼問題。
既然可以更純粹,為什麼不這樣做呢,這樣不是更coooooool?
作為一個python的初學者,說下我的看法。
其他的一些語言,如fortran、matlab在if 或者for的結束的時候都會有個endif(end)python這種if和for之後加個: 再換行空幾格寫判斷或循環語句的用法,結束判斷或循環的語法是下一行頂格寫即可,省去了再加end(endif)。所以我認為這個用法:一是為了方便判斷或者循環的結束; 二是告訴編譯器即將進入判斷或者循環。期待專業人士的解釋。我覺得取消冒號,再稍微修整一下語法規則,python會更美。
單行else後面我總忘打冒號
說實話,我在閱讀代碼的時候從來沒有注意到條件結束後的冒號,冒號太窄了,而且只有兩個點,不像 ) 那麼引人注目。所以我感覺去掉冒號也不會影響我的閱讀:,縮進才是提高代碼美觀度最有用的東西
是的
毫無疑問是的
其實這個問題下的大多數回答平行挪到python為什麼不寫分號或者js為什麼不寫分號下面都可以,不知道這些回答者想清楚沒有(笑原來還可以不用冒號。。。。
我IDLE用的pycharm,不加冒號就報錯,語句結尾加分號反而不報錯
1. 語法描述會更清晰(*)
參看antlr語法描述(這裡只貼出python2):
if_stmt: "if" test ":" suite ("elif" test ":" suite)* ("else" ":" suite)?
for_stmt: "for" exprlist "in" testlist ":" suite ("else" ":" suite)?
while_stmt: "while" test ":" suite ("else" ":" suite)?
拿「:」做分隔符,很容易區分判斷條件與代碼塊
2. 語法要求會更靈活,但並不失美感
如果砍掉「:」強制要求必須使用換行,那麼很多短代碼無法寫在一行,尤其是lambda這種,你還非要我換行?
3. 風格統一
python中的class,def,lambda,try exception都用到了「:」,要砍就得都砍。。。
最後:
python是我用過的語言中設計最優雅,使用最方便的語言,不能說最好,怕PHP迷砍我。。。
O__O "…特殊的語法風格。
一度讓用慣{}的我精神崩潰
我是一個完全自學PYTHON的小白,在我的理解中,沒有冒號不會自動縮進,沒有自動縮進很容易讓自己犯錯,而且你後期維護別人不容易看懂?
雖然沒有冒號也不會引發歧義,但是有冒號我感覺if或者for分支語句會更加顯眼,比較容易注意到。
推薦閱讀:
※Python 會不會替代 MATLAB?
※Python 中 「is」 和 「==」 的問題?
※anaconda中如何安裝keras?
※wxPython什麼時候可以支持Python3.5?
※python中字元串 s[ : -1]是什麼意思?