腦洞大開,你不知道的Python冷知識(1)


腦洞大開,你不知道的Python冷知識(1)

Python現在越來越成為一個受大家喜愛的編程語言了,今年更是在幾乎所有語言的排名都下滑的情況下逆勢反增,那麼有一些Python的冷門小知識你是否知道呢,快來看看吧。


Python之禪

人生苦短,我用Python

想必這句話各種Pythoneer都耳熟能詳了吧,那麼大家知道其出自哪裡麼?

故事要追溯到一次Pycon大會上,主辦方想給大會定一個Slogan印在T恤上,大家集思廣益,在最後的幾個候選名單中投選出了import this這個幸運兒,並將它發佈在 python2.2.1 上。

腦洞大開,你不知道的Python冷知識(1)

也就是說在Python 2.2.1以上的版本中,輸入import this將能夠看到《The Zen of Python》,實際上這是Tim Peters倡導的Python編寫指導守則,全文如下

腦洞大開,你不知道的Python冷知識(1)

翻譯成中文為

腦洞大開,你不知道的Python冷知識(1)

事實上當你去查看Lib/this.py的源代碼時,你會發現裡面定義了一串完全看不到的文字,沒錯!作者閒到把這段Python之禪的內容做了加密,感興趣的朋友不妨去看看源代碼中作者是用了怎樣的加密算法吧,或者留言哦。


Python漫畫

你知道Python原生的庫中隱藏著一個看漫畫的麼,那就是antigravity這個庫。

當你在Python解釋器中輸入import antigravity時,Python會打開一個web頁面指向https://xkcd.com/353/,顯示了一套漫畫如下

腦洞大開,你不知道的Python冷知識(1)

大致意思為

  • 上圖

“你在飛!怎麼做到的?”

“Python!”

  • 下左

“我昨晚學習了 Python,一切都是那麼簡單”

“運行 HELLO WORLD 只需要 print “Hello World!””

  • 下中

“我還是不明白……動態類型,還是空格?”

“來加入我們吧,編程又再次變得有趣起來了,Python 是一個全新的世界”

“但你是怎麼飛起來的?”

  • 下右

“我只是輸入了 import antigravity”

“就這樣?”

“我還對藥品櫃中的所有東西進行了採樣比較”(暗指他對比過多種編程語言,但還是覺得 Python 最簡單)

“但我想這就是 Python.”


神秘的-5到256

Python的[-5, 256]是一個神秘的區間,為什麼這麼說的,你可以在解釋器中嘗試以下代碼

<code>>>> a = 256
>>> b = 256
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False
>>> /<code>

是不是覺得很奇怪呢,為什麼當a和b是257的時候,結果就為False了呢?

實際上這是由於Pythn的對象緩存池機制,Python在初始化的時候會創建一個緩存池,對於整數來說,其創建的緩存區間就是[-5, 256],為何是這個區間呢,沒人知道,Python就是這麼定義的。

如果你去查看Python的源碼,可以在intobject.c的文件中找到如下的宏定義

<code>#ifndef NSMALLPOSINTS
#define NSMALLPOSINTS 257
#endif
#ifndef NSMALLNEGINTS

#define NSMALLNEGINTS 5
#endif/<code>

也就是說在[-5, 256]這個區間內,Python會直接返回同一個內存引用下的對象,而在區間之外Python則是會重新進行對象的創建,所以當對變量賦值257時,Python實際上給a和b分別創建了兩個對象,使用id(a)和id(b)去查看會發現是兩個不同的id。

如果你喜歡,甚至可以去修改源碼改變這個區間,之所以定義這個緩存區間,也是出於性能的考慮,畢竟用到這個區間內的數字的幾率是很大的,避免每次都重新創建對象可以提升性能。

Quine

什麼是Quine,Quine即是自產生程式,也就是說程序的輸出是程序本身。

寫一段代碼,使得這段代碼的輸出恰好也是這段代碼本身,聽上去有點莫比烏斯環的感覺,實際上幾乎所有的語言都有自己的Quine代碼,而Python的Quine則相比其他語言簡明的多,一行即可實現

Python2

<code>print(lambda x:x+str((x,)))('print(lambda x:x+str((x,)))',)/<code>

Python3

<code>print((lambda s:s%s)('print((lambda s:s%%s)(%r))'))/<code>

大家不妨在自己的Python命令行中嘗試下上述代碼的輸出是否是其自身吧。

當然如果你以為程序員就此滿足的話,那就太年輕了,喪心病狂的程序員大佬甚至用128種語言寫了一個Quine環,github地址為https://github.com/mame/quine-relay

腦洞大開,你不知道的Python冷知識(1)

Quine-Relay

這段代碼首先是語言1,執行後生成另一個語言2的代碼,接著依次執行下去,直到執行完生成的最後一種語言的代碼後,輸出的結果恰好又回到了最初的語言1的代碼自身,不得不感慨程序員大佬真的是太閒了!


分享到:


相關文章: