python的庫、方法這麼多,寫程序的時候能記住嗎?

寫程序時忘記用某個方法/庫怎麼辦?

也許一行代碼就能實現的東西,因為忘記了/不知道某個方法/庫,寫出一長串來;

本來一個程序能寫的更好,卻因為不知道一個方法而優化不了


--

這就是平時的工作方式。vim寫python,沒安裝其他插件,但有自己的配置文件。

常見的項目所常用的函數很難超過50個。大量的業務函數一旦被寫出來就是負責直接處理業務,而不會被其他部分調用,這些是不需要背的。

再把自己寫的共享函數庫整理好,往往常用函數不到10個。應用模塊里引用框架級別的函數也就是二三十個的級別。加上數據中間層,設計好規範後,能背下來必要的數據表就能聯想到對應的介面。

所以,一個不過2萬行代碼的python項目。實際需要背的函數也就是50個左右。

過百贊我就分析個實際項目。

-- 1小時的分割線 --

補充個我當前公司所開發的一個小型項目。相當於是一個網站,以及給客戶端軟體提供ajax api的伺服器。一共10個python文件。4357行。以下逐個文件分析,但不會暴露實際代碼。

1. rtb.py:75行,程序啟動文件,其內的多種調用基本上就是一鎚子的,即可以參考文檔寫完,但項目其他地方不會被使用,且作為啟動文件,其本身也不會被引用。該文件的主要作用就是引用一大堆其他應用的模塊,做URL分派。我因為在項目里同時使用了web.py和flask,所以多花了一點代碼來做WSGI兼容兩個框架的支持。

2. setting.py:56行,設置文件,也可以理解為一鎚子的,而且通用性更強,每次開個新的項目,大可以把以前的配置文件抄過來,只修改必要的部分就可以用了。僅有的兩處小技巧是 socket.gethostname()獲得機器名後區分配置文件的環境,用以避免上線時的混亂。以及獲得設置文件的當前絕對路徑,供其他路徑相關的操作:

CURPATH=os.path.normpath(os.path.join(os.getcwd(),os.path.dirname(__file__)))

3. shareutil.py:275行,web.py框架相關的自定義共享庫,給各個應用模塊提供相關支持。所以這裡的函數是需要背下來的,在其他模塊里比較常用的。比較常用的就是登錄驗證相關的:

1. BasicAuthError:自定義的異常用來強迫用戶使用basic auth登錄,內部系統的好方法

2. needlogin_401():裝飾器函數,用於讓視圖先判斷是否需要用戶登錄,如果未登錄就用HTTP 401來強迫用戶登錄

3. settestlogin_401():設置單元測試時所用的basic auth的header

4. checklogin_header:檢查header方式設置登錄的,這對於javascript使用跨域header方式驗證身份很必要

5. setlogin_header:設置登錄header的方式,返回個字元串給客戶端

6. checklogin_cookie:檢查cookie方式是否登錄了,返回登錄信息

7. needlogin_cookie:檢查視圖是否登錄,未登錄則重定向到登錄頁

8. setlogin_cookie:設置cookie為登錄

9. setlogout_cookie:設置cookie註銷

10. logined_cookie:給單元測試提供已經登錄的一個cookie

11. catcherror:裝飾器,用於捕獲視圖的異常,並顯示為出錯頁面

12. load_sqla:應用啟動時,給上下文提供載入資料庫

13. ApiResponse:我自己定義的JSON響應結構,方便構造ajax api

14. dt_to_isotime:把datetime對象轉換為ISOTIME格式字元串

15. dt_to_ts:把datetime對象轉換為timestamp數字

16. BootstrapForm:繼承自webpy的Form的表單,提供了渲染帶有Bootstrap class的支持

所以根據如上分析,一個項目中常用的也就是三種登錄的一種,對應了函數的needlogin、setlogin、setlogout,三個函數。涉及常用資料庫操作、ajax api的也有三個。總計6個函數需要背。

4. model.py:421行數據模型,裡面有十幾行一鎚子的引用,標準化程度高,可以在項目之間共用。給每個欄位提供類型的需要背一下相關參數,這樣工作效率會高。典型的欄位類型如VARCHAR、INTEGER、PRIMARYKEY、TIMESTAMP,可以算作是四個函數需要背。同時這裡定義了7個表格,背下來對應用的編寫有較大幫助。

5. flaskutil.py:169行。給flask框架用的共享庫。給其他模塊復用的概率大的多。

1. setlogin_cookie:設置cookie方式已登錄

2. setlogout_cookie:設置cookie方式註銷

3. needlogin_cookie_header:用OR方式檢查cookie或header是否包含有效登錄信息

4. setlogin_header:設置登錄過的頭,用以單元測試

5. make_before_request:給每個會話設置資料庫會話

6. teardown_request:在會話結束時清理資料庫資源

7. api_response:提供JSON格式的ajax api響應所需的函數

所以如上可以看到所有這些函數與shareutil有很大重複。這裡不再計入需要背的數量。

6. app_api.py:1405行。ajax api的實際實現,使用了webpy框架。這裡引用的部分不再重複,反正也是要被放棄的。寫了26個API,他們都是直接被暴露出去,不會被其他模塊調用,所以沒必要背。

7. app_compiler:一個編譯器代理,太窄的方向沒必要分析。

8. app_home.py:361行。主頁和登錄邏輯。主要提取一下Flask框架里常用而值得背的幾個函數:

1. render_template:渲染模板的,很簡單

2. redirect:重定向

3. abort:生成錯誤頁面

4. Response:生成格式可定製的響應

5. g:會話相關的全局變數

所以對於常用Flask框架的,這5個函數就需要特別熟悉。

9. app_mgnt.py:871行。管理後台,也是常見的業務模塊,所以互相之間無依賴,使用到的flask功能也同上,不過這裡開始使用Flask的Form,所以需要記住一些常用的欄位類型:TextField、PasswordField、IntegerField、BooleanField、SelectField、TextAreaField,有6個。

10. app_teacher.py:366行。一個業務管理模塊,沒啥新意。

所以根據如上項目的分析可見,需要背下來的函數主要是在項目里需要使用多於1次的。包括框架的功能和自己寫的共享庫等。累計下來一共30個函數或對象。背30個函數可真是沒難度的。

-- 補充 --

web.py的作者去世多年,之後有些人嘗試維護,但維護水平實在不敢恭維。至今在表單缺欄位的處理,單元測試中set-cookie支持等存在缺陷。所以儘管我很喜歡這個框架的思路,但以後不會再用了。


我回答問題描述中說的3點:

1. 寫程序時忘記用某個方法/庫怎麼辦?

精力能力有限,說實話我也記不住。客觀的講,現在的Python標準庫我記住的都是那些常用到的,不常用到的只是會有一個梗概的印象,比如datetime格式化的指令,需要不常用的現找就好了,很多開源項目我可能就粗讀過1-2遍,有些就是知道它的架構、設計特點、怎麼用、和競品的區別和聯繫等等,有些具體的內容也是得現看(除非一些對我來說是很「亮」的點才會記的很清楚),沒必要事事都記住。所以你要學會的是:

1. 用好Google,通過關鍵詞能快速的找到它。

2. 善用官方文檔或者直接翻源碼,前提的之前記憶或者使用過,有過大概的概念。

3. 趁手的編輯器/IDE及相關插件(再加個IPython),主流的工具都提供自動補全、靜態分析、代碼跳轉等功能,你甚至不用離開它就找到你忘記的內容。來來來,強推一波Spacemacs。

之前有同學在評論區問我:

一直想問董大,那麼多的內容,知識,是怎麼( ˉ ? ˉ ?)記住的?

我的回答是:

哈哈,其實沒什麼技巧,熟能生巧。我也是碎片化的記憶,遇到不懂得不熟悉的就找機會去用。在實現某個XX的時候,不是先寫代碼,而是先思考,比如某某內容能不能在這裡用,用的合適不合適等等,漸漸的就會對哪些內容理解的比較清晰,然後就記住了。

2. 也許一行代碼就能實現的東西,因為忘記了/不知道某個方法/庫,寫出一長串來

這是在早期都會存在的問題,我也寫過一坨一坨現在看起來很爛很不pythonic的代碼,這受限於當時對這件事的認知以及對對應的知識儲備,沒什麼可泄氣的。寫代碼的過程中不斷的對自己提高要求,讓你的代碼越來越「優美」,性能好,有一天這些都可以信手拈來。

3. 本來一個程序能寫的更好,卻因為不知道一個方法而優化不了

本質上是視野(經驗)的問題,工作中多從同事的代碼或者review中吸收,自己多看看優秀的開源項目代碼,同樣的一件事情看看人家是怎麼實現的,思考你寫的版本和它的不足之處在哪裡,很多時候還要伴隨著敢質疑和動手這2點。這麼一個長期的不斷積累的過程之後,寫出來的代碼基本就很不容易由於性能、pythonic之類的問題被提意見了,最多的只能是業務需求方面的意見。


題主目前應該處在編程的初級階段,剛開始記不住太正常了,但你很少聽說寫了幾年代碼的人說因為記不住而困惑,原因有二點,其一:經過長期訓練,他已經記住了大部分常用庫的方法,其二:對不他不熟悉的庫,他已經掌握了方法如何查找文檔、善用搜索引擎。

當然能做到過目不忘的人很厲害,不過作為普通人主要還是通過勤能補拙。

對於常用庫,多練習,通過理解的方式記憶,我記得剛開始的學習編程的時候,老師要求我們使用不帶任何自動提示的編輯器寫代碼,忘記怎麼寫了就自己查文檔,久而久之就記住了。


分階段。

先說一下,這個回答里提到的所有熟練度,僅僅是對庫的熟悉,而不是Python技能。

第一階段

最開始接觸Python的時候,可以肯定的回答說不能。完全不能。

如果是一個Python新手,面對海量的庫肯定是完全懵逼的狀態。這一段時間裡不可避免的要依靠官方文檔或者自己造一些傻兮兮的輪子。

這是一個必經的階段,而且說實話沒有什麼的好方法進行規避。這個階段的主要問題在於:根本意識不到Python已經為我準備了工具。

不知道有,所以不用。因為不用,就無所謂記不記了。

解決方案:能有啥方案,自己看文檔去。

第二階段

有一點熟練度之後,能記住一些,同時會使用一些手段來保證效率。

在這一個階段的時候,基本上能把官方文檔刷一遍,對於一些內容有模糊的認識。遇到問題會看一下有沒有現成的輪子可用,同時能夠通過一些輔助手段來增加自己效率。

比如查文檔、自己記筆記、帶提示的IDE等等。

受限於對庫的熟悉程度,還是挺慢,而且這個階段也說不上什麼記住記不住。

不過這個階段非常關鍵,是使用習慣的養成期,所以還是非常關鍵的時期。建議看一下這個問題下面的回答,有不少答主提供了很靠譜的方案。

第三階段

這個時候就可以說是說熟練了。

首先是對於自己的常用部分了如指掌,對於不常使用的部分也有一個大概的印象。

我還到不了這水平,就不多說省的自打臉了。

第四階段

登峰造極了。

建議看一樓答主 @gashero 的回答。

就這樣。


謝邀。

對於常用library或framework的API,用多了自然就記住了。

對於不常用的或是長時間沒用而忘記了的,只能去現場查doc了。

比如TensorFlow,介面眾多,剛開始接觸的時候由於不清楚,也自己造了一些沒必要的造的輪子(關鍵是寫的還沒人家好 =_=!!),後來才知道有些東西Google早就實現好了。

另外,一個強大的IDE(比如PyCharm),可以幫你省掉一些事兒。

以及...經常看看官方文檔有好處。


1.跳轉過去,直接看參數和用法。

2.mac 下用 dash 之類的文檔查詢工具

3.不知道的方法直接google


工程開發的api調用有一個特性是localization,就是說你寫一個項目,可能調用的api數目都是有限的,第一次第二次用需要翻doc來寫入你的臨時記憶,接下來就可以快速調用了。

但我是拒絕把它寫入永久記憶的,大腦不是用來記憶這些可以很快獲取的東西的。


當別人問我用什麼ide時,我說在文檔裡面直接敲,寫好了就在終端跑一遍,基本上檢查幾個拼寫錯誤就能運行通過。

平時利用一些竅門,基本上不用去刻意記很多模塊。其實主要是懶!

第一種是常用模塊,通常記在mac的notes里,我習慣於記筆記到notes上面。只要一個icloud賬號就能關聯所有蘋果設備,在家用air,上班用pro,其他用iphone。想法隨時在變,方便更改。

一旦記不住,打開notes查一下就好了。下面就是我的一個樣例,不是很全,對我自己夠用了。

第二種是不常用,但偶爾會用的模塊。比如flask、scrapy等,這種就是一周不碰,就要重新看代碼的框架。我會寫個完善的腳本,能夠跑的。注釋寫清楚,有幾種思路,分別怎麼實現。等到要用的時候,看看注釋就好了。

第三種,自己寫的函數,可以放到一個地方,import就好;或者組織成一個庫,pip安裝就可以用了。


你需要一個帶智能提示和自動補全的IDE


記不住也是有的,時常自己重複造車輪,但是某天或許會突然間發現還有更好的方式,豁然開朗、瞬間冰消!

其實,自己重複造車輪跟公司的環境有很大關係。公司不能夠自由使用網路,久了也就有了閉門造車的習慣。我覺得題主遇到的問題在我們這種環境下最容易出現。倘若有網路,做什麼之前都先搜索下有沒有成品輪子可以借用,那麼很大程度上能夠加速開發的進程。這樣記住記不住都無所謂了,因為網路會幫你記住!


寫的多了,自然會記住。

你缺一個ipython 這個好東東。

pip install ipython

sudo pip install ipython

如何學習Python 標準庫的問題

1、首先問大家一個問題,為啥能分清楚男女廁所?這個問題有答案的話,對如何學習Python 標準庫的問題就有答案。

2、學習標準庫,首先要知道有哪些標準庫,做到一個臉熟,知道哪個庫的作用。

下次碰到這樣的用途,自然會想起用這個庫。

Python 2 標準庫大本營在這裡 The Python Standard Library

3、以幾個標準庫為例,進一步說明第二點的問題。

urllib2 — extensible library for opening URLs

20.6. urllib2 - extensible library for opening URLs - Python 2.7.13 documentation

從文檔中看到urllib2 是http 請求用的,下次有http 請求這樣的用途自然會想到它。

os — Miscellaneous operating system interfaces

15.1. os - Miscellaneous operating system interfaces - Python 2.7.13 documentation

從文檔看os庫是和操作系統交互的庫,下次有這樣的需求,就可以用上它。

4、有一本書專門講解標準庫,可以看看。

學習標準庫的免費電子書 Python Module of the Week

5、第三方庫的問題,可以利用搜索引擎,要善於用關鍵詞搜素。

6、第三方庫大本營pypi

https://pypi.python.org/pypi


一直翻doc的路過,感覺我寫什麼語言都要翻doc,C++翻,Python翻,Tcl翻,racket翻,JQuery也是經常翻的,大概除了C其他都要翻doc。。可能是我太弱了,也可能是doc翻上癮了,現在翻doc越翻越熟練。C++寫過很多遍的函數也喜歡把doc開起來寫。。Python稍微好些,畢竟對類型沒有這麼嚴格。

所以可能是翻翻有點煩了(主要應該是感覺對一些語言細節把控比較麻煩),正在自己擼個解釋型語言。。強行加入很多自己編程習慣,也是挺有趣的事。

畢竟我們教授說過,大多數計算機語言只有一個人用,就是作者自己哈哈哈,不過這好像和問題沒什麼關係呃。


面向stack overflow編程你以為是笑話?


以前玩war3時候不會英語,秘籍都死記

whosyourdaddy

iseedeadpeople

背著背著就熟了。。。。。。。


裝ipython

1.tab智能提示/補全

2.?查看函數用法。

如?pd.concat()

3.zhihu/baidu/github文檔/stackoverflow


標準庫看一遍還是很有必要的,很多東西標準庫里有現成的,自己寫了一堆,難看不說,寫的還累..血淚教訓


常用的記住,不常用的用dash查


全都記住是不可能的。但是好在python的庫名方法名一般都不長,相對來說還是比較好記的,如果換成java,不用IDE簡直要崩潰。

常用的庫和方法用的多了自然而然就記住了,不常用的也不用刻意去記。寫了快10年python了,分享一下我個人的方法:

1、Google python文檔

大多數python庫的文檔還是很全的,對於每一個類每一個方法的用法都有描述,很多文檔還帶了很詳細的示例代碼。如果遇到文檔比較簡略的庫,stackoverflow上也有很多別人的提問和大牛的回答。

2、IPython中查詢庫和方法說明

在ipython里,import一個類後就可以用&<方法名+?&>的方式查詢這個方法的使用方法,對於類和模塊也一樣,如下所示

3、借鑒之前寫過的代碼

很多代碼都可以重用,比如我經常會發現之前別的項目中用到的代碼可以在現有的項目中重用。有心的話可以做一下整理,把經常復用的代碼寫成模塊,上傳到github上,既方便查詢也方便以後重用。

4、做筆記

一些不常用的但每次寫起來都很痛苦的代碼,我會記在我的evernote筆記里。比如之前寫過一個傅里葉正向逆向變換的代碼,大學裡學的傅里葉變換早就忘得差不多了,查課本查網上資料,前前後後一共花了大概一周的時間,寫出來後記在evernote里,之後每次用到都直接查閱筆記略加修改就行。


謝邀,作為一個知乎小透明被邀請回答,受寵若驚,第一次送給你,么么噠!

剛開始的學習的時候對於一些函數名的確很難記住,但是一般都是一邊在ipython裡面help()一邊在IDE里開發,對於一些常用的函數名,str,list,dict,touple等常用的處理應該系統的學習,筆記,並記住,

想pandas,scipy,matplotlib這些的函數,掌握基本,但是函數的功能有個大概的了解,方便去馬blog,看doc.

說說我自己的幾個比較棘手的輪子,機器學習方面的,xgboost,sklearn,tensorflow這些都是有官方manual的,在剛開始接觸的時候都是照著manual實現一邊,了解作用,然後拿經典的數據集去測試,手寫數字,驗證碼,車牌號識別,毒蘑菇,貓狗分類。

對於從入門到重新入門的輪子,urllib,這種py2和py3之間有調整的輪子要仔細檢查變化的地方,pyqt,這種4.8和5.0+的版本變化之能邊查在線doc,邊改變,pyqt的doc有時候沒有詳細的介紹就回去看CPPQt,的doc.

不要臉的推薦下自己的blog,http://www.lowpitch.cn


你難道是想寫完美的代碼?能把任務完成就行了,要不要優化以後再說。


推薦閱讀:

為什麼說不能用import導入自定義的包?

TAG:Python | 信息技術IT | Python庫 | Python入門 | Python編程 |