Python 有那么神嗎?
我打算去了解一下 Python扇售,結(jié)果好像看到一個(gè)新世界了前塔, Python 在他們口中好像無(wú)所不能,編寫一些自動(dòng)化程序啊缘眶,黑別人網(wǎng)站啊嘱根,做游戲外掛之類的好像真的很牛逼,那么巷懈,Python 真的那么神奇嗎?
今天我們就來(lái)借這個(gè)問題看看Python的牛X之處慌洪。
Python升華了我顶燕,也將影響未來(lái)的我。
我的第一份工作是一加國(guó)內(nèi)知名游戲公司的邏輯程序員冈爹,必須技能是C++涌攻,但是一開始只是寫語(yǔ)法和C++很類似的一種腳本(后來(lái)知道是從一個(gè)開源腳本引擎AngelScript修改而成的)。學(xué)習(xí)游戲開發(fā)的流程频伤,填數(shù)據(jù)恳谎,用腳本定制各種任務(wù)、副本等等。第一年還很有興致因痛,第二年開始就意興闌珊了婚苹。
后來(lái)熟悉了整個(gè)系統(tǒng),介入到C++部分的代碼里鸵膏。涉及到道具膊升、任務(wù)等等邏輯。那時(shí)候覺得最難的部分谭企,是UI系統(tǒng)供屉。當(dāng)時(shí)的UI系統(tǒng)瓣颅,是用XML拼出界面,然后用類似C++的那種腳本來(lái)給它寫邏輯。從一開始被迫學(xué)習(xí)朽色,到最后使用的時(shí)候遇到各種問題,前后折騰了很久狗准。
寫程序的熱情毙玻,在實(shí)際工作中被一點(diǎn)點(diǎn)的磨滅。我想速和,很可能許許多多的程序員歹垫,都會(huì)遇到和我一樣的問題。因?yàn)閻酆枚呱线@條路颠放,卻被瑣碎的工作磨滅了最初的沖動(dòng)排惨。等到我成為一個(gè)獨(dú)當(dāng)一面的程序員的時(shí)候,我甚至有一種感覺碰凶,覺得自己似乎什么都會(huì)暮芭,但是除了項(xiàng)目任務(wù)以外的東西,什么都做不出來(lái)欲低。相比高中時(shí)候的自己辕宏,甚至有一些退步。
直到有一天砾莱,我看了一本書《黑客與畫家》瑞筐。
在你迷茫的時(shí)候聚假,多吸收一些各方面的知識(shí),偶爾會(huì)突然打開一扇窗闰非。
《黑客與畫家》滿本書都透著濃濃的技術(shù)自信膘格,和充足的技術(shù)底蘊(yùn)。它就像是一個(gè)知識(shí)豐富的技術(shù)高手财松,迫不及待的將平生經(jīng)驗(yàn)一股腦傳授給你瘪贱,為你指明發(fā)展的方向。
它的字里行間透露著對(duì)傳統(tǒng)編程語(yǔ)言的鄙夷和對(duì)LISP的崇敬。它認(rèn)為精巧的語(yǔ)言菜秦,加上聰明程序員實(shí)現(xiàn)的高度抽象代碼甜害,會(huì)帶來(lái)極大的生產(chǎn)力提升,讓開發(fā)更快喷户、BUG更少唾那,讓一兩個(gè)開發(fā)人員也能撐起一個(gè)具有巨大經(jīng)濟(jì)效益的網(wǎng)站。
在Web界已經(jīng)是遍地動(dòng)態(tài)語(yǔ)言的今天褪尝,《黑客與畫家》里的判斷似乎已經(jīng)沒什么好討論的了(現(xiàn)在動(dòng)態(tài)語(yǔ)言在很多領(lǐng)域已經(jīng)成為了主流闹获,和作者當(dāng)年的情況已經(jīng)有了天壤之別)。但對(duì)于當(dāng)時(shí)的我來(lái)說河哑,就是大海里的一盞明燈避诽。
雖然書里對(duì)Python(作者當(dāng)年還是1.x版本)的看法很具有批判性,但是由于那時(shí)Python 2.x已經(jīng)有了長(zhǎng)足的發(fā)展璃谨,加上一個(gè)同事的推薦沙庐,我全身心投入到了Python的學(xué)習(xí)之中。
在寫了一些小練習(xí)程序之后佳吞,我在工作中找到了一個(gè)Python的用武之地——用Python實(shí)現(xiàn)一個(gè)數(shù)據(jù)表格分析程序拱雏,并檢查表格中的數(shù)據(jù)錯(cuò)誤、邏輯錯(cuò)誤底扳。這種表格處理工具在游戲中具有很大的作用铸抑,而且非常適合用腳本來(lái)靈活的擴(kuò)展功能。
第一個(gè)實(shí)現(xiàn)的簡(jiǎn)單版本衷模,使用起來(lái)大概是這樣:
這個(gè)代碼主要問題在哪呢阱冶?在于讀取數(shù)據(jù)時(shí)刁憋,程序員自己要指定數(shù)據(jù)的類型。get_int木蹬,get_str至耻,get_float等等等等。
很不幸而又幸運(yùn)的届囚,當(dāng)時(shí)我用某某云盤保存自己的代碼有梆,有一次誤同步,導(dǎo)致在公司寫的很多代碼意系,在家里操作時(shí)覆蓋了。迫使我重寫幾乎整個(gè)程序饺汹。這次蛔添,在同事的參謀下,我實(shí)現(xiàn)了這種用法:
這段代碼實(shí)現(xiàn)的功能與上面的完全一樣夸溶,但是有兩點(diǎn)變化:
1、用[]下標(biāo)操作符代替了get_xxx()函數(shù)調(diào)用凶硅,更簡(jiǎn)潔缝裁。
2、讀取時(shí)不需要指定類型足绅,執(zhí)行時(shí)捷绑,data1自然是整型,data2自然是字符串氢妈。
這種實(shí)現(xiàn)粹污,對(duì)于當(dāng)時(shí)的我來(lái)說,是一個(gè)理念上的重大突破首量!
為什么這么說呢壮吩?因?yàn)閺?qiáng)類型的問題。在Python中加缘,我用一些很簡(jiǎn)單的處理鸭叙,讓mb庫(kù)的底層自然的處理了類型。而你知道嗎拣宏?在C++中沈贝,做到這點(diǎn)難如登天!
C++常常為了推斷一個(gè)類型蚀浆,不惜使用模版技巧缀程,寫出天書一般的代碼。而且市俊,結(jié)果上杨凑,仍然不能做到動(dòng)態(tài)語(yǔ)言的這種用法。也就是說摆昧,顯式強(qiáng)類型特性撩满,并不僅僅是約束程序員減少BUG的工具,它同時(shí)也是實(shí)現(xiàn)高抽象系統(tǒng)的一個(gè)束縛绅你。這是個(gè)很有意思的事情伺帘,對(duì)我當(dāng)時(shí)的觸動(dòng)很大。不知讀者能否理解忌锯。
到了寫出這個(gè)表格分析庫(kù)之后伪嫁,我生命中的一扇門打開了。
我回到了可以自由寫代碼的時(shí)代偶垮,就像是我的高中時(shí)代张咳,而且比那個(gè)時(shí)代更為簡(jiǎn)潔帝洪,充滿了更多的可能。
我可以任意的寫代碼脚猾,幾行代碼就能實(shí)現(xiàn)對(duì)樹的操作葱峡、復(fù)雜的嵌套字典。我仿佛可以操作任意復(fù)雜的數(shù)據(jù)結(jié)構(gòu)龙助,或者復(fù)雜的遞歸砰奕,只要我想清楚了,根本不需要多少編碼時(shí)間提鸟。當(dāng)時(shí)自認(rèn)為掌握了葵花寶典军援,干勁十足,所以還找了一個(gè)Python學(xué)習(xí)網(wǎng)站沽一,沒事就到上面刷題盖溺。
寫了很多平時(shí)懶的寫的復(fù)雜算法,還看大神們寫的“一行Python”(其實(shí)是利用了列表解析等方式做的很簡(jiǎn)短但是有點(diǎn)難讀的代碼)铣缠,收獲了很多樂趣烘嘱。
后來(lái)
后來(lái)的我,仔細(xì)學(xué)習(xí)過wxPython庫(kù)蝗蛙,也實(shí)現(xiàn)過類似Web框架的游戲框架蝇庭,對(duì)Python的使用也不斷進(jìn)入新的階段。當(dāng)然也發(fā)現(xiàn)Python的很多弊端捡硅,并非語(yǔ)言層的哮内,大都是虛擬機(jī)層面的。
學(xué)習(xí)Python的過程中壮韭,我總結(jié)出項(xiàng)目開發(fā)的三大要點(diǎn)——開發(fā)速度北发,運(yùn)行速度,維護(hù)難度喷屋。軟件項(xiàng)目金三角琳拨。這個(gè)規(guī)則可以套用在所有的軟件項(xiàng)目上,作為看項(xiàng)目的一個(gè)可觀角度屯曹。而且有趣的是狱庇,這個(gè)三角形總是無(wú)法在三點(diǎn)上同時(shí)拿到高分。
也許大部分人都無(wú)法理解一門語(yǔ)言對(duì)一個(gè)程序員生涯的影響恶耽,所以特撰此文密任。
Python對(duì)我的影響是巨大的,Python升華了過去的我偷俭,也將持續(xù)影響未來(lái)的我浪讳。