1. 程式人生 > >Python總結-學習方向和方法

Python總結-學習方向和方法

目錄

前言... 2

(一)如何學習Python. 2

(二)一些Python免費課程推薦... 3

(三)Python爬蟲需要哪些知識?... 4

(四)Python爬蟲進階... 6

(五)Python爬蟲面試指南... 7

(六)推薦一些不錯的Python部落格... 8

(七)Python如何進階... 9

(八)Python爬蟲入門... 10

(九)Python開發微信公眾號... 12

(十)Python面試概念和程式碼... 15

(十一)Python書籍... 23

 

 

 

 

前言

知乎:路人甲

微博:玩資料的路人甲

微信公眾號:一個程式設計師的日常

 

在知乎分享已經有一年多了,之前一直有朋友說我的回答能整理成書籍了,一直偷懶沒做,最近有空仔細整理了知乎上的回答和文章另外也添加了一些新的內容,完成了幾本小小的電子書,這一本是有關於Python方面的。

 

還有另外幾本包括我的一些資料分析方面的讀書筆記、增長黑客的讀書筆記、機器學習十大演算法等等內容。將會在我的微信公眾號:一個程式設計師的日常進行更新,同時也可以關注我的知乎賬號:路人甲 及時關注我的最新分享用資料講故事。

(一)如何學習Python

學習Python大致可以分為以下幾個階段:

1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變數、資料結構、語法等,基礎過的很快,基本上1~2周時間就能過完了,我當時是在這兒看的基礎:Python 簡介 | 菜鳥教程

 

2.看完基礎後,就是做一些小專案鞏固基礎,比方說:做一個終端計算器,如果實在找不到什麼練手專案,可以在 Codecademy - learn to code, interactively, for free 上面進行練習。

 

3. 如果時間充裕的話可以買一本講Python基礎的書籍比如《Python程式設計》,閱讀這些書籍,在鞏固一遍基礎的同時你會發現自己諸多沒有學習到的邊邊角角,這一步是對自己基礎知識的補充。

 

4.Python庫是Python的精華所在,可以說Python庫組成並且造就了Python,Python庫是Python開發者的利器,所以學習Python庫就顯得尤為重要:The Python Standard Library ,Python庫很多,如果你沒有時間全部看完,不妨學習一遍常用的Python庫:Python常用庫整理 - 知乎專欄

 

5.Python庫是開發者利器,用這些庫你可以做很多很多東西,最常見的網路爬蟲、自然語言處理、影象識別等等,這些領域都有很強大的Python庫做支援,所以當你學了Python庫之後,一定要第一時間進行練習。如何尋找自己需要的Python庫呢?推薦我之前的一個回答:如何找到適合需求的 Python 庫?

 

6.學習使用了這些Python庫,此時的你應該是對Python十分滿意,也十分激動能遇到這樣的語言,就是這個時候不妨開始學習Python資料結構與演算法,Python設計模式,這是你進一步學習的一個重要步驟:faif/python-patterns

 

7.當度過艱難的第六步,此時選擇你要研究的方向,如果你想做後端開發,不妨研究研究Django,再往後,就是你自己自由發揮了。

 

(二)一些Python免費課程推薦

以下課程都為免費課程
 

1.python零基礎相關

適用人群:Python零基礎的初學者、Web開發程式設計師、運維人員、有志於從事網際網路行業以及各領域應用Python的人群

 

2.python web方向
Python Django 快速Web應用開發入門
 

3.python爬蟲
Python實戰:一週學會爬取網頁
 

4.python資料分析方向
資料分析實戰基礎課程

 

 

(三)Python爬蟲需要哪些知識?

要學會使用Python爬取網頁資訊無外乎以下幾點內容:
1、要會Python
2、知道網頁資訊如何呈現
3、瞭解網頁資訊如何產生
4、學會如何提取網頁資訊

第一步Python是工具,所以你必須熟練掌握它,要掌握到什麼程度呢?如果你只想寫一寫簡單的爬蟲,不要炫技不考慮爬蟲效率,你只需要掌握:


 

你甚至不需要掌握函式、非同步、多執行緒、多程序,當然如果想要提高自己小爬蟲的爬蟲效率,提高資料的精確性,那麼記住最好的方式是去系統的學習一遍Python,去哪兒學習?Python教程

假設已經熟悉了最基礎的Python知識,那麼進入第二步:知道網頁資訊如何呈現?你首先要知道所需要抓取的資料是怎樣的呈現的,就像是你要學做一幅畫,在開始之前你要知道這幅畫是用什麼畫出來的,鉛筆還是水彩筆...可能種類是多樣的,但是放到網頁資訊來說這兒只有兩種呈現方式:
1、HTML (
HTML 簡介
2、JSON (
JSON 簡介
HTML是用來描述網頁的一種語言
JSON是一種輕量級的資料交換格式

假設你現在知道了資料是由HTML和JSON呈現出來的,那麼我們緊接著第三步:資料怎麼來?資料當然是從伺服器反饋給你的,為什麼要反饋給你?因為你發出了請求。

“Hi~ ,伺服器我要這個資源”
“正在傳輸中...”
“已經收到HTML或者JSON格式的資料”

這個請求是什麼請求?要搞清楚這一點你需要了解一下http的基礎知識,更加精確來說你需要去了解GET和POST是什麼,區別是什麼。也許你可以看看這個:淺談HTTP中Get與Post的區別 - hyddd - 部落格園

很高興你使用的是Python,那麼你只需要去掌握好快速上手 - Requests 2.10.0 文件,requests可以幫你模擬發出GET和POST請求,這真是太棒了。

飯菜已經備好,兩菜一湯美味佳餚,下面就是好好享受了。現在我們已經拿到了資料,我們需要在這些錯亂的資料中提取我們需要的資料,這時候我們有兩個選擇。

第一招:萬能鑰匙
Python正則表示式指南 ,再大再亂的內容,哪怕是大海撈針,只要告訴我這個針的樣子我都能從茫茫大海中撈出來,強大的正則表示式是你提取資料的不二之選。

第二招:笑裡藏刀
Beautiful Soup 4.2.0 文件,或許我們有更好的選擇,我們把原始資料和我們想要的資料的樣子扔個這個Beautifulsoup,然後讓它幫我們去尋找,這也是一個不錯的方案,但是論靈活性,第二招還是略遜於第一招。

第三招:雙劍合璧
最厲害的招式莫過於結合第一招和第二招了,打破天下無敵手。

基礎知識我都會,可是我還是寫不了一個爬蟲啊!
客觀別急,這還沒完。

以下這些專案,你拿來學習學習練練手。
 

一些教學專案你值得擁有:

 

還不夠?這兒有很多:

 

(四)Python爬蟲進階

爬蟲無非分為這幾塊:分析目標、下載頁面、解析頁面、儲存內容,其中下載頁面不提。
 

1. 分析目標

所謂分析就是首先你要知道你需要抓取的資料來自哪裡?怎麼來?普通的網站一個簡單的POST或者GET請求,不加密不反爬,幾行程式碼就能模擬出來,這是最基本的,進階就是學會分析一些複雜的目標,比如說:淘寶、新浪微博登陸以及網易雲的評論資訊等等。
 

2. 解析頁面

解析頁面主要是選擇什麼庫或者那些庫結合能使解析速度更快,可能你一開始你通過種種地方瞭解到了bs庫,於是你對這個庫很痴迷,以後只要寫爬蟲,總是先寫上:

import requests

from bs4 import BeautifulSoup

當然bs已經很優秀了,但是並不代表可以用正則表示式解析的頁面還需要使用bs,也不代表使用lxml能解決的還要動用bs,所以這些解析庫的速度是你在進階時要考慮的問題。
 

3. 儲存內容

剛開始學爬蟲,一般爬取的結果只是打印出來,最後把在終端輸出的結果複製貼上儲存就好了;後來發現麻煩會用上xlwt/openpyxl/csv的把儲存內容寫入表格,再後來使用資料庫sqlite/mysql/neo4j只要呼叫了庫都很簡單,當然這是入門。

進階要開始學習如何選擇合適的資料庫,或者儲存方式。當爬取的內容過千萬的時候,如何設計使儲存速度更快,比如說當既有人物關係又有人物關係的時候,一定會用neo4j來儲存關係,myslq用來儲存使用者資訊,這樣分開是因為如果資訊全部存入neo4j,後期的儲存速度經十分的慢。

當你每個步驟都能做到很優秀的時候,你應該考慮如何組合這四個步驟,使你的爬蟲達到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學習不是一朝一夕的事情,建議多看看一些比較優秀的爬蟲的設計方案,比如說Scrapy。

 

除了爬取策略以外,還有幾點也是必備的:

1. 代理策略以及多使用者策略

代理是爬蟲進階階段必備的技能,與入門階段直接套用代理不同,在進階階段你需要考慮如何設計使用代理策略,什麼時候換代理,代理的作用範圍等等,多使用者的抓取策略考慮的問題基本上與代理策略相同。

2. 增量式抓取以及資料重新整理

比如說你抓取的是一個酒店網站關於酒店價格資料資訊的,那麼會有這些問題:酒店的房型的價格是每天變動的,酒店網站每天會新增一批酒店,那麼如何進行儲存、如何進行資料重新整理都是應該考慮的問題。

3.驗證碼相關的一些問題

有很多人提到驗證碼,我個人認為驗證碼不是爬蟲主要去解決的問題,驗證碼不多的情況考慮下載到本地自己輸入驗證碼,在多的情況下考慮接入打碼平臺。

 

(五)Python爬蟲面試指南

前段時間快要畢業,而我又不想找自己的老本行Java開發了,所以面了很多Python爬蟲崗位。因為我在南京上學,所以我一開始只是在南京投了簡歷,我一共面試了十幾家企業,其中只有一家沒有給我發offer,其他企業都願意給到10K的薪資,不要拿南京的薪資水平和北上深的薪資水平比較,結合面試常問的問題型別說一說我的心得體會。


 

第一點:Python

因為面試的是Python爬蟲崗位,面試官大多數會考察面試者的基礎的Python知識,包括但不限於:

  • Python2.x與Python3.x的區別
  • Python的裝飾器
  • Python的非同步
  • Python的一些常用內建庫,比如多執行緒之類的


第二點:資料結構與演算法

資料結構與演算法是對面試者尤其是校招生面試的一個很重要的點,當然小公司不會太在意這些,從目前的招聘情況來看對面試者的資料結構與演算法的重視程度與企業的好壞成正比,那些從不問你資料結構的你就要當心他們是否把你當碼農用的,當然以上情況不絕對,最終解釋權歸面試官所有。
 

第三點:Python爬蟲

最重要也是最關鍵的一點當然是你的Python爬蟲相關的知識與經驗儲備,這通常也是面試官考察的重點,包括但不限於:

  • 你遇到過的反爬蟲的策略有哪些?
  • 你常用的反反爬蟲的方案有哪些?
  • 你用過多執行緒和非同步嗎?除此之外你還用過什麼方法來提高爬蟲效率?
  • 有沒有做過增量式抓取?
  • 對Python爬蟲框架是否有了解?


第四點:爬蟲相關的專案經驗

爬蟲重在實踐,除了理論知識之外,面試官也會十分注重爬蟲相關的專案:

  • 你做過哪些爬蟲專案?如果有Github最好
  • 你認為你做的最好的爬蟲專案是哪個?其中解決了什麼難題?有什麼特別之處?


以上是我在面試過程中,會碰到的一些技術相關的問題的總結,當然面試中不光是技術這一點,但是對於做技術的,過了技術面基本上就是薪資問題了。

 

(六)推薦一些不錯的Python部落格

如果是Python基礎的話,廖雪峰的部落格教程會是一個不錯的選擇:

 

當然很多剛接觸Python的同學反應廖大大的教程中部分跳躍性太大,如果覺得跳躍性太大可以結合菜鳥教程一起看:

 

如果你英文稍好的話推薦還是看官方文件:Python 3.6.0 documentation

如果不是為了學習Python基礎的話,推薦幾個其他的部落格。
 

 

(七)Python如何進階

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

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

 

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

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

 

所謂照抄前提是有樣本。

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

 

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

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

 

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

先照抄這些專案,實現這些小功能在電腦上能執行確認無誤之後,回過頭來看程式碼:

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

 

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

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

 

(八)Python爬蟲入門

想寫這麼一篇文章,但是知乎社群爬蟲大神很多,光是整理他們的答案就夠我這篇文章的內容了。對於我個人來說我更喜歡那種非常實用的教程,這種教程對於想直接上手爬蟲做一些小東西的朋友來說是極好的。

用一個精彩的回答作為開頭:如何入門 Python 爬蟲? - 謝科的回答

如果你想學習程式設計,但是找不到學習路徑和資源,歡迎關注專欄:學習程式設計

 

第一:Python爬蟲學習系列教程

Python版本:2.7 

整體目錄:

 

一、爬蟲入門

 

二、爬蟲實戰

 

三、爬蟲利器

 

四、爬蟲進階

 

 

第二(第一的姊妹篇):Python爬蟲入門教程

Python版本:2.7

教程目錄:

 

第三:你已經看完上面(第一或者第二)的教程:再推薦知乎使用者@陳唯源 的實戰練習部落格

 

第四:最後推薦知乎使用者@gaga salamer 的實戰練習部落格

 

 

希望以上的教程可以幫助到大家。

 

(九)Python開發微信公眾號

我的第一個Python專案就是做的微信公眾號機器人,按照當時我的思路來講講如何學習使用Python來開發微信公眾號:大傢伙收藏順手點個讚唄。

微信公眾號功能開發分為兩大塊:需要呼叫微信內部功能、不需要呼叫微信內部功能,重點在呼叫微信內部功能組建。

 

1、需要呼叫微信內部功能

需要呼叫微信內部功能元件的比如:公眾號收發訊息|圖片、頁面分享至朋友圈、使用者授權提取使用者基本資訊、微信小店、微信公眾號選單等內部功能元件,這些功能元件在微信公眾號開發者文件裡面找到:微信公眾平臺開發者文件

 

對於這些功能元件,開發者文件都提供了詳細的介面文件,告訴你如何呼叫,而你只需要用Python呼叫這些介面即可。比如一個很簡單的訊息傳送的方法如下:

 

當然在這所有的呼叫之前,需要進行一些授權驗證,同樣開發者文件有一套完整的接入指南:接入指南 - 微信公眾平臺開發者文件

很遺憾很多初學者在一開始看這份文件的時候並不能看懂,所以這裡也推薦一些我以前學習摸索的過程中使用到的一些簡單易學的教程。

你可以先做一個簡單的微信機器人練練手(零基礎十分容易上手):

 

如果你已經能按照以上的教程搭建一個完整的微信機器人了,基本上對於微信收發訊息等等簡單功能已經沒有什麼障礙了。下面再繼續學習如下教程,開始學習如何呼叫其他一些相對來說比較複雜的介面。

當你實驗瞭如上的教程之後,相信官方文件的所有介面呼叫對你來說已經小菜一碟了。

 

2、不需要呼叫微信內部功能

不需要呼叫微信內部功能元件的,就如同正常的web頁面一樣,比如填寫表單進行進行註冊、點選按鈕進行跳轉等等,這些都是正常的web請求,按照正常的web開發方法走即可。

 

(十)Python面試概念和程式碼


 

(一)、這兩個引數是什麼意思:*args,**kwargs?我們為什麼要使用它們?

答:如果我們不確定往一個函式中傳入多少引數,或者我們希望以元組(tuple)或者列表(list)的形式傳引數的時候,我們可以使用*args(單星號)。如果我們不知道往函式中傳遞多少個關鍵詞引數或者想傳入字典的值作為關鍵詞引數的時候我們可以使用**kwargs(雙星號),args、kwargs兩個識別符號是約定俗成的用法。

另一種答法:當函式的引數前面有一個星號*號的時候表示這是一個可變的位置引數,兩個星號**表示這個是一個可變的關鍵詞引數。星號*把序列或者集合解包(unpack)成位置引數,兩個星號**把字典解包成關鍵詞引數。 

 

(二)、談一談Python的裝飾器(decorator)

裝飾器本質上是一個Python函式,它可以讓其它函式在不作任何變動的情況下增加額外功能,裝飾器的返回值也是一個函式物件。它經常用於有切面需求的場景。比如:插入日誌、效能測試、事務處理、快取、許可權校驗等。有了裝飾器我們就可以抽離出大量的與函式功能無關的雷同程式碼進行重用。

 

有關於具體的裝飾器的用法看這裡:裝飾器 - 廖雪峰的官方網站

 

(三)、簡要描述Python的垃圾回收機制(garbage collection)

Python中的垃圾回收是以引用計數為主,標記-清除和分代收集為輔。

引用計數:Python在記憶體中儲存每個物件的引用計數,如果計數變成0,該物件就會消失,分配給該物件的記憶體就會釋放出來。

標記-清除:一些容器物件,比如list、dict、tuple,instance等可能會出現引用迴圈,對於這些迴圈,垃圾回收器會定時回收這些迴圈(物件之間通過引用(指標)連在一起,構成一個有向圖,物件構成這個有向圖的節點,而引用關係構成這個有向圖的邊)。

分代收集:Python把記憶體根據物件存活時間劃分為三代,物件建立之後,垃圾回收器會分配它們所屬的代。每個物件都會被分配一個代,而被分配更年輕的代是被優先處理的,因此越晚建立的物件越容易被回收。

如果你想要深入瞭解Python的GC機制,點選這裡:[轉載]Python垃圾回收機制--完美講解!

 

(四)、Python多執行緒(multi-threading)。這是個好主意嗎?

Python並不支援真正意義上的多執行緒,Python提供了多執行緒包。Python中有一個叫Global Interpreter Lock(GIL)的東西,它能確保你的程式碼中永遠只有一個執行緒在執行。經過GIL的處理,會增加執行的開銷。這就意味著如果你先要提高程式碼執行效率,使用threading不是一個明智的選擇,當然如果你的程式碼是IO密集型,多執行緒可以明顯提高效率,相反如果你的程式碼是CPU密集型的這種情況下多執行緒大部分是雞肋。

想要深入詳細瞭解多執行緒,點選這裡:詳解Python中的多執行緒程式設計_python

想了解一下IO密集和CPU密集可以點選這裡:CPU-bound(計算密集型) 和I/O bound(I/O密集型)

 

 

(五)、 說明os,sys模組不同,並列舉常用的模組方法?

官方文件: 

os模板提供了一種方便的使用作業系統函式的方法

sys模板可供訪問由直譯器使用或維護的變數和與直譯器互動的函式

另一種回答:

os模組負責程式與作業系統的互動,提供了訪問作業系統底層的介面。sys模組負責程式與Python直譯器的互動,提供了一系列的函式和變數使用者操作Python執行時的環境。一些常用的方法:

一些常用的用法示例:

 

想要了解更詳細的使用請訪問:os和sys模組 - 君醉

 

(六)、什麼是lambda表示式?它有什麼好處?

簡單來說,lambda表示式通常是當你需要使用一個函式,但是又不想費腦袋去命名一個函式的時候使用,也就是通常所說的匿名函式。

lambda表示式一般的形式是:關鍵詞lambda後面緊接一個或多個引數,緊接一個冒號“:”,緊接一個表示式。lambda表示式是一個表示式不是一個語句。

 

 

想更加詳細的瞭解Python中的Lamdba表示式可以點選這裡:Lambda 表示式有何用處?如何使用? - Python

 

(七)、Python中pass語句的作用是什麼?

pass語句不會執行任何操作,一般作為佔位符或者建立佔位程式

(八)、Python是如何進行型別轉換的?

Python提供了將變數或值從一種型別轉換為另一種型別的內建方法。

 

(九)、Python裡面如何拷貝一個物件?

Python中物件之間的賦值是按引用傳遞的,如果要拷貝物件需要使用標準模板中的copy

copy.copy:淺拷貝,只拷貝父物件,不拷貝父物件的子物件。

copy.deepcopy:深拷貝,拷貝父物件和子物件。

 

 

(十)、__new__和__init__的區別。

__init__為初始化方法,__new__方法是真正的建構函式。

__new__是例項建立之前被呼叫,它的任務是建立並返回該例項,是靜態方法

__init__是例項建立之後被呼叫的,然後設定物件屬性的一些初始值。 

總結:__new__方法在__init__方法之前被呼叫,並且__new__方法的返回值將傳遞給__init__方法作為第一個引數,最後__init__給這個例項設定一些引數。

 

想要更加詳細的瞭解這兩個方法,請點選:Python中的__new__及其用法 

(十一)、Python中單下劃線和雙下劃線分別是什麼?

__name__:一種約定,Python內部的名字,用來與使用者自定義的名字區分開,防止衝突

_name:一種約定,用來指定變數私有

__name:直譯器用_classname__name來代替這個名字用以區別和其他類相同的命名

想要更加詳細的瞭解這兩者的區別,請點選:Python中的下劃線(譯文)

 

(十二)、說一說Python自省。

自省就是面向物件的語言所寫的程式在執行時,所能知道物件的型別。簡單一句話就是執行時能夠獲得物件的型別。比如:type()、dir()、getattr()、hasattr()、isinstance() 

 

 

想要完整的理解Python自省,請點選:Python自省(反射)指南

有關於元類以及單例模式會在後面文章中做詳細的解釋說明。 

 

本文參考文獻資料:

 

(十一)Python書籍

入門書籍

  • 《Python學習手冊》
  • 《Head First Python》
  • 《Learn Python The Hard Way》
  • 《Python程式設計:入門到實踐》
  • 《笨辦法學Python》
  • 《簡明Python教程》

 

進階書籍

  • 《Python Cookbook(第三版)》
  • 《流暢的Python》
  • 《Python原始碼剖析》
  • 《Python進階》
  • 《Flask Web開發:基於Python的Web應用開發實戰》