如何零基础开始自学Python编程,值得一看!
0. 明確目標(biāo)
我是真正零基礎(chǔ)開始學(xué)Python的,從一開始的一竅不通,到3個月后成功搭建了一個動態(tài)網(wǎng)站(沒有用任何框架)。相比于計(jì)算機(jī)大牛,我更加知道一個小白將會遇到什么坑,遇到哪些難點(diǎn)。我把我的學(xué)習(xí)過程寫在下面,并附上在每個階段的學(xué)習(xí)資料,希望對零基礎(chǔ)的Python學(xué)習(xí)者有所幫助。
?
在知乎上常常看到想要轉(zhuǎn)行IT,或者是想學(xué)習(xí)編程但不知如何開始的朋友。回答這類問題的人往往只是列出書單資源然后給出一個大致的方向。有些朋友一開始就扎入了理論學(xué)習(xí)的汪洋大海,從苦讀類似《算法導(dǎo)論》開始,能夠堅(jiān)持讀下來的寥寥無幾,學(xué)習(xí)的積極性也被不斷的挫敗感消磨的所剩無幾。
一直以來,編程對我而言是一種「黑魔法」般的存在。今年阿里月餅門,當(dāng)很多人都參與到是非之爭的時候,我更加著迷于程序員區(qū)區(qū)幾行代碼的腳本所展現(xiàn)出的威力,對于外行而言,這是超乎他們想象之外的某種能力——為什么我守在電腦面前盯著秒針然后拼命點(diǎn)擊鼠標(biāo)都不一定能搶到的禮物,程序員只需要提前花5分鐘寫3行代碼就輕松搞定?
所以,我的心底深處一直都想變成這樣的一位魔法師。今年的8月,剛好工作上想要開發(fā)一個基于微信的英語學(xué)習(xí)網(wǎng)站,借此機(jī)會,我決定好好學(xué)習(xí)一下編程。在此之前,我所有關(guān)于程序的知識僅僅來源于兩部分,一是本科時期的C語言必修課,現(xiàn)在已經(jīng)忘的一干二凈,不過好歹我從中明白編程是怎么回事;第二部分是大概兩年前由于工作關(guān)系學(xué)的一些Python,不過只是皮毛,現(xiàn)在忘的七七八八。
簡單說,我的目標(biāo)是建立一個網(wǎng)站,不過這個網(wǎng)站是動態(tài)的,也就是說它能識別誰登陸,然后對不同的人顯示不同的內(nèi)容。而當(dāng)時的現(xiàn)實(shí)是,我完全不明白網(wǎng)頁是如何顯示出來的?譬如每個人登陸知乎的時候看到的是定制化的頁面,后臺是如何基于每個ID來組織出不同的頁面的?所有我們看到的問題,回答,參與的評論在背后的服務(wù)器上是以一種什么樣的形式存在的?又比如為什么有些頁面只能在微信端打開,在電腦上就會出錯?(不知道你有沒有發(fā)現(xiàn)這一點(diǎn))
當(dāng)時我的心中充滿了無數(shù)個類似的問號?當(dāng)然如果你也是小白,一定有著同樣的疑問。
好處是一開始就明確了學(xué)習(xí)的目的:Web建站。所以我的學(xué)習(xí)方案基本就是通過做項(xiàng)目學(xué)習(xí),哪里不懂就解決哪里,邊做邊學(xué)習(xí),不斷推進(jìn)。另外,由于知道很多成功的網(wǎng)站在用Python做服務(wù)器開發(fā),比如知乎,所以我就自然選擇了Python。
于是我就開始了我充滿著挫敗感和成就感的編程之路……
從8月到12月的四個月里,除去本來的工作,為了學(xué)習(xí)質(zhì)量,我會保證平均每天4個小時的學(xué)習(xí)時間,周末也不例外。另外,所有的文檔,問答都盡量看英文的,這可以幫你剩下大量的時間。12月13日,我做的網(wǎng)站上線了,3天時間大概有5000人訪問了這個網(wǎng)站,我有時在后臺看著日志,不免有些心潮噴涌,我想把自己的經(jīng)驗(yàn)寫下來,希望對于那些有心學(xué)習(xí)編程但無從下手的朋友提供一些幫助和鼓勵。
1. 我的自學(xué)編程之路
1.1 基礎(chǔ)
剛開始的時候,我對搭建網(wǎng)站一無所知。為了給自己迅速建立一個框架,我在Google上面泡了整整一天,了解了HTML,CSS,JavaScript,Ajax,jQuery,React,SQL,服務(wù)器腳本等等知識,不求精通,只是了解每一項(xiàng)技術(shù)是干嘛的,另一方面建立起了一個學(xué)習(xí)的roadmap,這樣大概知道做一個Web App需要哪些知識,分別學(xué)習(xí)的主次順序。重點(diǎn)推薦兩個資源:
Python基礎(chǔ)知識:Learn Python the Hard Way
Web App基礎(chǔ)知識:@張秋怡的答案寫的通俗易懂,極力推薦。
有了這個roadmap,我明白了前端三大必須掌握技能HTML,CSS和JavaScript,花了大概10天左右把W3Schools上的教程全部過了一遍,然后試著寫了幾個網(wǎng)頁,感覺自己寫的很沒有底氣。于是根據(jù)知乎和豆瓣上的推薦,買了《JaveScript DOM》和《Head First HTML與CSS》,邊看書邊把例子過了一遍。
W3Schools: www.w3schools.com/
JavaScript:JavaScript DOM編程藝術(shù)
HTML & CSS : Head First HTML與CSS(第2版)
前端是需要慢慢學(xué)習(xí)的,在看完上面的資料后,雖然能寫出來一些挺漂亮的頁面,但是我自己知道很多都是不符合標(biāo)準(zhǔn)的,更不要說代碼風(fēng)格什么的。這只能通過不斷地積累和增加代碼量來提高。由于明白服務(wù)器端需要耗費(fèi)自己大量的時間,所以在發(fā)現(xiàn)自己能夠按照構(gòu)思勉強(qiáng)實(shí)現(xiàn)網(wǎng)頁之后,我就把學(xué)習(xí)中心放到了服務(wù)器端上。不過每天還是會抽空寫一寫網(wǎng)頁,避免手生。
1.2 服務(wù)器端
最先了解的是HTTP協(xié)議,也就是瀏覽器和服務(wù)器之間是如何通信的。也就是當(dāng)你在瀏覽器里鍵入網(wǎng)址按下回車直到網(wǎng)頁顯示在你瀏覽器的這個過程中,瀏覽器和瀏覽器之間發(fā)生了什么事情。這是很有意思的內(nèi)容,我是以讀小說的心情了解了這部分內(nèi)容。了解這部分后,你就會明白類似為什么有時候會有404頁面?在百度搜索框里鍵入的搜索詞是如何提交到百度服務(wù)器的?為什么重新登錄知乎的時候就不用再輸入密碼了?之類的問題了。
HTTP協(xié)議學(xué)習(xí)資料:In Introduction to HTTP Basics
@Vamei的博客:協(xié)議森林
了解了HTTP協(xié)議之后,我就多少有些入迷了。看似神秘難懂的現(xiàn)象其實(shí)原理并不復(fù)雜,你反而會被吸引。接下來就進(jìn)入到我投入時間最多的部分了——后端開發(fā)。記得當(dāng)時了解Web開發(fā)的MVC(Model-View-Controller)模式后,有一種心血噴涌的感覺,覺得太有意思了(程序員別噴,我就是這么沒見過世面)。我們以知乎為例子來說明MVC是個啥:
每個人的主頁都是相同的布局和風(fēng)格,例如最上面的菜單搜索欄,顏色分割,左邊顯示動態(tài)等,右邊是個人信息等,然后具體的內(nèi)容卻因人而異——每個人的頭像,名字,動態(tài)都是不一樣的。那么知乎是如何保證每一個人看到的都是自己的主頁呢?
你可以把這個相同的布局想象成一個模板,里面有一個個空格子,當(dāng)你用你的賬戶登陸頁面時,想象你的電腦里有無數(shù)個小人根據(jù)你的賬號從知乎后臺的數(shù)據(jù)庫里取出你的頭像,動態(tài),認(rèn)證信息等等內(nèi)容,然后對應(yīng)著模板上規(guī)定好的位置,把對應(yīng)的內(nèi)容填進(jìn)去。這些小人的動作實(shí)在是太快了,以至于你覺得這是在瞬間完成的。
上面所說的模板就是MVC中的V,是View的縮寫,負(fù)責(zé)顯示。這樣做的好處在于,如果知乎有一天突然想改變一下個人主頁的風(fēng)格,那么只需要改變這一個模板,然后幾千萬注冊用戶的主頁就相應(yīng)的變化了,因?yàn)槟0迨枪玫?#xff0c;是不是省了很多事情?(早期的Web開發(fā)可不是這樣喲,你可能要一個個用戶去改,非常麻煩。)
而這些小人除了擺放內(nèi)容,它們真正負(fù)責(zé)的是業(yè)務(wù)邏輯,我們把他們叫做Controller,也就是MVC中的C。例如當(dāng)你登陸的時候,這些小人要檢查你的用戶名是不是準(zhǔn)確的,如果準(zhǔn)確,它們要去數(shù)據(jù)庫里取出你請求的信息等,如果用戶名錯誤,它們要攔截住你的登陸。它們的職責(zé)還有很多,無法一一列舉。在實(shí)際中,這些小人做的事情其實(shí)就是Python(或者其它腳本語言)做的事情。
最后,MVC中的Model其實(shí)就是傳給View的數(shù)據(jù),包括上面的頭像,用戶名,動態(tài)等因人而異的數(shù)據(jù)。這些數(shù)據(jù)在知乎服務(wù)器上是以數(shù)據(jù)庫表格(table)的形式存在的,你可以把它們想象成很多不同的excel表格,不同的表格儲存著不同的信息,有些記錄著知乎用戶的個人信息,有些記錄著回答,有些記錄著評論等等,而這些表格之間又彼此聯(lián)系,當(dāng)你在知乎的不同網(wǎng)頁間跳轉(zhuǎn)的時候,上面說的那些小人就根據(jù)你的要求,組合對應(yīng)的表格取出對應(yīng)的數(shù)據(jù),然后把他們放到模板對應(yīng)的空格里,發(fā)送給瀏覽器。然后瀏覽器根據(jù)你寫的CSS,用不同的顏色,大小等等,將數(shù)據(jù)很漂亮的顯示出來。
這樣做的好處是什么呢?雖然你最終在瀏覽器里看到的是一個完整的頁面,但是在后端邏輯上它們都是區(qū)分開的——模型(M),視圖(V)和控制器(C)的區(qū)分就保證了較高的可維護(hù)性——我可以隨時修改主頁的顯示并看到效果,同樣我可以隨時加入一些業(yè)務(wù)邏輯。
如果你的學(xué)習(xí)堅(jiān)持到這里了,首先要恭喜你。其次你可能已經(jīng)知道一些非常成熟的Python Web框架了,例如Django,Flask等等,并且你可能看到了很多小白教程教你直接使用,畢竟大部分人可能覺得沒有必要重復(fù)造輪子。
本來為了省事,我也打算直接用框架。我是在設(shè)計(jì)數(shù)據(jù)庫的時候,當(dāng)時在看SQLAlchemy文檔,覺得相對自己的項(xiàng)目SQLAlchemy太過復(fù)雜,所以我決定自己寫自己的ORM(名詞不懂沒關(guān)系),這對于當(dāng)時的我來說是一件難度非常大的事情。于是我投入了極大的精力每天都在看關(guān)于SQL和Python相關(guān)的教程和資料,Python核心編程(第二版) 給了我很大的啟發(fā)。在自己完成了ORM后,又寫了URL處理函數(shù),同樣沒有用任何現(xiàn)成的Web框架。
現(xiàn)在回頭看,我認(rèn)為這一段時間的造輪子是提升編程能力最快的時候。比如為了寫ORM,就必須去花很多時間學(xué)習(xí)SQL,去了解Python里面的metaclass,而如果用一個現(xiàn)成的框架,我很有可能偷懶不去關(guān)注某些細(xì)節(jié)。而不出問題還好,一旦出問題,我就只能跪。另外,造輪子迫使我在開始的時候就構(gòu)思整個框架,因?yàn)槲冶仨毐M可能的考慮到所有的情況,于是就會不斷的強(qiáng)迫自己完善知識體系,和別人的代碼作對比從而改進(jìn)自己的,這個過程充滿了無盡的挫敗感,但是得來的成就和快樂也是無可比擬的。
SQL書籍:Sams Teach Yourself MySQL in 21 Days
Python:Python核心編程(第二版)
Github上的優(yōu)質(zhì)Python資源:CodementorIO/Python-Learning-Resources
過程中還牽涉到部署,我的網(wǎng)站是跑在Linux上的。關(guān)于部署網(wǎng)上有非常多的優(yōu)質(zhì)教程,一搜一大把。這里就不再贅述。
這些是我學(xué)習(xí)大致路線,當(dāng)然過程中充滿著小的磕磕絆絆,雖然網(wǎng)站上線了,貌似運(yùn)行還比較順利,但是如果以一個程序員的標(biāo)準(zhǔn)來要求自己,自己依然非常菜鳥。不過我并沒有以前那樣懼怕技術(shù)了,就像你明白魔術(shù)的背后的原理后,會更多的思考原理本身。
2. 自學(xué)編程需要注意的問題
很多人都推薦小白第一門語言選Python,因?yàn)檎Z法簡單。這句話只說了一半,Python確實(shí)容易上手,對初學(xué)者的門檻很低。但我發(fā)現(xiàn),對于小白真正的門檻在于系統(tǒng)知識,這就和用什么語言完全沒有任何關(guān)系了。例如很多人學(xué)完了Python的語法,覺得確實(shí)簡單,但是轉(zhuǎn)頭去用Python標(biāo)準(zhǔn)庫的時候,卻發(fā)現(xiàn)自己連文檔都看不懂。標(biāo)準(zhǔn)庫提供了Python和其它系統(tǒng)功能的接口,最終實(shí)現(xiàn)了Python和系統(tǒng)之間的互動。讀標(biāo)準(zhǔn)庫需要系統(tǒng)知識,比如操作系統(tǒng),數(shù)據(jù)庫,進(jìn)程和線程,socket編程,網(wǎng)絡(luò)協(xié)議等等,這些對于編程小白來才構(gòu)成很高的門檻,但是只有學(xué)會這些,才能真正發(fā)揮出Python的威力來。
這也是我覺得自己的經(jīng)歷對小白是有價值的一個原因。因?yàn)樵O(shè)計(jì)一個動態(tài)的網(wǎng)頁是一個很不錯的練手Project。建立網(wǎng)頁(Web App)會逼迫你了解從你在瀏覽器里鍵入地址按下回車到網(wǎng)頁顯示在瀏覽器的過程中,瀏覽器,網(wǎng)絡(luò),服務(wù)器都干了些什么。具體到技術(shù)上面,你不得不去學(xué)習(xí)前端的HTML,CSS和JavaScript,后端的腳本,數(shù)據(jù)庫,操作系統(tǒng)等。也就是說,這個過程能夠促使你去主動學(xué)習(xí)上面提到的系統(tǒng)知識,如果你再做另外一個項(xiàng)目,你就不會像現(xiàn)在這樣無從下手,而有能力去進(jìn)行一些技術(shù)性的探討,所以我認(rèn)為這是一個非常好的練手項(xiàng)目。
2.1 一定要空出時間補(bǔ)充理論知識
很多人會強(qiáng)調(diào)learn by doing,邊做項(xiàng)目邊學(xué)習(xí),這也是我自己采用的方式。在這種方式中,你不斷犯錯,改正……學(xué)習(xí)效率非常高。但是,很多人走了極端,最后的結(jié)果就是不注意理論知識的學(xué)習(xí)。你會發(fā)現(xiàn)自己Google的能力越來越高,但是真實(shí)的編程能力并沒有得到提升。如果有這種情況,你需要反思一下。
一種可能是你太過于依賴各種成熟的框架,結(jié)果編程就變成了用「膠水」去粘合不同的框架完成需求。就好比你的Web App用了SQLAlchemy,雖然自己不太懂SQL,但是網(wǎng)站跑的也還不錯。這時候如果數(shù)據(jù)庫出現(xiàn)了問題,那你就只能跪了。
另外一種可能是你完全沉浸在做項(xiàng)目中,忽略了學(xué)習(xí)理論知識。做項(xiàng)目雖然充滿困難,但回報(bào)是強(qiáng)烈的成就感,很容易沉浸其中。我覺得這是極其錯誤的。首先半路出家的程序員都沒有經(jīng)過系統(tǒng)的學(xué)習(xí),沒有形成自己的知識體系,如果你不懂?dāng)?shù)據(jù)結(jié)構(gòu),算法復(fù)雜度,操作系統(tǒng)這些理論,那么你能達(dá)到的高度就極其有限。所以,在每天做項(xiàng)目的同時,一定要保證抽出一定的時間,惡補(bǔ)理論知識。這部分的書單在豆瓣和知乎上都有很多總結(jié),可以自行搜索。如果大家對Python感興趣的話,可以加一下我們的學(xué)習(xí)交流摳摳群哦:649825285,免費(fèi)領(lǐng)取一套學(xué)習(xí)資料和視頻課程喲~
2.2 不要太糾結(jié)于無意義的問題
比如什么框架好,XX語言比XX語言好啦這種問題。前期確定了練手項(xiàng)目,就去專心積累代碼量,積累基礎(chǔ)知識。那些你現(xiàn)在還看不懂的炫酷技術(shù)你慢慢也就能明白是怎么回事了,反而沒有基礎(chǔ),再炫酷的框架對你而言都是天書。
2.3 學(xué)會發(fā)問
好問題是建立在你自己已經(jīng)實(shí)踐或者思考的基礎(chǔ)上問出來的,這是對自己的負(fù)責(zé),也是對別人的尊重。不要一遇到困難就喜歡直接上網(wǎng)搜索:「這個問題是怎么回事啊?」,「我不明白你能不能幫我看看……」。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的如何零基础开始自学Python编程,值得一看!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手撕 CNN 之 AlexNet(PyT
- 下一篇: 对于我这个软妹子来说,为什么python