聊一些鮮為人知但有趣的Python特性,附案例
奇妙的Python特性
之前有個(gè)小學(xué)弟畢業(yè)論文用到Python做NLP,學(xué)了半個(gè)月跟我說(shuō)Python真的太良心了,語(yǔ)法相對(duì)Java簡(jiǎn)潔很多。
我笑了笑說(shuō)那是你用的太少,沒(méi)遭遇到讓人直呼f*ck的特性。
確實(shí),對(duì)于初學(xué)者來(lái)說(shuō)Python的靜態(tài)類型、強(qiáng)制縮進(jìn)、解釋性、強(qiáng)類型等特質(zhì),讓它變得像英語(yǔ)短句那樣容易理解,也不需要你有很強(qiáng)的抽象思維能力。

但其實(shí)越往深里學(xué),你會(huì)發(fā)現(xiàn)Python中有很多精心設(shè)計(jì)的小細(xì)節(jié),會(huì)讓新手覺(jué)得費(fèi)解,甚至不解。
比如說(shuō),我們來(lái)檢查下兩個(gè)新的對(duì)象是否引用自同一對(duì)象:
x?=?256
y?=?256
print(?x?is?y?)
這將會(huì)返回True,確實(shí)引用自同一對(duì)象。
但如果你執(zhí)行下面代碼,會(huì)得到不一樣的結(jié)果。
x?=?257
y?=?257
print(?x?is?y?)
它返回的是False
為什么幾乎同樣的代碼,結(jié)果卻大相徑庭。
這主要是因?yàn)?5 到 256 內(nèi)的整數(shù)經(jīng)常會(huì)用到,這些對(duì)象在你啟動(dòng)Python的時(shí)候就已經(jīng)分配好了。
所以256是一個(gè)已經(jīng)存在的對(duì)象,而257并不是,相當(dāng)于在內(nèi)存中新建了兩個(gè)對(duì)象:x和y。
當(dāng)然上面只是Python奇妙特性中的一個(gè)簡(jiǎn)單案例,還有很多小技巧等待我們?nèi)ヌ剿鳎矣X(jué)得這也是一個(gè)有趣的過(guò)程。
更多的語(yǔ)言特性
之前在Github上看到過(guò)一個(gè)類似的項(xiàng)目,叫作wtfpython(What the f\*ck Python! ),作者就收集了眾多讓你知乎f*uk的Python知識(shí)點(diǎn)。

其中,有關(guān)于原始字符串r的作用,為什么在以 r 開(kāi)頭的原始字符串中, 反斜杠并沒(méi)有特殊含義了。

還有在迭代中刪除元素,del和remove的區(qū)別:
list_1?=?[1,?2,?3,?4]
list_2?=?[1,?2,?3,?4]
for?idx,?item?in?enumerate(list_1):
????del?item
for?idx,?item?in?enumerate(list_2):
????list_2.remove(item)
????
print(list_1)
print(list_2)
猜猜list_1和list_2輸出的結(jié)果是相同還是不同?
執(zhí)行上面代碼后,list_1的結(jié)果是[1, 2, 3, 4],list_2的結(jié)果是[2, 4]。
是不是有點(diǎn)意外哈哈,作者給出詳細(xì)的解答,如下。

諸如此類的案例還有很多,包括了數(shù)據(jù)類型、邏輯語(yǔ)句、函數(shù)、類等語(yǔ)法技巧,大家可以去作者的項(xiàng)目查看。
https://github.com/leisurelicht/wtfpython-cn
我這邊也把相應(yīng)的內(nèi)容梳理成PDF,大家關(guān)注公眾號(hào)在后臺(tái)回復(fù)【8】,即可獲得完整版本。

就像作者在readme前言中說(shuō)的,該項(xiàng)目意在收集 Python 中那些難以理解和反人類直覺(jué)的例子,以及鮮為人知的功能特性, 并嘗試討論這些現(xiàn)象背后真正的原理!
探索這些案例的過(guò)程也是對(duì)Python內(nèi)部原理的深入了解,如果你能覺(jué)得有趣,那將收獲頗豐。

加入知識(shí)星球【我們談?wù)摂?shù)據(jù)科學(xué)】
500+小伙伴一起學(xué)習(xí)!
·?推薦閱讀?·
盤(pán)點(diǎn)2021最佳數(shù)據(jù)可視化作品
「Python實(shí)用秘技04」pdf文件批量添加文字水印
