1. 如何系統地自學 python
是否非常想學好 Python,一方面被瑣事糾纏,一直沒能動手,另一方面,擔心學習成本太高,心裡默默敲著退堂鼓?
幸運的是,Python 是一門初學者友好的編程語言,想要完全掌握它,你不必花上太多的時間和精力。
Python 的設計哲學之一就是簡單易學,體現在兩個方面:
語法簡潔明了:相對 Ruby 和 Perl,它的語法特性不多不少,大多數都很簡單直接,不玩兒玄學。
切入點很多:Python 可以讓你可以做很多事情,科學計算和數據分析、爬蟲、Web 網站、游戲、命令行實用工具等等等等,總有一個是你感興趣並且願意投入時間的。
廢話不多說,學會一門語言的捷徑只有一個: Getting Started
¶ 起步階段
任何一種編程語言都包含兩個部分:硬知識和軟知識,起步階段的主要任務是掌握硬知識。
硬知識
「硬知識」指的是編程語言的語法、演算法和數據結構、編程範式等,例如:變數和類型、循環語句、分支、函數、類。這部分知識也是具有普適性的,看上去是掌握了一種語法,實際是建立了一種思維。例如:讓一個 Java 程序員去學習 Python,他可以很快的將 Java 中的學到的面向對象的知識 map 到 Python 中來,因此能夠快速掌握 Python 中面向對象的特性。
如果你是剛開始學習編程的新手,一本可靠的語法書是非常重要的。它看上去可能非常枯燥乏味,但對於建立穩固的編程思維是必不可少。
下面列出了一些適合初學者入門的教學材料:
廖雪峰的 Python 教程 Python 中文教程的翹楚,專為剛剛步入程序世界的小白打造。
笨方法學 Python 這本書在講解 Python 的語法成分時,還附帶大量可實踐的例子,非常適合快速起步。
The Hitchhiker』s Guide to Python! 這本指南著重於 Python 的最佳實踐,不管你是 Python 專家還是新手,都能獲得極大的幫助。
Python 的哲學:
學習也是一樣,雖然推薦了多種學習資料,但實際學習的時候,最好只選擇其中的一個,堅持看完。
必要的時候,可能需要閱讀講解數據結構和演算法的書,這些知識對於理解和使用 Python 中的對象模型有著很大的幫助。
軟知識
「軟知識」則是特定語言環境下的語法技巧、類庫的使用、IDE的選擇等等。這一部分,即使完全不了解不會使用,也不會妨礙你去編程,只不過寫出的程序,看上去顯得「傻」了些。
對這些知識的學習,取決於你嘗試解決的問題的領域和深度。對初學者而言,起步階段極易走火,或者在選擇 Python 版本時徘徊不決,一會兒看 2.7 一會兒又轉到 3.0,或者徜徉在類庫的大海中無法自拔,Scrapy,Numpy,Django 什麼都要試試,或者參與編輯器聖戰、大括弧縮進探究、操作系統辯論賽等無意義活動,或者整天跪舔語法糖,老想著怎麼一行代碼把所有的事情做完,或者去構想聖潔的性能安全通用性健壯性全部滿分的解決方案。
很多「大牛」都會告誡初學者,用這個用那個,少走彎路,這樣反而把初學者推向了真正的彎路。
還不如告訴初學者,學習本來就是個需要你去走彎路出 Bug,只能腳踏實地,沒有奇跡只有狗屎的過程。
選擇一個方向先走下去,哪怕臟丑差,走不動了再看看有沒有更好的解決途徑。
自己走了彎路,你才知道這么做的好處,才能理解為什麼人們可以手寫狀態機去匹配卻偏要發明正則表達式,為什麼面向過程可以解決卻偏要面向對象,為什麼我可以操縱每一根指針卻偏要自動管理內存,為什麼我可以嵌套回調卻偏要用 Promise...
更重要的是,你會明白,高層次的解決方法都是對低層次的封裝,並不是任何情況下都是最有效最合適的。
技術涌進就像波浪一樣,那些陳舊的封存已久的技術,消退了遲早還會涌回的。就像現在移動端應用、手游和 HTML5 的火熱,某些方面不正在重演過去 PC 的那些歷史么?
因此,不要擔心自己走錯路誤了終身,堅持並保持進步才是正道。
起步階段的核心任務是掌握硬知識,軟知識做適當了解,有了穩固的根,粗壯的枝幹,才能長出濃密的葉子,結出甜美的果實。
¶ 發展階段
完成了基礎知識的學習,必定會感到一陣空虛,懷疑這些語法知識是不是真的有用。
沒錯,你的懷疑是非常正確的。要讓 Python 發揮出它的價值,當然不能停留在語法層面。
發展階段的核心任務,就是「跳出 Python,擁抱世界」。
在你面前會有多個分支:科學計算和數據分析、爬蟲、Web 網站、游戲、命令行實用工具等等等等,這些都不是僅僅知道 Python 語法就能解決的問題。
拿爬蟲舉例,如果你對計算機網路,HTTP 協議,HTML,文本編碼,JSON 一無所知,你能做好這部分的工作么?而你在起步階段的基礎知識也同樣重要,如果你連循環遞歸怎麼寫都還要查文檔,連 BFS 都不知道怎麼實現,這就像工匠做石凳每次起錘都要思考錘子怎麼使用一樣,非常低效。
在這個階段,不可避免要接觸大量類庫,閱讀大量書籍的。
類庫方面
「Awesome Python 項目」:vinta/awesome-python · GitHub
這里列出了你在嘗試解決各種實際問題時,Python 社區已有的工具型類庫,如下圖所示:
vinta/awesome-python
你可以按照實際需求,尋找你需要的類庫。
至於相關類庫如何使用,必須掌握的技能便是閱讀文檔。由於開源社區大多數文檔都是英文寫成的,所以,英語不好的同學,需要惡補下。
書籍方面
這里我只列出一些我覺得比較有一些幫助的書籍,詳細的請看豆瓣的書評:
科學和數據分析:
❖「集體智慧編程」:集體智慧編程 (豆瓣)
❖「數學之美」:數學之美 (豆瓣)
❖「統計學習方法」:統計學習方法 (豆瓣)
❖「Pattern Recognition And Machine Learning」:Pattern Recognition And Machine Learning (豆瓣)
❖「數據科學實戰」:數據科學實戰 (豆瓣)
❖「數據檢索導論」:信息檢索導論 (豆瓣)
爬蟲:
❖「HTTP 權威指南」:HTTP權威指南 (豆瓣)
Web 網站:
❖「HTML & CSS 設計與構建網站」:HTML & CSS設計與構建網站 (豆瓣)
...
列到這里已經不需要繼續了。
聰明的你一定會發現上面的大部分書籍,並不是講 Python 的書,而更多的是專業知識。
事實上,這里所謂「跳出 Python,擁抱世界」,其實是發現 Python 和專業知識相結合,能夠解決很多實際問題。這個階段能走到什麼程度,更多的取決於自己的專業知識。
¶ 深入階段
這個階段的你,對 Python 幾乎了如指掌,那麼你一定知道 Python 是用 C 語言實現的。
可是 Python 對象的「動態特徵」是怎麼用相對底層,連自動內存管理都沒有的C語言實現的呢?這時候就不能停留在表面了,勇敢的拆開 Python 的黑盒子,深入到語言的內部,去看它的歷史,讀它的源碼,才能真正理解它的設計思路。
這里推薦一本書:
「Python 源碼剖析」:Python源碼剖析 (豆瓣)
這本書把 Python 源碼中最核心的部分,給出了詳細的闡釋,不過閱讀此書需要對 C 語言內存模型和指針有著很好的理解。
另外,Python 本身是一門雜糅多種範式的動態語言,也就是說,相對於 C 的過程式、 Haskell 等的函數式、Java 基於類的面向對象而言,它都不夠純粹。換而言之,編程語言的「道學」,在 Python 中只能有限的體悟。學習某種編程範式時,從那些面向這種範式更加純粹的語言出發,才能有更深刻的理解,也能了解到 Python 語言的根源。
這里推薦一門公開課
「編程範式」:斯坦福大學公開課:編程範式
講師高屋建瓴,從各種編程範式的代表語言出發,給出了每種編程範式最核心的思想。
值得一提的是,這門課程對C語言有非常深入的講解,例如C語言的范型和內存管理。這些知識,對閱讀 Python 源碼也有大有幫助。
Python 的許多最佳實踐都隱藏在那些眾所周知的框架和類庫中,例如 Django、Tornado 等等。在它們的源代碼中淘金,也是個不錯的選擇。
¶ 最後的話
每個人學編程的道路都是不一樣的,其實大都殊途同歸,沒有迷路的人只有不能堅持的人!
希望想學 Python 想學編程的同學,不要猶豫了,看完這篇文章,
Just Getting Started !!!
2. 銀行數據倉庫體系實踐(7)--數據模型設計及流程
數據倉庫作為全行或全公司的數據中心和匯流排,匯集了全行各系統以及外部數據,通過良好的系統架構可以保證系統穩定性和處理高效性,那如何保障系統數據的完備性、規范性和統一性呢?這里就需要有良好的數據分區和數據模型,那數據分區在第三部分數據架構中已經介紹,本節將介紹如何進行數據模型的設計。
1、各數據分區的模型設計思路:
數據架構部分中提到了在數據倉庫中主要分為以下區域,那各數據區域的主要設計原則如下:
(1)主數據區:主數據區是全行最全的基礎數據區,保留歷史並作為整個數據倉庫的數據主存儲區,後續的數據都可以從主數據區數據加工獲得,因此主數據區的數據天然就要保留所有歷史數據軌跡。
1) 近源模型區:主要是將所有入數據倉庫的數據表按歷史拉鏈表或事件表(APPEND演算法)的方式保留所有歷史數據,因此模型設計較簡單,只需要基於源系統表結構,對欄位進行數據標准化後,增加保留歷史數據演算法所需要的日期欄位即可。
2)整合模型區:該模型區域按主題方式對數據進行建模,需要對源系統表欄位按主題分類劃分到不同的主題區域中,並主要按3範式的方式設計表結構,通過主題模型的設計並匯總各系統數據,可以從全行及集團角度進行客戶、產品、協議(賬戶、合同)分析,獲得統一視圖。比如說,全行有多少客戶、有多少產品?通過主題模型事先良好的設計和梳理,可以很快獲得相關統計數據。
主數據區的模型設計按頂層設計(自上而下)為主,兼顧應用需求(自下而上)的方式,即需要有全局視角,也要滿足應用需求。那頂層設計主要是需要從全行數據角度對源系統的主要業務數據進行入倉,獲得全行客戶、業務數據的整體視角,同時又保存所有交易明細數據,滿足後續的數據分析需求;應用需求指源系統數據的入倉也需要考慮當前集市、數據應用系統的數據需求,因為數據需求是千變萬化的,但是只要保留全面的基礎的業務數據,就有了加工的基礎,當前的數據需求只是考慮的一部分,更多的需要根據業務經驗以及主題模型進行數據入倉和模型設計。
主數據模型的設計主要自上而下,近源模型層雖然比較簡單,但設計步驟和整合模型類型,分為以下幾個步驟:
步驟1:系統信息調研,篩選入倉的系統並深入了解業務數據;
步驟2:對入倉系統進行表級篩選和欄位篩選,並將欄位進行初步映射;
步驟3:根據入倉欄位按一定規范設計邏輯模型;
步驟4:對邏輯模型進行物理化;
(2)集市區:集市區的設計表結構設計主要按維度模型(雪花模型、星形模型)進行設計,主要是為了方便應用分析,滿足數據應用需求,集市區一般以切片的形式保留結果歷史數據,但保留期限不會太長,比如只保留月末數據以及當前月份的每日切片數據。
數據集市需要從數據倉庫獲得基礎數據,對於倉內集市,可以直接訪問或通過視圖訪問,減少數據存儲,倉外集市則需要從數據倉庫獲得批量數據作為基礎數據進行存儲加工。因此倉外集市還需要設計基礎數據的保留策略。
集市區的設計步驟如下:
(3)介面區:介面區的設計完全根據數據應用系統的介面方式來進行,一般也是維度模型(事實表+維度表)方式,介面區之前也提到過,不做復雜計算,只做簡單關聯,可以將復雜計算放到集市或指標匯總層加工。
(4)指標匯總區:作為集市介面區和主數據區的中間層,主要是提供基於各集市和介面數據的共性需求,基於主模型區數據進行統一加工。即面向所有的應用需求來設計,那中間層一般採用維度模型,按從細粒度到粗粒度的方式逐步匯總。由於各數據應用及集市的需求不斷變化,指標匯總區也是不斷進行完善,許多一開始在集市的加工由於其它集市或應用也需要,則會從集市轉移到指標匯總層。常見的數據就是客戶、賬戶、合同等常用的數據實體的寬表(事實表),統一進行匯總後供各數據應用使用。
另外指標匯總層也包括共性指標的加工,指標可以通過基礎指標配置指標計算加工方式獲得衍生指標,那這些基礎指標和衍生指標的定義、口徑以及加工方式可以由指標管理系統來維護並集成到數據標准系統和元數據管理系統中。
指標匯總區設計步驟如下:
(5)非結構化數據存儲區:非結構化存儲區的設計不僅需要考慮非結構化數據本身的存儲,同時需要考慮非結構化數據所帶有的結構化屬性,因此在設計時主要考慮以下幾點:
1)存儲路徑規劃:是需要將非結構化數據按源系統、類型、日期、外部來源等角度進行存儲路徑的規劃,分門別類,便於管理。
2)對非結構化數據的元數據建立索引:比如對於憑證的影像,需要有賬戶、流水號、客戶名等相關結構化數據,以便完整描述影像圖片的來源,通過對這些結構化數據建立索引,方便查找。
3)對部分文檔內容建立索引:對於部分文檔如合同電子版、紅頭文件PDF需要建立內容索引,以便快速搜索查找文件內容,一般可用支持HADOOP的ElasticSearch來實現。
4)設立計算區和結果區:由於非結構化數據往往需要使用MAPREDUCE或程序化語言進行處理,也會產生中間臨時文件和結果數據,因此需要規劃計算區和結果區來存放這些數據。
(6)歷史數據存儲區:歷史數據區作為歷史數據的歸檔,即包括結構化數據,也包括非結構化數據,對於歷史數據除了存儲也需要方便查找,歷史數據區的規劃設計需要考慮非結構化數據存儲區的存儲、索引設計外,還需要考慮以下幾點:
1)壓縮,由於歷史數據使用頻率低,可以選擇壓縮率較高的演算法,降低存儲空間。
2)容量規劃:由於歷史數據歸檔會越來越大,因此需要提前進行容量規劃以及歷史數據清理。比如10年以上的數據進行刪除。
3)可設計一個管理系統對歷史數據進行歸檔、查找以及管理。
(7)實時數據區:實時數據區需要使用部分批量數據來和實時流數據進行關聯加工,因此可從主數據區獲得所需要的數據後進行存放在實時數據區的關聯數據區,同時對於加工結果不僅可以推送到KAFKA等消息中間件,同時也可輸出到實時數據區的結果區進行保留。
(8)在線查詢區:在線查詢區主要在線提供計算結果查詢,常用HBASE來實現,設計按照介面來分別存放到不同的HBASE表,欄位內容也主要是介面欄位內容。HBASE表可以根據應用或者介面類型進行分目錄和分用戶。由於在線查詢區和實時數據區考慮到作業的保障級別以及資源競爭,往往會單獨建立一套集群,與批量作業集群進行隔離,在線查詢的結果計算可以在批量集群計算後載入到在線查詢區。
後續將分別對主數據區、集市及匯總指標層模型設計進行介紹,敬請關注。
3. 計算機程序員應該學什麼
需要學習VB程序設計,它是很基礎臘隱的一門程序語言,有它作基礎在以後的枯滲學習中會更容易。然後學C語言,學完C語言之後可以多練習練習,之後再多學習別的計算機語言會很容易。同時要學好數據結構、操作系統、編譯原理這三門課程。程序員包括的專業類型可以有計算機專業 、軟體開發專業、電子信息專業、通信專業、軟體工程等,程序員的范圍很廣,主要包括軟體設計開發以及程序編碼兩大類,現在辦公的技術人員也可以稱為程序員。所以,一名計算機程序員應當熟練掌輪敗廳握代碼的應用,學習創新能力的培養,熟練掌握電腦的一系列操作。
4. Python 使用對象模型來存儲數據
Python使用對象模型來存儲數據。構造任何類型的值都是一個對象。盡管Python通常被當成一種「面向對象的編程語言」,但你完全能夠寫出不使用任何類和實例的實用腳本。不過Python的對象語法和架構鼓勵我們使用這些特性,下面讓我們仔細研究一下Python對象。所有的Python對像都擁有三個特性:身份,類型和值。
身份:每一個對象都有一個唯一的身份標識自己,任何對象的身份可以使用內建函數id()來得到。這個值可以被認為是該對象的內存地址。你極少會用到這個值,也不用太關心它究竟是什麼。
類型對象的類型決定了該對象可以保存什麼類型的值,可以進行什麼樣的操作,以及遵循什麼樣的規則。你可以用內建函數type0查看Python對象的類型。因為在Python中類型也是對象(還記得我們提到Python是面向對象的這句話嗎?),所以type0返回的是對象而不是簡單的字元串。
值:對象表示的數據項。
上面三個特性在對象創建的時候就被賦值,除了值之外,其他兩個特性都是只讀的。對於新式類型和類,對象的類型也是可以改變的,不過並不推薦初學者這樣做。如果對象支持更新操作,那麼它的值就可以改變,否則它的值也是只讀的。對象的值是否可以更改被稱為對象的可改變性(mutability),我們會在後面的4.7小節中討論這個問題。只要一個對象還沒有被銷毀,這些特性就一直存在。Python有一系列的基本(內建)數據類型,必要時也可以創建自定義類型來滿足你對應用程序的需求。絕大多數應用程序通常使用標准類型,對特定的數據存儲則通過創建和實例化類來實現。