如何處理 Python 入門難以進步的現象?

看視頻看呀看呀看, 看完了,基礎的都懂了 然後就想寫點東西 可是無從下手呀,我以為基礎不紮實,又去看視頻 好了 視頻看完了 想網上找點習題來做,結果簡單的習題做不出來,又懷疑基礎沒學好呀 又看視頻和網上的文章 如此的循環著 學習有一個月了 我困惑的是,很難把知識點結合起來寫個簡單的東西 比如說目錄遍歷都寫不出來 我知道站在岸上學不會游泳 你們可能會叫我多練 , 可是我想知道怎麼去練 如何練 不能沒有目的的去練, 其實我PHP也是如此的,能看懂代碼就是難下筆 一身勁,不知如何用…… 我不懶 我把每天安排滿滿的 除了吃飯 不玩遊戲 不看電影 很少上Q 只是每晚睡覺前看下知乎 看知乎以來第一次提問

=========================================
補充:

很感謝各位的回復!也有很多人跟我一樣困惑的!
也感謝徐大肉這位朋友! 但是你回答還不能解除我心中的困惑. 你說的一些開源項目,比如說:sqlmapproject/sqlmap · GitHub 注入神器 等. 你是讓我們去看他們是怎麼寫的嗎? 還是照抄一遍。
因為很多人說,多練習, 我就針對這個問題來說吧。 很多人都說練習沒有給出明確的怎麼練習,難道是對著書中抄一遍嗎? 我真的不理解這樣能幫忙自己什麼。
對於目前以0基礎的人,是沒有C語言等其它語言基礎的。 因為不像有基礎的同學。2個星期看一遍官方文檔就能夠寫了. 這對他們來說可以是小菜一碟呀.

其實上面說了這麼多,我的心中大約隱隱的有答案。 我們所缺少的就是編程思想呀 照著書中抄行不通呀!

那麼問題又來了? 如何培養 編程思維 ? 讓自己從自己所學的知識結合起來。 我相信有好多關注這個問題的朋友是能看懂代碼,能修改代碼。 就是不知道從何下手寫的!

一時頭腦發熱寫出來的!可能我上面所說的編程思維有不對不要噴呀!


今天本來以為在評論里互相探討問題,沒想到火藥味這麼大,後來看到答案才知道自己被噴了.作者在答案里噴完不爽又來評論里噴,也不知道為啥這麼大的火氣.

說明以下幾點:
1. 寫幾個腳本,分享一下star的python代碼,就叫裝X,也挺無語了.
2. 剛寫答案的時候題主還沒有補充內容,看前半段的時候題主沒有說是0基礎,所以當時也沒考慮題主0基礎的情況.
3. 也不知道怎麼看出我不理解函數式編程,面向對象,面向過程的概念了.

=================================
更新2015-03-20 13:50:24

lz可以問問自己為什麼要編程?為什麼要學python,不就是為用嗎!!!
難道lz沒有什麼idea想要在電腦上實現,光學習腦子裡根本記不住.

至於優秀的開源項目的確很有用,它都是好多人總結提煉成的,你可以想一想如果你要實現sqlmap你改怎麼做,不是要你敲一遍,是讓你理解它的思維.而且它的代碼格式和習慣都是應當值得學習的.

比如我以前這麼寫:

if value &> 100:
value = 100
if value &< 0: value =0

看到別人這麼寫:

max(min(value, 100), 0)

再比如我原來這麼寫:

if value:
a = 1
else:
a = 2

後來我看到原來可以這麼寫:

a = 1 if value else 2

我也是個大菜鳥,還在學習,我知道的就這麼多了...


============================================
原稿

這裡有個項目,每天一題,可以試著做一下 Yixiaohan/show-me-the-code · GitHub
外國的一個遊戲網站,有中文翻譯,具體沒做過,不過看起來還挺好玩的 http://www.checkio.org
還有就是 leetcode 裡面有 python 的題目可以拿來練手

=============================================
更新 2015年02月06日20:53:46

從簡單入手,說實話看書或者看視頻有限,許多問題書上根本學不到,介紹一下自己寫的幫題主打開一下思路.

項目一:遠程關機
有時候有事情去不了實驗室,實驗室的機子也不能總開著啊,然後就寫了個腳本,通過微博關實驗室的電腦.

地址: taizilongxu/weibo_robot · GitHub

項目二: douban.fm

有一天逛著 github 發現了這個:

這個是 node.js 做的,自己也不太會,就拿 python 仿照著做了一個,一開始以為挺簡單的,後來實際操作中發現還是有困難的,自己還是菜鳥,邊學習邊做, shell, 線程進程,同步非同步,日誌,異常,跨平台,重構優化,各種意想不到的 bug,包發布,還得自己抓 豆瓣的 API...不過最後還是可以用了

地址: taizilongxu/douban.fm · GitHub

項目三:網站

自己收藏看的,一個簡單網站論壇的 tornado 的源碼 littlethunder/ustchacker.com · GitHub
這個是 the5fire 的 django blog the5fire/django_selfblog · GitHub
還有個tango with django 的中文教程 Tango with Django 中文文檔

一些比較小的項目,利於初學者能看懂的:

Flowerowl/ici · GitHub 在在終端上查詢單詞
bfontaine/term2048 · GitHub 終端上的2048
np1/mps-youtube · GitHub 終端上的 youtube
skyline75489/SimpleDNS · GitHub A lightweight yet useful proxy DNS server powered by Python Twisted
binux/qiandao · GitHub 每日定時簽到
jiffies/GouYong · GitHub linux 下劃詞翻譯
laiwei/thepast · GitHub 你好舊時光
DTVD/rainbowstream · GitHub Terminal-based Twitter Client

還有一些收藏的用 python 寫的開源項目:

binux/pyspider · GitHub 一個可視化的爬蟲
scrapy/scrapy · GitHub python知名爬蟲
mitsuhiko/flask · GitHub flask, web 微框架
reddit/reddit · GitHub reddit網站源代碼
tornadoweb/tornado · GitHub 知乎使用的 web 框架(非同步)
kennethreitz/requests · GitHub 給人用的HTTP
whtsky/WeRoBot · GitHub 微信機器人框架
goagent/goagent · GitHub 大名的goagent
sqlmapproject/sqlmap · GitHub 注入神器
ipython/ipython · GitHub ipython
LiuLang/bcloud · GitHub 百度網盤 linux 客戶端

最後還有一個 vinta/awesome-python · GitHub ,這個比較全了, awesome 系列.

先寫到這,發現其他的再補充


我並不想回答LZ遇到的問題,建議他選擇其他行業發展,沒必要搞得這麼累。我只想回答「如何處理 Python 入門難以進步的現象?」這件事。


Python上手極為容易,但是進階的人卻很少。Python極為容易給人一種「好像什麼都會了,但是真的寫起來又感覺好像都不熟悉」的感覺。除了浮躁的風氣以外,不得要領我覺得也是重要的一方面。如果你感覺自己入門了,但是難以進步,說明還有救。我的建議如下:


1. 臨摹。Github有非常多項目,我學習的路上曾經花了不少時間去臨摹別人寫代碼的方式,就是看他們怎麼設計一個項目,怎麼表達關係,怎麼調用。但是臨摹不是忘卻自己,而是在學習別人的時候保留自己的風格,取其精華,去其糟粕。

2. 造輪子。舉個例子,現在有不少的用markdown生成靜態頁面的工具,比如Pelican,Nikola,甚至 Flask作者寫的Lektor。可能你會有自己對這種工具的理解,想做一個給自己用。那麼不妨自己「造這麼個輪子」,其實重要的是過程,造完或者造的中途你會知道它的缺點和弊端以及優勢。尤其是看過其他工具的代碼,對比下就知道哪些地方做得不好。這個過程獲得的提升很大。之前都是入門,等你自己真的完整的自己做一個,做一遍,你就會發現對這部分已經屬於「精通」了,以後再做對應的技術選型就非常清楚其中的利弊了。甚至還能寫一篇見解深刻的文章分享給別人,否者只能看別人的汾江。

3. 集百家之長。多看別人寫的博客,訂閱列表。別人代碼和理解也看了,你的代碼也寫了,你也有了自己對一些事情的看法,剩下的就是摸索一套自己寫代碼,設計項目,DEBUG和解決問題的「套路」。

最後,最重要的是,你對編程這件事有興趣,有自我驅動力,也願意花時間。

歡迎關注本人的微信公眾號獲取更多Python相關的內容(也可以直接搜索「Python之美」):

http://weixin.qq.com/r/D0zH35LE_s_Frda89xkd (二維碼自動識別)


你的學習順序反了,這當然容易陷入到迷惘之中。

我們都經過了大量的學習,才混到今天。但是我國的學校教育,可能給了很多人誤導,讓人喪失了自我學習的能力。

其實編程是一個超級實踐課程。看書是不夠的,做例子是不夠的,做習題也是不夠的。因為書、例子、習題都不能涵蓋你未來需要的所有技能。同時,你的目標不是考試得到一個好的成績,不是game the system,而是學會一種技能。

所以,你的學習方法錯了。

我一向建議所有的初學者,所有的自學者。在學會任何一點基礎知識的時候,就開始實踐。從實踐出發,用實踐牽引你學習。

比如,你現在開始學習文件系統和目錄了,那好,你可以設計一個小項目給自己。比如,在你自己的硬碟裡面遍歷,找出所有的mp3/wav文件,算算空間佔用,等等。

在做這個小項目的時候,你會發現很多書裡面不見得告訴你的知識,你也有可能發現無數種做法。

再比如,你學習到了urllib2的時候,你就應該考慮怎麼做一個爬蟲項目。

Python是一種非常順手的,高效率開發的語言。用來做各種各樣的好玩的工具都是可以的。看你有沒有想法去做了。

學習所有語言都應該這樣。

這樣學習你就不會說,等到遇到一個現實問題的時候,束手無措了。

從干中學,從學中干。

我不是Python專家,但是我用Python做過一些事情,為啥呢,順手。

多年前,我一個朋友想到了一個玩法,他找到了一個巨大無比的人名庫,幾千萬名字,他想按照這些人的google搜索數量排序,得到一個人名的熱度信息,搞不定找到我。我幫他寫了一個python程序,可以每3秒去google搜索一個人名(更頻繁會引發google的防spam機制)。但是這樣全部搜完要很久吧,拿3000萬說要3年,30000000/(60*60*24/3)。然後我再幫他寫了個程序把幾千萬的人名切成幾十份,然後他去找朋友的機器來運行,湊了幾十台機器,一個月不到就抓完了。一個最簡單的分散式爬蟲就做好了。

做這個之前,我其實對Python沒啥了解的,就是估計Python做這個很順手,比其他語言簡單就用了Python,後來果然是,其實這代碼也就10-20行的樣子吧。


不要刷題。做項目。

@徐大肉 推薦的那個 github repository 就是挺好的。

我剛開始學 Python 的時候,就是把以前用 Java+Ant+Bash 寫的項目打包工具用 python 寫了一遍。後來覺得不爽,再用 PyQt 加了個 GUI 界面。

如果覺得純寫 Python 不爽,可以學一個 GUI 庫,寫點 GUI 程序,這樣對初學者應該更有成就感。


收藏是點贊兩倍喲!順手點讚唄~

很多人在學習編程之初都會碰到這種問題:學會了基礎的語法了,但是還是做不了項目,不知道如何下手。

當初,我學習C的時候是這樣、Java的時候是這樣、Python的時候也是這樣,其實不管什麼語言、什麼知識都是這樣:理論基礎知識 - 能動手做項目是有一道鴻溝的

那麼如何突破這條鴻溝?中間的橋樑是什麼?

其實題主自己已經回答出來了:照抄!

所謂照抄前提是有樣本。

首先找到一些簡單易上手的項目,這些項目大多散落在Python實踐相關的書籍中、Github上,這些實戰項目知乎上都有很多推薦。

1.一些比較好的適合初學者動手的項目:

  • Show-Me-the-Code/show-me-the-code
  • aosabook/500lines

另外知乎上這個問題下的一些推薦的項目還是非常適合新手練習的,可以作為參考:Python 的練手項目有哪些值得推薦?

2.大多數的Python書裡面(除了純理論書)都是有小項目的,而且書的一個優點是它會一步一步解釋這樣做的原因。

先照抄這些項目,實現這些小功能在電腦上能運行確認無誤之後,回過頭來看代碼:

  • 有沒有你不理解的地方,不理解的地方標記去搜索引擎或者書中找解釋。
  • 學習作者設計這個項目的思路方法,並運用到接下來的項目,如果時間充裕,建議隔天再重新再不看書的情況下重新自己實現一遍這些小項目。

如果你是跟著實戰的書敲代碼的,很多時候項目都不會一遍運行成功,那麼你就要根據各種報錯去尋找原因,這也是一個學習的過程。

總結起來從Python入門跳出來的過程分為三步:照抄、照抄之後的理解、重新自己實現。

很多人問我如何學習Python爬蟲,為此我整理編寫了一本Python爬蟲相關的電子書,主要包括Python入門、Python爬蟲入門到進階、Python爬蟲面試總結等等。可以在微信公眾號【一個程序員的日常】後台回復關鍵詞【1】獲取這本電子書。


跟著這個CS 61A Spring 2015教程把練習和lab都弄懂, 還愁學不會python嗎? 至於學會了之後可以幹啥, 這跟學會了認字以後可以寫啥是一樣樣的.


畢業第一年, 女朋友出國了, 業餘時間一大把, 說起興趣還是喜歡搗騰電腦、

後來閑著沒事逛逛知乎, 經常看到Python妹的各種"軟文"....他媽的就這麼上鉤了。於是我開始廣泛搜集關於Python妹的各種資料, 就像喜歡一個姑娘就想要知道關於她的一切.....

一開始,花了大量時間泡論壇。海量紛繁無序的資料,知識零散。大海撈針式的搜尋、問題有問無解
。在資料尋找和篩選中耗費大量時間。然後。然後就沒有然後了,然後就學不下去了。


摩擦出愛的火花*某一天我突然找了我的真愛。第一眼見到python妹, 我就愛上了她, 當時我唯一的寶典秘籍就是《明星python教程》。從了解她中的主要姿勢開始, 沒過多久, 我就能夠利用已掌握的姿勢, 舉一反三地跟她玩出新花樣來, 那些日子真可謂夜夜笙歌,欲罷不能啊....

步入婚姻殿堂*經過時間和實踐的檢驗, 我決定下半輩子就跟她一塊過了...我用Evernote記錄下我和Python妹的所有記憶, 當我記不得一些重要的"紀念日"的時候, Python妹她就會沖我發飆, 愛答不理的, 於是我偷偷翻一下Evernote, 我就記起來了, Python妹又是那麼的溫柔體貼了^_^

創造愛的結晶*在某寶上兼職程序代寫了一段時間, 排名第一的店裡的所有Python單子都是我的完成的, 還有很多本來客戶要求用C/C++或C#的訂單, 都被我忽悠成Python的了....Python的開發效率讓我兼職第一個月的收入就甩開我本職工作薪水好幾條街....好幾倍好么..實在是太快了...在兼職的這段時間裡, 我的姿勢長進速度迅猛, 比那書上的例子.......(不黑書上的例子了, 沒有家裡的黃臉婆你哪傍的上小三啊)...在實踐中學習是最快的, 也是最好的.

平時, 訂閱並關注著一些前輩:學習他們對生活的感悟和最新的姿勢, 運用到我的生活中來。
現在我想把與Python妹激情史做個總結吧, 幫助大家學習Python,

PS我與與python的激情過程盤點,其中主要的一些方法:學習好的寶典+實戰
1、免費視頻看教程——麥子學院官網。
2、自己本地練習。編程還是要實踐出真知。
3、資料查詢。google,stackoverflow等多關注。
4、交流。各種論壇上的python group,論壇。最早去的CU,JavaEye,不過現在貌似去的少了。google group 必須訂閱。

推薦幾個和python滾床單的地方:(不要告訴別人哦)
Head
First Python 中文版

麥子學院-《明星python教程》
Dive.Into.Python中文版(附課程源碼)
Python核心編程
深入理解Python
Python標準庫
Python編程指南

社區

42區:網站開發.漫遊指南

知乎社區:

51cto::

百度貼吧 : python吧 編程吧 技術開發吧

豆瓣Python編程小組

企鵝群:

明星python修鍊:(459463025)

python高級編程:(8587388)

python初學者交流 :( 82412711)

周刊

Python
Weekly:每周更新,包括Python相關的文章、教程、演講、書籍、項目、工作等。

Pycoder"s Weekly:與Python
Weekly類似,兩者可以互為補充,了解過去一周動態。

碼農周刊: developerWorks出品的周刊,來自國人的分享。可以先看為什麼要做《碼農周刊》?;接著《碼農周刊》用到的一些技術; 再接著周刊回顧。這裡不僅僅是Python。


題主慢慢來,第一名的答案就是最好的答案,腳踏實地,多寫多思考。達成只是時間問題。然而你會在知乎上面遇到一些以下的心理打擊,下面我就來開導開導你。

A:「我兩星期學會了python,這是網站鏈接:...」
然後教你怎麼怎麼,這種打擊新手的回答較為初級,沒多少人中招。大家都猜到他有幾年以上編程經驗了。

B:」我無編程經驗,三個月的時間學會了xx語言,這是我做的xx項目,現在在和同事們趕yy項目」
喲,學了三個月就學會並且找到工作啦?然而你幹了8年的產品經理,隔天就和程序吵架扯皮的崗位,並且在生產環境中學習,三個月算慢了。

C:「本人大一狗,漢語言文學專業,在我做幾個xxx項目中都遇到過yyy問題,讀了某大神的書後豁然開朗blabla」(注意,書是英文版)
然而你13歲開始學編程,老爹是程序員,何必亮出自己大一且非科班身份來暗示自己牛逼?

注意到沒有,以上的舉例的回答中,答主都沒有撒謊,然而卻有意地抹去了一些背景信息,滿足他虛榮心的同時給你造成誤導。

程序員群體中「小部分」人在面對新手提問時有自負、智商高人一等的心態。

儘管我確信他們的回答是真誠希望能幫到你,但在答題的時候又有意而含蓄地表露自己是多麼多麼聰明,比如兩星期學會了什麼什麼。

而為了掩蓋自己賣弄的特質,又把文風弄成萌萌噠的手法,從而使得別人實在不好意思對這樣一個「萌萌噠「的人開口說他裝逼(實際上他是在裝逼)。我看了真是不勝其煩。


這個問題我想回答一下,分享一下我自己的經驗和看法。

我是一直反對類似高票答案這樣,以及一些長長的「新手指南」里講的,讓一個初學者用盡Python這把「瑞士軍刀」把所有可以依賴Python實現的方方面面都來上一遍的。我的理由很簡單,懂Python的基礎語法,和了解外部包並得以應用是兩個事情,而了解各個方面的包對於初學者來說,耗時費力,事倍功半。

我認為正確和理性的學習方法還是有所目標,也就是究竟想學會Python來做什麼。比如你想用來做個網站,那學完Python基礎語法後就應該研究研究Flask,那些爬蟲、數據分析、數學模型等可以放一放,等到主線的學習任務要用到其他方面的工具時,可以回過頭來再學。相應的,如果你學習Python就是用來做數據工作的,那麼一些Web框架和搭建網站的小練習應該先放棄不學。

我很喜歡Python,一開始學習時也是看了一些書和很多教程,類似高票答案一樣,會讓你接觸到GUI、爬蟲、數學、WEB等一系列Python可用的方面,各式各樣依賴不同包的小練習搞得我手足無措,挫敗感很強,我大致回想了一下,大概能做出來裡面練習題的三成不到,剩下的七成完全下不了手。

好在我本身學習Python還是目的性很強的,就是為了搞網站,不為別的。所以在我基本了解Python的語法後,開始讀Flask的相關文檔,並動手做網站。這之中會遇到各種問題,然而有賴於我一直就把全部的精力學習這一個方面,所以比分散精力去研究各種不同的包更容易獲得一小步一小步的成功,每一小步的成功,解決一個小問題,我很有成就感,進而有足夠的動力繼續前進,最終,因為我總是在一條路上前進,因而我能走的更遠

所以,我對題主的建議就是,我相信你有足夠的能力學習好Python的基本語法知識,之後你所要做的,就是選擇Python應用的一個方面,在這一個方面不斷的學習、研究和動手做更多的事情。相應的,放棄Python在無關你所選擇的方面的那些應用,暫時遠離其他方面的練習。


我天資愚笨,唯有術業專攻。


拿我學Android的經歷來說可能更有代入感(什麼,你也會Android?吹牛吧你)

其實我學Android喊了兩三年,一直沒學,最早知道Android是2011年,那時真的只是想『學學』而已,但是沒動力啊,把環境搭建好,寫了個 Hello World 就沒有然後了。為什麼?因為沒目標,堅持不下去。

又過了一兩年,到了15年,Android在國內市場基本到了飽和的狀態,突然又想起了要學Android,不過這次的目的不是『學』,而是想『做』個東西出來,就是做一個技術網站的APP客戶端出來,目標有了之後,就開始幹了。於是乎,在網上買了一本書,這本書應該是叫《第一行代碼》,很好的Android入門書,跟著書把前面幾章看完了,大概1/3的樣子,一邊看一邊敲代碼,大概知道了Android的開發流程。於是,朝自己的目標前進。開始按照書上的例子,把各種控制項利用起來,界面畫出來了,但是不知道怎麼和服務端進行數據交互,然後又往後面翻,找到了一些數據交互的例子,按葫蘆畫瓢。可以想像的到,做第一個項目遇到的問題會非常多,因為這是的你,知識面不夠全面,很多地方都摸不清方向,於是你找Google,找StackOverflow,甚至找Github,經歷九九八十一難之後,你終於把項目做出來了。

這時的你自信心大增,走路都感覺要飄起來了。細細地品味著你的作品,與身邊的分享你的成果,沒有什麼比這更美好的了。

此刻,才算得上真正入門。算了,實在編不下去了,2333....


昨天正好回答了這個問題:
軟體專業成績很好但是實際能力很差怎麼辦? - 周筠的回答

感覺兩個問題的題主的困惑是類似的。

我在我是一隻IT小小鳥 的書評區看到好些讀者都覺得徐宥的體會對自己幫助特別大。徐宥在故事(徐宥:掉進讀書的兔子洞)里分享了自己是怎樣練習動手編程的。他的訣竅是——
一行行敲經典書上的程序樣例代碼

他說
大四時我又敲了《A Byte of Python》,前段時間又敲完了《The Awk Book》,都是不到一個月立即從初學者成長為細節很熟、代碼順手拈來的熟練使用者

在下面這幾段文字里,徐宥詳細分享了自己一行行敲經典書上的程序樣例代碼的過程和體會:

整個大一大二,我憑藉著簡單的自學的理念,開始了兩件事情,敲《Thinking in Java》(TIJ)和《The TeXbook》上的每一個樣例。
敲TIJ的機緣其實很簡單,我是在軟體學院聽課的時候看到他們教Java,但是他們用的《Java 大學教程》太貴了,我捨不得買。 我在網上搜了一圈,發現《Thinking in Java》是一本免費的英文電子書。於是,我就在數學系的機房,每天下午和晚上,開著一台計算機,屏幕上放著這個電子書,再用我很土的筆記本,運行著未註冊的 JCreator,一個字母一個字母地敲TIJ上面的程序。我很偏激地認為拷貝粘帖的程序記不住,所以每個字母都自己動手敲。就這樣,花了一個學期,居然就把所有的程序敲完了,基本上Java 的方方面面,我也瞭然於胸了
敲完《Thinking in Java》之後沒幾天,我們就期末考試了。那一次考試的試題是用LaTeX 排版的,而不是手寫的。我考試的時候就問監考老師這玩意怎麼排版出來的,因為我知道Word軟體做不到這個效果。 監考老師除了對我不認真考試表示不滿外, 還算仁慈,告訴了我LaTeX 這個名詞。寒假裡,我就買了一本LaTeX教程。然後,突然認識到,原來TeX 居然是我最熱愛的Knuth的傑作,於是我就瘋狂地開始學TeX。我的方法還是一樣,敲例子。記得《The TeXbook》上有一個程序,Knuth讓大家自己照著敲入計算機,然後還很幽默地說,實驗證明,只有很少的人會按照他說的敲入這個程序,而這部分人,卻是學TeX學得最好的人。看到這裡我會心一笑,覺得自己的方法原來也不算笨。從此,一字不漏敲入一本書的程序成了我推薦別人學習語言的最好辦法。後來大四時我又敲了《A Byte of Python》,前段時間又敲完了《The Awk Book》,都是不到一個月立即從初學者成長為細節很熟、代碼順手拈來的熟練使用者。順著這個方法,大二我把《組合數學引論》和上海交通大學出版社出版的一本《離散數學》上的題目都做一題不漏地做完了。當時選這兩本書也沒有特別的目的,就覺得這東西應該是計算機的數學基礎。這些積累,在大四全部都顯現了出來。

而書中另一位小小鳥——畢業於北大計算機系,現任Google產品經理的辜新星也有類似的體會,他在自己的故事(辜新星:時刻調整方向 找到人生的藍海)中寫了自己面對編程基礎差的弱點是怎樣進行針對性強化的,他的體會是:
堅持在讀書的時候把代碼一行行親手敲出來並編譯通過。這種學習方法很需要毅力,畢竟當你看著書上的代碼覺得很容易懂的時候往往懶於動手,但也只有動手才能發現各種問題,比如用C++寫class總是忘了最後的分號,縮進不一致導致少寫一邊大括弧,等等。


更詳細的描述看下段摘錄:

當大一下學期開始增強對編程的要求時,我缺乏編程基礎的弱點就明顯暴露出來。加上身邊還有不少熟悉編程語言甚至有過計算機競賽經驗的同學,我跟他們的差距就越發明顯:常常自己調試半天找不出Bug所在,而有經驗的同學一眼就能告訴我答案。有差距,就要追。怎麼追——
1.買書,編程的,大部頭,很多。從編程語言到編程風格,再到數據結構和演算法,幾乎每本書我都是從頭到尾抱著仔細讀完的
2.堅持在讀書的時候把代碼一行行親手敲出來並編譯通過。這種學習方法很需要毅力,畢竟當你看著書上的代碼覺得很容易懂的時候往往懶於動手,但也只有動手才能發現各種問題,比如用C++寫class總是忘了最後的分號,縮進不一致導致少寫一邊大括弧,等等
3.提前做知識儲備。在學習編程技術的時候,我還提前了解了一些編譯器和計算機體系結構的知識,對於我理解程序的運行和性能的瓶頸有了很大幫助。
4.貴人指路,事半功倍。CSDN、Joel On Software等網站上的程序員,他們在博客上無私分享的心得和在論壇提供的及時幫助不僅讓我獲得了知識,也給了我極大的鼓勵,讓我能堅持艱苦的學習。

推薦:
來吧,IT小小鳥(持續不定期更新) - 虛晃一槍 - 知乎專欄


其實這壓根不是學Python的問題,而是學計算機的問題,不光學Python會遇到,學任何語言都會遇到這樣的問題。

我一直覺得,編程在某種程度上和寫作無比類似。編程語言的意義和紙筆類似,是寫東西的必要條件,但不充分。學會了編程語言,不過是有了在用筆在紙上寫字的能力,離能寫出好的文章差的可遠著吶。

那麼,怎麼才能提高寫出東西的能力?這個和寫作一樣,首先你得有寫的動力,其次是要學習如何去寫,最後才是多寫。

動力是最重要的。不管是因為興趣愛好還是因為生活所迫,你都需要給自己一個努力的理由。除了敦促你努力,帶來動力的源泉往往會直接或間接的指明你的努力方向,這對後續發展有很大幫助。如果你的動力是應聘好公司拿高薪,那麼目標公司的職位要求就是你的方向;如果你想寫出有趣的網站,那麼web相關就是你的方向;如果你對編程語言本身感到著迷,那麼編程語言理論或編譯器就是你的方向。這樣,你就不會迷茫,今天寫個爬蟲,明天寫個貪吃蛇,可過了好久發現自己還在原地踏步。

接下來是學習如何去寫。說白了就是學,使勁學,把你希望的方向里能學會的全學會。先爬上巨人的肩膀才有可能墊高巨人的肩膀。

最後才是多寫。什麼也不學的瞎寫是毫無意義的。在沒有學會許多東西之前一味強調多寫是十分愚蠢的事情。當你學了一些東西時,寫的時機才到了。這時去放手實踐你學到的東西吧。

之後的路就相對清晰了。一直學下去,寫下去,就這麼簡單。

我想,對大部分人來說,最難的就是找到動力源泉了。可惜,我也沒有通用的方法幫你找到它。對於此,似乎只能看運氣咯。


不知怎的發現了這個「老問題」,趁著晚上又醒來,就隨意嘮叨兩句。
就像武俠小說里的「手中有劍到手中無劍心中有劍」,為何刻意追求「遇到瓶頸如何突破」?
你只需換個角度思考:我的Python編程中碰到哪些問題?然後針對這些問題去思考去加以解決。自此一來,不斷解決問題的過程中,你的編程能力就是在不斷進步的。
好比很多人問:「學習XX中,如何提高」,一個類型的問題。編程是個實踐活動,如果光學而無實踐場景,糾結也是枉然;如果場景太小,比如只是用Python寫點一二三,也就只能「泥溝里嘻戲」,這些都是自然現象,所謂小場景又心太大,就好比「人心不足蛇吞象」。其實這些都是淺顯道理。要想提高編程水平,最佳姿勢就是「到大海里游泳」,到大場景里鍛煉。
話說回來,條件限制情況下,閱讀點別人代碼,看看最佳實踐,多思考問題的解決之道,也是能一定程度提高技能,但「要想代碼寫得好,應用場景不可少」。有了大舞台,跳著跳著,只要不笨,久而久之,誰都能成為舞蹈家。
而如何尋找大舞台呢?這又是另外一個問題了。這也是要看個人造化的,如果你立志用Python編程,但同時又很在意薪資、長久、上升、場景,必然會很糾結。好比找對象,要找到一個如意的,確實需要點兒造化。人生如斯。


要想提高,兩本書即可:
1. Effective Python (豆瓣)
2. Python學習手冊(第4版) (豆瓣)

其他學習資料,可以參考:
你是如何自學 Python 的? - 知乎用戶的回答


題主我給你推薦3本書吧。

利用python進行數據分析
python web開發測試驅動方法
python自然語言處理
都是O.reilly的,個人感覺易學也實用。邊學邊可以寫一些隨時想到的小玩意,有興趣不知不覺就能做出東西來,很多時候感覺無從下手是因為沒什麼興趣。

還有強烈建議安notebook。這個便捷高效的計算器替代品能讓你不知不覺增加tons of編程經驗以供升級,同時還能省出大量時間去……


排名靠前的答案,完全是來裝逼的,根本就沒看清楚題主的情況。
什麼開源項目,什麼自己寫的各種工具,像第一的 @徐大肉的答案,完全變成向題主炫耀:「你看我做了這麼多東西厲害吧,你看我之道那麼多小技巧厲害吧。哎呀其實人家也是菜鳥一枚呢別誇我。」這種回答,看了就來氣,圍觀的已經會寫代碼的人看著很爽,但是對題主的情況一點幫助都沒有。
========吐槽完畢的分割線=================
樓主這種情況,其實很常見。
比如某小學生,一平米等於多少平方厘米,你教了半小時了,他還是不懂,然後沒耐心的老師就開始說了「怎麼這麼簡單的問題你都不會!」。
比如拖延症,患者自己都很痛苦,某些朋友只會說「你別拖延了不就完了么!」
給出這種答案,其實說白了就是無知+無能而已。
拜託如果能不拖延,還叫拖延症么!
拜託題主是「能看懂代碼就是難下筆」好么!
所以我給題主的建議就是:從最基礎的開始,默寫一個helloword開始,書上或者視頻上一章講完,你就默認程序範例,默寫不下來,就再看一遍。基本上你默寫不下來,就說明這裡沒有真正搞懂。
刷題也是個好途徑,那些說刷題有什麼用的,跟問都有matlab了中學學解方程還有毛用的人一樣,不解釋。題主的問題在於,即使比較簡單的題目,也刷不來。但是我相信,你按照第一步把范常式序能自己寫下來了,應該就可以刷一些簡單題目了。
這個過程或許會很長,但是就是在這個過程中,一般來說你會產生一些想法,例如「我每天寫這麼多程序,但是具體寫了多少行有效代碼呢?」,然後你就會想自己寫個統計有效代碼行數的程序吧,也許開始你覺得這個問題很簡單,所以你就直接開始了,然後發現原來沒有想像得那麼簡單,就開始解決各種問題。這個過程你會發現刷題與解決實際問題的差別,就在於實際問題的非理想化。這又是一個快速提升的過程。
等這個階段過去了,再去看一些簡單項目,相信你可以慢慢上手了。此時可以說你算是正式步入及格程序員的行列了。
=============================
其實這個過程跟其他領域的學習無異,無非是從簡單到複雜,從理想問題到實際問題,step by step。如果老是想著一口吃個大胖子,很難快速提升。題主現在的水平,去看開源項目,純屬浪費時間。項目整體為何這樣架構,局部的設計為何這樣,根本無法理解,因為還有更多的編程知識題主沒有接觸過,例如設計模式。


最近比較煩躁,就寫個答案總結一下。

題主這個問題我是深有體會。我來講講我的故事。應該會有所幫助。

在我打定主意轉行寫程序後,就開始按照知乎上各路大神的推薦,買書學習。一開始當然按照推薦從理論學起啦,學完了C它爹寫的書,刷了CSAPP一本,SICP半本,離散數學啊,演算法啊什麼的都看了一遍,離散數學和CSAPP學得尤其精通,都能背下來了,手寫CPU處理指令流程什麼的。

然後一上手寫代碼,蒙圈,這個變數叫什麼名好,用數組還是鏈表,要不要提取成一個函數,這樣寫性能會不會有影響,太多的事在腦子裡盤旋。之前書上練習寫的小代碼根本無濟於事。這時我覺得我需要提高我的設計能力,去學UML圖!去學軟體工程!

嗯,看完還是卵用都沒。

不過我運氣不錯,一個之前諮詢過的大神對我伸出了橄欖枝,和他交流一段時間後,他對我說了一段話:
如果拿編程和飛行比的話,學開飛機相當於學編程,找本做項目的書做完一遍,再做幾個項目就算是熟練工了。
至於基礎那些相當于飛行理論、飛機結構之類的,編程用不著,飛行也用不著。

當時就好像被雷劈中一樣,一下子就醒悟了過來。明白了自己的問題。

其實道理很簡單,寫代碼相當於開飛機,不是造飛機和研究飛機,換個比方就是是開車不是造汽車。理論這些東西,對於駕駛員來說,了解一下理論當然好,但是駕駛技術需要練習,這種練習練的是你的手感,和理論沒什麼關係。

你開車時,會有教練提醒你,方向盤打多少,什麼時候掛擋,用多大力掛擋。這些基礎會變成你的本能,刻在你的腦子裡,每次開車你都會下意識的用上。寫代碼也有類似的東西,這些東西你寫熟練時無法意識到它們的存在,但是它們切切實實的構成了你的基礎。

所以很多人給你推薦介紹的東西,都不會涉及到這些基本的東西,因為對於他們來說這不是什麼重要的,寫多了就有了,變成習慣了,他們會推薦自己能察覺到的東西。這就是心理學上的一個名詞,「知識的詛咒」,就是專家思考時,自己意識不到自己運用了哪些背景知識。

開車有開車的風格,開飛機有開飛機的風格。都是多練習得到的。所以寫代碼的基礎,就是代碼風格。

所以要多寫代碼,多看代碼,總結養成好的代碼風格。光是做項目瞎練也是不行的。

但是並不是大神就有好的代碼風格的,大神是因為做出了東西牛逼,但是代碼依然可能寫得一團糟,同理好的輪子不一定就源碼寫得漂亮。因為他們當時學得時候,不一定有人告訴他們什麼是好什麼是壞,可能也就瞎寫一氣,寫著寫著自己的思路就固定成這樣了。但是凡事都有標準來分好壞,世界上肯定不存在怎麼樣都行的東西。代碼風格也應該有標準。

那麼什麼是好的代碼風格?

好得代碼風格肯定和性能無關,如果一心想著提高性能,寫出的代碼只是適合機器讀取的。人不是機器,思維無法變成機器的模式。性能優化這種東西,是有需要時再用的。好得代碼風格,應該便於看懂,邏輯結構清晰,一看就讓人明白這代碼能幹嘛。代碼會體現出你的思路,而你的思路好壞是有判斷標準的。首先,能解決問題。其次,簡單易懂。後者往往會更加重要,因為一個誰都無法看懂的思路,往往更難發揮價值。畢竟百年懸而未決的問題稀少,而同一個問題的解決方法,更簡單的思路往往更有價值。

能寫出這樣的代碼,一是你自己的思路清晰,二是別人也能很快看懂接手,三是自己返工時也能很快看懂。

其實代碼風格也是一個綜合性的體現,但是根本標準,就應該是上面提到的這些。

有個簡單可行的操作辦法,就是寫完代碼後,不加註釋,第二天回頭看你能不能很快看懂自己的代碼。能看懂的話應該寫得不錯。好得代碼應該像文章,外行都能看懂,不過這要求有點高了,但是要盡量往這個方向靠攏。

當我想清楚了這些東西後,就明白了自己要努力的方向,自己要培養的能力,以及編程的基礎是什麼。

這些都是別人教我的,不敢冒功。不過這觀點不怎麼主流,我這小透明敢說,反正我代碼寫得爛,也不怕掉粉,所以我就說上一說,你讓我拿出我的成就來背書。抱歉沒有,愛聽聽不聽拉倒。

最後推薦一本書,代碼大全,以及王垠的一篇文章,編程的智慧。

還推薦你去看看蕭井陌的答案,也會對你有很大幫助。


0,學會基礎語法後,明確需求,直接擼代碼。
1,沒處下手?狗之,stackoverflow之,github之,抄代碼,改代碼,跑起來為王。
2,理解抄的代碼,優化或者加一點新玩意(懶就去TMD)。
3,重複以上,實現各種各樣的需求,抄各種各樣的代碼,OK,你學會了。
4,感覺有瓶頸,演算法不會,狗之,HTTP不會,狗之,操作系統不懂,狗之。
5,重複以上,OK,你是高手了。

PS:想想你是怎麼學會騎自行車的?你是把自行車組成原理,空氣動力學,牛頓經典力學啥的都精通一遍才上車的么?
just do it :)


你是用python來干工作還是用來實現書中的數據結構與演算法?
如果是想用來干工作做項目,建議到網上找個實際教程跟著做。假如你做web開發,不妨關注一下django和flask,圖靈出版社最近出了一本flask web開發的書,裡面有一個完整項目的例子,可以跟著做一遍。
如果對python不熟,可以看廖雪峰的python教程還有python基礎教程這本書。
如果想用python來學習計算機的一些課程,推薦udacity的在線課程,老外的教學風格以及深度與實用性都很好,課程很多都是免費的,而且基於python。
手機作答,就不貼說的一些資料鏈接了,可以從網上搜到。


其實題主的這個問題我相信很多初學python的同學都碰到過。前段時間,我也在苦苦尋找進階python的高效方法。看書看視頻,覺得不夠高效以及缺少目的性;做python練手項目,大多是爬蟲以及其他編程類的,我只想好好的做分析啊…

於是我就想哪裡有高效的,目的性強的,數據科學方向的實戰性項目呢?答案當然是kaggle啦!

我以下的回答僅僅針對python數據科學方面的學習(也適用於R語言):

剛才我看到大神@路人甲回答說抄寫代碼,其實我想表達的意思和他相同。抄的目的是為了更加深入理解大神的code,而我的建議是認真吃透大神的報告,至於是抄還是背都可以:)具體原因下面講。

首先關於kaggle的介紹知乎上有很多,請看這裡:Kaggle入門,看這一篇就夠了

ps:kaggle註冊刷新驗證碼時需要掛vpn

kaggle上有一個個實戰項目,並且有不同語言的分析結果(主要是R和python)在kernel模塊,如果你正在同時學習使用這兩個語言,那就更好了。

就拿最經典的titanic預測項目來舉個栗子: Titanic: Machine Learning from Disaster

在kernels里你可以看到別人分享的代碼,可以根據語言篩選,主要有R、Python.

可以根據贊同數從高到低,選擇提交結果為notebook的

可以Fork別人的分享再下載下來,通過ipython notebook或者R,選擇編譯為html文件或者編譯為pdf文件,方便隨時觀閱…我就是這麼做的(R語言可能要用R Markdown自己編譯)

  • ipython以及ipython notebook請看這裡:IPython上手學習筆記
  • R markdown的基本介紹:RStudio 中的 R Markdown

(隨手找的鏈接,大家可以自行搜索)

回到kernel里,隨便點一個,你就能看到的是這樣的一個報告:

首先很多大神提交的notebook開始處都會有一個Outline一樣的東西,基本的順序都一般是:數據導入,數據可視化,缺失值處理,特徵工程,建模,提交結果

其中,每一步都會有作者的總結和思路,這難道不是教科書一般的分析報告嗎!!

再拿這個項目舉個栗子,如果你學習完這篇報告,你至少可以練習掌握以下知識點:

  1. Data Manipulation: numpy以及pandas的知識
  2. Data Visualization: matplotlib和seaborn的基本操作
  3. Data Imputation: 缺失值處理
  4. sklearn中的許多機器學習演算法等等

然而,你會發現你還順帶學習了如何對數據進行有啟發的可視化,缺失值的處理思維,特徵工程的構造思路,模型的檢驗與優化等等。這些東西難道不是更寶貴的財富嗎???

最後,也是最重要的,我們學習這些報告的目的是使我們更加熟練的掌握python,所以就要根據報告里的知識點來發散。比如說:

  1. 最開始你可能只學了matplotlib庫,後來你看到了seaborn。你發現seaborn是一個基於matplotlib的更高級的畫圖工具,於是你就可以順便把seaborn的基本操作學了,比如distplot()
  2. 可能你看了一個處理缺失值的函數,那麼你就可以把pandas里處理缺失值方面的函數都總結一下

通過這樣一篇又一篇的文章下來,我們既熟悉了軟體工具,同時也學習了各種分析思維。然後就可以開始自己的kaggle競賽之旅。總有一天,讓別人也可以來閱讀你分享的代碼:)


推薦閱讀:

有多少人按@蕭井陌大神給出的Python+Flask路線找到工作了?
初學 Python,有哪些 Pythonic 的源碼推薦閱讀?
Python 有哪些好的學習資料或者博客?
相比於 Django、Pylon 等 Python 框架,Ruby on Rails 是否有很大的技術優勢?
TensorFlow 如何入門?

TAG:Python | 編程 | 腳本語言 | Python 入門 |