今天這個問題,在公眾號粉絲群裡面,大家是這樣評價的:

問題是這樣的,請在一個xxx.py文件中寫一段代碼,讓他能夠打印自身的全部代碼。也就是說,下面兩個命令,輸出的結果應該完全一樣:
python3xxx.pycatxxx.py不能讀文件,不能用inspect或者ast,不能import任何模塊。
如果可以讀文件,那麼這個問題非常簡單:
withopen('xxx.py')asf:content=f.read()print(content,end='')運行效果如下圖所示:

但現在的問題是,不能讀文件,不能import模塊。基本上只能用print函數來實現這個功能。
這屬於又炫技,又裝逼,但是在工作中沒有任何作用的代碼。能寫出來只能證明自己腦子轉的快,Python機制記得牢。
這個問題為什麼困難呢?看到題目會覺得可能很簡單,但是你動手開始寫的時候,又會發現它很困難,無處下筆。它就像是你要創建一個txt文件,這個文件裡面的內容是這個文件自身的md5碼一樣。當你想修改代碼打印的值時,代碼本身也改變了。
大家一開始看到這個題目,可能抓住腦子裡面馬上一閃而過的想法,立刻開始敲鍵盤:
x='''x='''#到這裡你應該就卡住了'''然後你就卡住了,接下來應該怎麼寫?
要解決這個問題,我們要知道,在Python裡面,循環體只有一行的for循環,除了用縮進外,還有另一種寫法:
a=[1,2,3]forxina:print(x)運行效果如下:

這樣一來,我們就可以把多行代碼放到一行裡面來寫,但是打印出來還是多行:
a=['a=kingname','forxina:print(x)']forxina:print(x)運行效果如下圖所示:

這樣看起來就很像了,那進一步應該怎麼調整呢?我們再加一行:
a=['a=kingname','forxina:print(x)']print('a=',a)forxina:print(x)運行效果如下圖所示:

可以看到,打印出來的代碼跟真正的源代碼,都是3行,並且第一行和第三行是一樣的。現在只要想辦法把第二行搞到一樣就行了。
我們再來改一下代碼:
a=['print("a=",a)','forsina:print(s)']print("a=",a)forsina:print(s)運行以後的效果如下圖所示:

現在源代碼就跟打印出來的代碼一模一樣了。
這種寫法確實有點難以想到。大家不用太在意,當做一篇小品文來看就好了。當做工作之餘的消遣。
END

未聞 Code·知識星球開放啦!
一對一答疑爬蟲相關問題
職業生涯諮詢
面試經驗分享
每周直播分享
......
未聞 Code·知識星球期待與你相見~

一二線大廠在職員工
十多年碼齡的編程老鳥
國內外高校在讀學生
中小學剛剛入門的新人
在「未聞 Code技術交流群」等你來!
入群方式:添加微信「mekingname」,備註「粉絲群」(謝絕廣告黨,非誠勿擾!)
