close

攝影:產品經理
好想吃炸豬排飯啊

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

問題是這樣的,請在一個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」,備註「粉絲群」(謝絕廣告黨,非誠勿擾!)

愛點讚的人,運氣都不會太差
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()