Python之路,Day1 - Python基礎1

py魚發表於2017-03-27

《轉自老師alex博文》

留作筆記

本節內容

  1. Python介紹
  2. 發展史
  3. Python 2 or 3?
  4. 安裝
  5. Hello World程式
  6. 變數
  7. 使用者輸入
  8. 模組初識
  9. .pyc是個什麼鬼?
  10. 資料型別初識
  11. 資料運算
  12. 表示式if ...else語句
  13. 表示式for 迴圈
  14. break and continue 
  15. 表示式while 迴圈
  16. 作業需求

 

一、 Python介紹

python的創始人為吉多·範羅蘇姆(Guido van Rossum)。1989年的聖誕節期間,吉多·範羅蘇姆為了在阿姆斯特丹打發時間,決心開發一個新的指令碼解釋程式,作為ABC語言的一種繼承。  

最新的TIOBE排行榜,Python趕超PHP佔據第五, Python崇尚優美、清晰、簡單,是一個優秀並廣泛使用的語言。

由上圖可見,Python整體呈上升趨勢,反映出Python應用越來越廣泛並且也逐漸得到業內的認可!!!

Python可以應用於眾多領域,如:資料分析、元件整合、網路服務、影象處理、數值計算和科學計算等眾多領域。目前業內幾乎所有大中型網際網路企業都在使用Python,如:Youtube、Dropbox、BT、Quora(中國知乎)、豆瓣、知乎、Google、Yahoo!、Facebook、NASA、百度、騰訊、汽車之家、美團等。

目前Python主要應用領域:

  • 雲端計算: 雲端計算最火的語言, 典型應用OpenStack
  • WEB開發: 眾多優秀的WEB框架,眾多大型網站均為Python開發,Youtube, Dropbox, 豆瓣。。。, 典型WEB框架有Django
  • 科學運算、人工智慧: 典型庫NumPy, SciPy, Matplotlib, Enthought librarys,pandas
  • 系統運維: 運維人員必備語言
  • 金融:量化交易,金融分析,在金融工程領域,Python不但在用,且用的最多,而且重要性逐年提高。原因:作為動態語言的Python,語言結構清晰簡單,庫豐富,成熟穩定,科學計算和統計分析都很牛逼,生產效率遠遠高於c,c++,java,尤其擅長策略回測
  • 圖形GUI: PyQT, WxPython,TkInter

Python在一些公司的應用: 

 

  • 谷歌:Google App Engine 、code.google.com 、Google earth 、谷歌爬蟲、Google廣告等專案都在大量使用Python開發
  • CIA: 美國中情局網站就是用Python開發的
  • NASA: 美國航天局(NASA)大量使用Python進行資料分析和運算
  • YouTube:世界上最大的視訊網站YouTube就是用Python開發的
  • Dropbox:美國最大的線上雲端儲存網站,全部用Python實現,每天網站處理10億個檔案的上傳和下載
  • Instagram:美國最大的圖片分享社交網站,每天超過3千萬張照片被分享,全部用python開發
  • Facebook:大量的基礎庫均通過Python實現的
  • Redhat: 世界上最流行的Linux發行版本中的yum包管理工具就是用python開發的
  • 豆瓣: 公司幾乎所有的業務均是通過Python開發的
  • 知乎: 國內最大的問答社群,通過Python開發(國外Quora)
  • 春雨醫生:國內知名的線上醫療網站是用Python開發的
  • 除上面之外,還有搜狐、金山、騰訊、盛大、網易、百度、阿里、淘寶 、土豆、新浪、果殼等公司都在使用Python完成各種各樣的任務。 

Python 是一門什麼樣的語言?

程式語言主要從以下幾個角度為進行分類,編譯型和解釋型、靜態語言和動態語言、強型別定義語言和弱型別定義語言,每個分類代表什麼意思呢,我們一起來看一下。

編譯和解釋的區別是什麼?

編譯器是把源程式的每一條語句都編譯成機器語言,並儲存成二進位制檔案,這樣執行時計算機可以直接以機器語言來執行此程式,速度很快; 

直譯器則是隻在執行程式時,才一條一條的解釋成機器語言給計算機來執行,所以執行速度是不如編譯後的程式執行的快的. 

這是因為計算機不能直接認識並執行我們寫的語句,它只能認識機器語言(是二進位制的形式)

 

 

 

 

 

編譯型vs解釋型

編譯型
優點:編譯器一般會有預編譯的過程對程式碼進行優化。因為編譯只做一次,執行時不需要編譯,所以編譯型語言的程式執行效率高。可以脫離語言環境獨立執行。
缺點:編譯之後如果需要修改就需要整個模組重新編譯。編譯的時候根據對應的執行環境生成機器碼,不同的作業系統之間移植就會有問題,需要根據執行的作業系統環境編譯不同的可執行檔案。

解釋型
優點:有良好的平臺相容性,在任何環境中都可以執行,前提是安裝瞭直譯器(虛擬機器)。靈活,修改程式碼的時候直接修改就可以,可以快速部署,不用停機維護。

缺點:每次執行的時候都要解釋一遍,效能上不如編譯型語言。

 

 

一、低階語言與高階語言

最初的計算機程式都是用0和1的序列表示的,程式設計師直接使用的是機器指令,無需翻譯,從紙帶打孔輸入即可執行得到結果。後來為了方便記憶,就將用0、1序列表示的機器指令都用符號助記,這些與機器指令一一對應的助記符就成了彙編指令,從而誕生了組合語言。無論是機器指令還是彙編指令都是面向機器的,統稱為低階語言。因為是針對特定機器的機器指令的助記符,所以組合語言是無法獨立於機器(特定的CPU體系結構)的。但組合語言也是要經過翻譯成機器指令才能執行的,所以也有將執行在一種機器上的組合語言翻譯成執行在另一種機器上的機器指令的方法,那就是交叉彙編技術。

高階語言是從人類的邏輯思維角度出發的計算機語言,抽象程度大大提高,需要經過編譯成特定機器上的目的碼才能執行,一條高階語言的語句往往需要若干條機器指令來完成。高階語言獨立於機器的特性是靠編譯器為不同機器生成不同的目的碼(或機器指令)來實現的。那具體的說,要將高階語言編譯到什麼程度呢,這又跟編譯的技術有關了,既可以編譯成直接可執行的目的碼,也可以編譯成一種中間表示,然後拿到不同的機器和系統上去執行,這種情況通常又需要支撐環境,比如直譯器或虛擬機器的支援,Java程式編譯成bytecode,再由不同平臺上的虛擬機器執行就是很好的例子。所以,說高階語言不依賴於機器,是指在不同的機器或平臺上高階語言的程式本身不變,而通過編譯器編譯得到的目的碼去適應不同的機器。從這個意義上來說,通過交叉彙編,一些彙編程式也可以獲得不同機器之間的可移植性,但這種途徑獲得的移植性遠遠不如高階語言來的方便和實用性大。


二、編譯與解釋

編譯是將源程式翻譯成可執行的目的碼,翻譯與執行是分開的;而解釋是對源程式的翻譯與執行一次性完成,不生成可儲存的目的碼。這只是表象,二者背後的最大區別是:對解釋執行而言,程式執行時的控制權在直譯器而不在使用者程式;對編譯執行而言,執行時的控制權在使用者程式。

解釋具有良好的動態特性和可移植性,比如在解釋執行時可以動態改變變數的型別、對程式進行修改以及在程式中插入良好的除錯診斷資訊等,而將直譯器移植到不同的系統上,則程式不用改動就可以在移植瞭直譯器的系統上執行。同時直譯器也有很大的缺點,比如執行效率低,佔用空間大,因為不僅要給使用者程式分配空間,直譯器本身也佔用了寶貴的系統資源。

編譯器是把源程式的每一條語句都編譯成機器語言,並儲存成二進位制檔案,這樣執行時計算機可以直接以機器語言來執行此程式,速度很快;
而直譯器則是隻在執行程式時,才一條一條的解釋成機器語言給計算機來執行,所以執行速度是不如編譯後的程式執行的快的.

 

編譯型和解釋型
我們先看看編譯型,其實它和組合語言是一樣的:也是有一個負責翻譯的程式來對我們的原始碼進行轉換,生成相對應的可執行程式碼。這個過程說得專業一點,就稱為編譯(Compile),而負責編譯的程式自然就稱為編譯器(Compiler)。如果我們寫的程式程式碼都包含在一個原始檔中,那麼通常編譯之後就會直接生成一個可執行檔案,我們就可以直接執行了。但對於一個比較複雜的專案,為了方便管理,我們通常把程式碼分散在各個原始檔中,作為不同的模組來組織。這時編譯各個檔案時就會生成目標檔案(Object   file)而不是前面說的可執行檔案。一般一個原始檔的編譯都會對應一個目標檔案。這些目標檔案裡的內容基本上已經是可執行程式碼了,但由於只是整個專案的一部分,所以我們還不能直接執行。待所有的原始檔的編譯都大功告成,我們就可以最後把這些半成品的目標檔案“打包”成一個可執行檔案了,這個工作由另一個程式負責完成,由於此過程好像是把包含可執行程式碼的目標檔案連線裝配起來,所以又稱為連結(Link),而負責連結的程式就叫……就叫連結程式(Linker)。連結程式除了連結目標檔案外,可能還有各種資源,像圖示檔案啊、聲音檔案啊什麼的,還要負責去除目標檔案之間的冗餘重複程式碼,等等,所以……也是挺累的。連結完成之後,一般就可以得到我們想要的可執行檔案了。 

上面我們大概地介紹了編譯型語言的特點,現在再看看解釋型。噢,從字面上看,“編譯”和“解釋”的確都有“翻譯”的意思,它們的區別則在於翻譯的時機安排不大一樣。打個比方:假如你打算閱讀一本外文書,而你不知道這門外語,那麼你可以找一名翻譯,給他足夠的時間讓他從頭到尾把整本書翻譯好,然後把書的母語版交給你閱讀;或者,你也立刻讓這名翻譯輔助你閱讀,讓他一句一句給你翻譯,如果你想往回看某個章節,他也得重新給你翻譯。 

兩種方式,前者就相當於我們剛才所說的編譯型:一次把所有的程式碼轉換成機器語言,然後寫成可執行檔案;而後者就相當於我們要說的解釋型:在程式執行的前一刻,還只有源程式而沒有可執行程式;而程式每執行到源程式的某一條指令,則會有一個稱之為解釋程式的外殼程式將原始碼轉換成二進位制程式碼以供執行,總言之,就是不斷地解釋、執行、解釋、執行……所以,解釋型程式是離不開解釋程式的。像早期的BASIC就是一門經典的解釋型語言,要執行BASIC程式,就得進入BASIC環境,然後才能載入程式原始檔、執行。解釋型程式中,由於程式總是以原始碼的形式出現,因此只要有相應的直譯器,移植幾乎不成問題。編譯型程式雖然原始碼也可以移植,但前提是必須針對不同的系統分別進行編譯,對於複雜的工程來說,的確是一件不小的時間消耗,況且很可能一些細節的地方還是要修改原始碼。而且,解釋型程式省卻了編譯的步驟,修改除錯也非常方便,編輯完畢之後即可立即執行,不必像編譯型程式一樣每次進行小小改動都要耐心等待漫長的Compiling…Linking…這樣的編譯連結過程。不過凡事有利有弊,由於解釋型程式是將編譯的過程放到執行過程中,這就決定了解釋型程式註定要比編譯型慢上一大截,像幾百倍的速度差距也是不足為奇的。 

編譯型與解釋型,兩者各有利弊。前者由於程式執行速度快,同等條件下對系統要求較低,因此像開發作業系統、大型應用程式、資料庫系統等時都採用它,像C/C++、Pascal/Object   Pascal(Delphi)、VB等基本都可視為編譯語言,而一些網頁尾本、伺服器指令碼及輔助開發介面這樣的對速度要求不高、對不同系統平臺間的相容性有一定要求的程式則通常使用解釋性語言,如Java、JavaScript、VBScript、Perl、Python等等。 

但既然編譯型與解釋型各有優缺點又相互對立,所以一批新興的語言都有把兩者折衷起來的趨勢,例如Java語言雖然比較接近解釋型語言的特徵,但在執行之前已經預先進行一次預編譯,生成的程式碼是介於機器碼和Java原始碼之間的中介程式碼,執行的時候則由JVM(Java的虛擬機器平臺,可視為直譯器)解釋執行。它既保留了原始碼的高抽象、可移植的特點,又已經完成了對原始碼的大部分預編譯工作,所以執行起來比“純解釋型”程式要快許多。而像VB6(或者以前版本)、C#這樣的語言,雖然表面上看生成的是.exe可執行程式檔案,但VB6編譯之後實際生成的也是一種中介碼,只不過編譯器在前面安插了一段自動呼叫某個外部直譯器的程式碼(該解釋程式獨立於使用者編寫的程式,存放於系統的某個DLL檔案中,所有以VB6編譯生成的可執行程式都要用到它),以解釋執行實際的程式體。C#(以及其它.net的語言編譯器)則是生成.net目的碼,實際執行時則由.net解釋系統(就像JVM一樣,也是一個虛擬機器平臺)進行執行。當然.net目的碼已經相當“低階”,比較接近機器語言了,所以仍將其視為編譯語言,而且其可移植程度也沒有Java號稱的這麼強大,Java號稱是“一次編譯,到處執行”,而.net則是“一次編碼,到處編譯”。呵呵,當然這些都是題外話了。總之,隨著設計技術與硬體的不斷髮展,編譯型與解釋型兩種方式的界限正在不斷變得模糊。

動態語言和靜態語言
通常我們所說的動態語言、靜態語言是指動態型別語言和靜態型別語言。

(1)動態型別語言:動態型別語言是指在執行期間才去做資料型別檢查的語言,也就是說,在用動態型別的語言程式設計時,永遠也不用給任何變數指定資料型別,該語言會在你第一次賦值給變數時,在內部將資料型別記錄下來。Python和Ruby就是一種典型的動態型別語言,其他的各種指令碼語言如VBScript也多少屬於動態型別語言。

(2)靜態型別語言:靜態型別語言與動態型別語言剛好相反,它的資料型別是在編譯其間檢查的,也就是說在寫程式時要宣告所有變數的資料型別,C/C++是靜態型別語言的典型代表,其他的靜態型別語言還有C#、JAVA等。

 

強型別定義語言和弱型別定義語言

(1)強型別定義語言:強制資料型別定義的語言。也就是說,一旦一個變數被指定了某個資料型別,如果不經過強制轉換,那麼它就永遠是這個資料型別了。舉個例子:如果你定義了一個整型變數a,那麼程式根本不可能將a當作字串型別處理。強型別定義語言是型別安全的語言。

(2)弱型別定義語言:資料型別可以被忽略的語言。它與強型別定義語言相反, 一個變數可以賦不同資料型別的值。

強型別定義語言在速度上可能略遜色於弱型別定義語言,但是強型別定義語言帶來的嚴謹效能夠有效的避免許多錯誤。另外,“這門語言是不是動態語言”與“這門語言是否型別安全”之間是完全沒有聯絡的!
例如:Python是動態語言,是強型別定義語言(型別安全的語言); VBScript是動態語言,是弱型別定義語言(型別不安全的語言); JAVA是靜態語言,是強型別定義語言(型別安全的語言)。

 

通過上面這些介紹,我們可以得出,python是一門動態解釋性的強型別定義語言。那這些基因使成就了Python的哪些優缺點呢?我們繼續往下看。

 

Python的優缺點

先看優點

  1. Python的定位是“優雅”、“明確”、“簡單”,所以Python程式看上去總是簡單易懂,初學者學Python,不但入門容易,而且將來深入下去,可以編寫那些非常非常複雜的程式。
  2. 開發效率非常高,Python有非常強大的第三方庫,基本上你想通過計算機實現任何功能,Python官方庫裡都有相應的模組進行支援,直接下載呼叫後,在基礎庫的基礎上再進行開發,大大降低開發週期,避免重複造輪子。
  3. 高階語言————當你用Python語言編寫程式的時候,你無需考慮諸如如何管理你的程式使用的記憶體一類的底層細節
  4. 可移植性————由於它的開源本質,Python已經被移植在許多平臺上(經過改動使它能夠工 作在不同平臺上)。如果你小心地避免使用依賴於系統的特性,那麼你的所有Python程式無需修改就幾乎可以在市場上所有的系統平臺上執行
  5. 可擴充套件性————如果你需要你的一段關鍵程式碼執行得更快或者希望某些演算法不公開,你可以把你的部分程式用C或C++編寫,然後在你的Python程式中使用它們。
  6. 可嵌入性————你可以把Python嵌入你的C/C++程式,從而向你的程式使用者提供指令碼功能。

再看缺點:

  1. 速度慢,Python 的執行速度相比C語言確實慢很多,跟JAVA相比也要慢一些,因此這也是很多所謂的大牛不屑於使用Python的主要原因,但其實這裡所指的執行速度慢在大多數情況下使用者是無法直接感知到的,必須藉助測試工具才能體現出來,比如你用C運一個程式花了0.01s,用Python是0.1s,這樣C語言直接比Python快了10倍,算是非常誇張了,但是你是無法直接通過肉眼感知的,因為一個正常人所能感知的時間最小單位是0.15-0.4s左右,哈哈。其實在大多數情況下Python已經完全可以滿足你對程式速度的要求,除非你要寫對速度要求極高的搜尋引擎等,這種情況下,當然還是建議你用C去實現的。
  2. 程式碼不能加密,因為PYTHON是解釋性語言,它的原始碼都是以名文形式存放的,不過我不認為這算是一個缺點,如果你的專案要求原始碼必須是加密的,那你一開始就不應該用Python來去實現。
  3. 執行緒不能利用多CPU問題,這是Python被人詬病最多的一個缺點,GIL即全域性直譯器鎖(Global Interpreter Lock),是計算機程式設計語言直譯器用於同步執行緒的工具,使得任何時刻僅有一個執行緒在執行,Python的執行緒是作業系統的原生執行緒。在Linux上為pthread,在Windows上為Win thread,完全由作業系統排程執行緒的執行。一個python直譯器程式內有一條主執行緒,以及多條使用者程式的執行執行緒。即使在多核CPU平臺上,由於GIL的存在,所以禁止多執行緒的並行執行。關於這個問題的折衷解決方法,我們在以後執行緒和程式章節裡再進行詳細探討。

 

當然,Python還有一些其它的小缺點,在這就不一一列舉了,我想說的是,任何一門語言都不是完美的,都有擅長和不擅長做的事情,建議各位不要拿一個語言的劣勢去跟另一個語言的優勢來去比較,語言只是一個工具,是實現程式設計師思想的工具,就像我們之前中學學幾何時,有的時候需要要圓規,有的時候需要用三角尺一樣,拿相應的工具去做它最擅長的事才是正確的選擇。之前很多人問我Shell和Python到底哪個好?我回答說Shell是個指令碼語言,但Python不只是個指令碼語言,能做的事情更多,然後又有鑽牛角尖的人說完全沒必要學Python, Python能做的事情Shell都可以做,只要你足夠牛B,然後又舉了用Shell可以寫俄羅斯方塊這樣的遊戲,對此我能說表達只能是,不要跟SB理論,SB會把你拉到跟他一樣的高度,然後用充分的經驗把你打倒。

 

 

Python直譯器

當我們編寫Python程式碼時,我們得到的是一個包含Python程式碼的以.py為副檔名的文字檔案。要執行程式碼,就需要Python直譯器去執行.py檔案。

由於整個Python語言從規範到直譯器都是開源的,所以理論上,只要水平夠高,任何人都可以編寫Python直譯器來執行Python程式碼(當然難度很大)。事實上,確實存在多種Python直譯器。

CPython

當我們從Python官方網站下載並安裝好Python 2.7後,我們就直接獲得了一個官方版本的直譯器:CPython。這個直譯器是用C語言開發的,所以叫CPython。在命令列下執行python就是啟動CPython直譯器。

CPython是使用最廣的Python直譯器。教程的所有程式碼也都在CPython下執行。

IPython

IPython是基於CPython之上的一個互動式直譯器,也就是說,IPython只是在互動方式上有所增強,但是執行Python程式碼的功能和CPython是完全一樣的。好比很多國產瀏覽器雖然外觀不同,但核心其實都是呼叫了IE。

CPython用>>>作為提示符,而IPython用In [序號]:作為提示符。

PyPy

PyPy是另一個Python直譯器,它的目標是執行速度。PyPy採用JIT技術,對Python程式碼進行動態編譯(注意不是解釋),所以可以顯著提高Python程式碼的執行速度。

絕大部分Python程式碼都可以在PyPy下執行,但是PyPy和CPython有一些是不同的,這就導致相同的Python程式碼在兩種直譯器下執行可能會有不同的結果。如果你的程式碼要放到PyPy下執行,就需要了解PyPy和CPython的不同點

Jython

Jython是執行在Java平臺上的Python直譯器,可以直接把Python程式碼編譯成Java位元組碼執行。

IronPython

IronPython和Jython類似,只不過IronPython是執行在微軟.Net平臺上的Python直譯器,可以直接把Python程式碼編譯成.Net的位元組碼。

小結

Python的直譯器很多,但使用最廣泛的還是CPython。如果要和Java或.Net平臺互動,最好的辦法不是用Jython或IronPython,而是通過網路呼叫來互動,確保各程式之間的獨立性。

 

二、Python發展史 

  • 1989年,為了打發聖誕節假期,Guido開始寫Python語言的編譯器。Python這個名字,來自Guido所摯愛的電視劇Monty Python’s Flying Circus。他希望這個新的叫做Python的語言,能符合他的理想:創造一種C和shell之間,功能全面,易學易用,可擴充的語言。
  • 1991年,第一個Python編譯器誕生。它是用C語言實現的,並能夠呼叫C語言的庫檔案。從一出生,Python已經具有了:類,函式,異常處理,包含表和詞典在內的核心資料型別,以及模組為基礎的擴充系統。
  • Granddaddy of Python web frameworks, Zope 1 was released in 1999
  • Python 1.0 - January 1994 增加了 lambdamapfilter and reduce.
  • Python 2.0 - October 16, 2000,加入了記憶體回收機制,構成了現在Python語言框架的基礎
  • Python 2.4 - November 30, 2004, 同年目前最流行的WEB框架Django 誕生
  • Python 2.5 - September 19, 2006
  • Python 2.6 - October 1, 2008
  • Python 2.7 - July 3, 2010
  • In November 2014, it was announced that Python 2.7 would be supported until 2020, and reaffirmed that there would be no 2.8 release as users were expected to move to Python 3.4+ as soon as possible
  • Python 3.0 - December 3, 2008
  • Python 3.1 - June 27, 2009
  • Python 3.2 - February 20, 2011
  • Python 3.3 - September 29, 2012
  • Python 3.4 - March 16, 2014
  • Python 3.5 - September 13, 2015

三、Python 2 or 3?

In summary : Python 2.x is legacy, Python 3.x is the present and future of the language

Python 3.0 was released in 2008. The final 2.x version 2.7 release came out in mid-2010, with a statement of

extended support for this end-of-life release. The 2.x branch will see no new major releases after that. 3.x is

under active development and has already seen over five years of stable releases, including version 3.3 in 2012,

3.4 in 2014, and 3.5 in 2015. This means that all recent standard library improvements, for example, are only

available by default in Python 3.x.

Guido van Rossum (the original creator of the Python language) decided to clean up Python 2.x properly, with less regard for backwards compatibility than is the case for new releases in the 2.x range. The most drastic improvement is the better Unicode support (with all text strings being Unicode by default) as well as saner bytes/Unicode separation.

Besides, several aspects of the core language (such as print and exec being statements, integers using floor division) have been adjusted to be easier for newcomers to learn and to be more consistent with the rest of the language, and old cruft has been removed (for example, all classes are now new-style, "range()" returns a memory efficient iterable, not a list as in 2.x). 

py2與3的詳細區別

PRINT IS A FUNCTION

The statement has been replaced with a print() function, with keyword arguments to replace most of the special syntax of the old statement (PEP 3105). Examples: 

You can also customize the separator between items, e.g.: 

1
print("There are <"2**32"> possibilities!", sep="")

ALL IS UNICODE NOW

從此不再為討厭的字元編碼而煩惱

 

還可以這樣玩: (A,*REST,B)=RANGE(5)

1
2
3
4
<strong>>>> a,*rest,b = range(5)
>>> a,rest,b
(0, [123], 4)
</strong>

  

某些庫改名了

 

Old Name

New Name

_winreg

winreg

ConfigParser

configparser

copy_reg

copyreg

Queue

queue

SocketServer

socketserver

markupbase

_markupbase

repr

reprlib

test.test_support

test.support

  

還有誰不支援PYTHON3?

One popular module that don't yet support Python 3 is Twisted (for networking and other applications). Most

actively maintained libraries have people working on 3.x support. For some libraries, it's more of a priority than

others: Twisted, for example, is mostly focused on production servers, where supporting older versions of

Python is important, let alone supporting a new version that includes major changes to the language. (Twisted is

a prime example of a major package where porting to 3.x is far from trivial 

 

四、Python安裝

windows

1
2
3
4
5
6
7
1、下載安裝包
    https://www.python.org/downloads/
2、安裝
    預設安裝路徑:C:\python27
3、配置環境變數
    【右鍵計算機】--》【屬性】--》【高階系統設定】--》【高階】--》【環境變數】--》【在第二個內容框中找到 變數名為Path 的一行,雙擊】 --> 【Python安裝目錄追加到變值值中,用 ; 分割】
    如:原來的值;C:\python27,切記前面有分號

linux、Mac

1
2
3
無需安裝,原裝Python環境
  
ps:如果自帶2.6,請更新至2.7

  

五、Hello World程式

在linux 下建立一個檔案叫hello.py,並輸入

1
print("Hello World!")

然後執行命令:python hello.py ,輸出

1
2
3
localhost:~ jieli$ vim hello.py
localhost:~ jieli$ python hello.py
Hello World!

指定直譯器

上一步中執行 python hello.py 時,明確的指出 hello.py 指令碼由 python 直譯器來執行。

如果想要類似於執行shell指令碼一樣執行python指令碼,例: ./hello.py ,那麼就需要在 hello.py 檔案的頭部指定直譯器,如下:

1
2
3
#!/usr/bin/env python
  
print "hello,world"

如此一來,執行: ./hello.py 即可。

ps:執行前需給予 hello.py 執行許可權,chmod 755 hello.py

在互動器中執行 

除了把程式寫在檔案裡,還可以直接呼叫python自帶的互動器執行程式碼, 

1
2
3
4
5
6
localhost:~ jieli$ python
Python 2.7.10 (default, Oct 23 201518:05:06)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help""copyright""credits" or "license" for more information.
>>> print("Hello World!")
Hello World!

對比下其它語言的hello world

 C++
 C
 JAVA
 PHP
 RUBY
 Go

 

六、變數\字元編碼  

Variables are used to store information to be referenced and manipulated in a computer program. They also provide a way of labeling data with a descriptive name, so our programs can be understood more clearly by the reader and ourselves. It is helpful to think of variables as containers that hold information. Their sole purpose is to label and store data in memory. This data can then be used throughout your program.

宣告變數

1
2
3
#_*_coding:utf-8_*_
 
name = "Alex Li"

上述程式碼宣告瞭一個變數,變數名為: name,變數name的值為:"Alex Li" 

變數定義的規則:

  • 變數名只能是 字母、數字或下劃線的任意組合
  • 變數名的第一個字元不能是數字
  • 以下關鍵字不能宣告為變數名
    ['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']
變數的賦值
1
2
3
4
5
6
7
8
name = "Alex Li"
 
name2 = name
print(name,name2)
 
name = "Jack"
 
print("What is the value of name2 now?")

 

七、字元編碼

python直譯器在載入 .py 檔案中的程式碼時,會對內容進行編碼(預設ascill)

ASCII(American Standard Code for Information Interchange,美國標準資訊交換程式碼)是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言,其最多隻能用 8 位來表示(一個位元組),即:2**8 = 256-1,所以,ASCII碼最多隻能表示 255 個符號。

 

關於中文

為了處理漢字,程式設計師設計了用於簡體中文的GB2312和用於繁體中文的big5。

GB2312(1980年)一共收錄了7445個字元,包括6763個漢字和682個其它符號。漢字區的內碼範圍高位元組從B0-F7,低位元組從A1-FE,佔用的碼位是72*94=6768。其中有5個空位是D7FA-D7FE。

GB2312 支援的漢字太少。1995年的漢字擴充套件規範GBK1.0收錄了21886個符號,它分為漢字區和圖形符號區。漢字區包括21003個字元。2000年的 GB18030是取代GBK1.0的正式國家標準。該標準收錄了27484個漢字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。現在的PC平臺必須支援GB18030,對嵌入式產品暫不作要求。所以手機、MP3一般只支援GB2312。

從ASCII、GB2312、GBK 到GB18030,這些編碼方法是向下相容的,即同一個字元在這些方案中總是有相同的編碼,後面的標準支援更多的字元。在這些編碼中,英文和中文可以統一地處理。區分中文編碼的方法是高位元組的最高位不為0。按照程式設計師的稱呼,GB2312、GBK到GB18030都屬於雙位元組字符集 (DBCS)。

有的中文Windows的預設內碼還是GBK,可以通過GB18030升級包升級到GB18030。不過GB18030相對GBK增加的字元,普通人是很難用到的,通常我們還是用GBK指代中文Windows內碼。

 

 

顯然ASCII碼無法將世界上的各種文字和符號全部表示,所以,就需要新出一種可以代表所有字元和符號的編碼,即:Unicode

Unicode(統一碼、萬國碼、單一碼)是一種在計算機上使用的字元編碼。Unicode 是為了解決傳統的字元編碼方案的侷限而產生的,它為每種語言中的每個字元設定了統一併且唯一的二進位制編碼,規定雖有的字元和符號最少由 16 位來表示(2個位元組),即:2 **16 = 65536,
注:此處說的的是最少2個位元組,可能更多

UTF-8,是對Unicode編碼的壓縮和優化,他不再使用最少使用2個位元組,而是將所有的字元和符號進行分類:ascii碼中的內容用1個位元組儲存、歐洲的字元用2個位元組儲存,東亞的字元用3個位元組儲存...

所以,python直譯器在載入 .py 檔案中的程式碼時,會對內容進行編碼(預設ascill),如果是如下程式碼的話:

報錯:ascii碼無法表示中文

1
2
3
#!/usr/bin/env python
  
print "你好,世界"

改正:應該顯示的告訴python直譯器,用什麼編碼來執行原始碼,即:

1
2
3
4
#!/usr/bin/env python
# -*- coding: utf-8 -*-
  
print "你好,世界"

註釋

  當行注視:# 被註釋內容

  多行註釋:""" 被註釋內容 """

  

  

 

八、使用者輸入 

1
2
3
4
5
6
7
#!/usr/bin/env python
#_*_coding:utf-8_*_
 
 
#name = raw_input("What is your name?") #only on python 2.x
name = input("What is your name?")
print("Hello " + name )

輸入密碼時,如果想要不可見,需要利用getpass 模組中的 getpass方法,即:

1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python
# -*- coding: utf-8 -*-
  
import getpass
  
# 將使用者輸入的內容賦值給 name 變數
pwd = getpass.getpass("請輸入密碼:")
  
# 列印輸入的內容
print(pwd)

 

九、模組初識  

Python的強大之處在於他有非常豐富和強大的標準庫和第三方庫,幾乎你想實現的任何功能都有相應的Python庫支援,以後的課程中會深入講解常用到的各種庫,現在,我們先來象徵性的學2個簡單的。

sys

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import sys
 
print(sys.argv)
 
 
#輸出
$ python test.py helo world
['test.py''helo''world']  #把執行指令碼時傳遞的引數獲取到了

  

os

1
2
3
4
5
6
#!/usr/bin/env python
# -*- coding: utf-8 -*-
 
import os
 
os.system("df -h"#呼叫系統命令

完全結合一下  

1
2
3
import os,sys
 
os.system(''.join(sys.argv[1:])) #把使用者的輸入的引數當作一條命令交給os.system來執行

自己寫個模組

python tab補全模組

 for mac
 for Linux

寫完儲存後就可以使用了

1
2
3
4
5
localhost:~ jieli$ python
Python 2.7.10 (default, Oct 23 201518:05:06)
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help""copyright""credits" or "license" for more information.
>>> import tab

你會發現,上面自己寫的tab.py模組只能在當前目錄下匯入,如果想在系統的何何一個地方都使用怎麼辦呢? 此時你就要把這個tab.py放到python全域性環境變數目錄裡啦,基本一般都放在一個叫 Python/2.7/site-packages 目錄下,這個目錄在不同的OS裡放的位置不一樣,用 print(sys.path) 可以檢視python環境變數列表。

  

十、.pyc是個什麼鬼?

1. Python是一門解釋型語言?

我初學Python時,聽到的關於Python的第一句話就是,Python是一門解釋性語言,我就這樣一直相信下去,直到發現了*.pyc檔案的存在。如果是解釋型語言,那麼生成的*.pyc檔案是什麼呢?c應該是compiled的縮寫才對啊!

為了防止其他學習Python的人也被這句話誤解,那麼我們就在文中來澄清下這個問題,並且把一些基礎概念給理清。

  

2. 解釋型語言和編譯型語言 

計算機是不能夠識別高階語言的,所以當我們執行一個高階語言程式的時候,就需要一個“翻譯機”來從事把高階語言轉變成計算機能讀懂的機器語言的過程。這個過程分成兩類,第一種是編譯,第二種是解釋。

編譯型語言在程式執行之前,先會通過編譯器對程式執行一個編譯的過程,把程式轉變成機器語言。執行時就不需要翻譯,而直接執行就可以了。最典型的例子就是C語言。

解釋型語言就沒有這個編譯的過程,而是在程式執行的時候,通過直譯器對程式逐行作出解釋,然後直接執行,最典型的例子是Ruby。

通過以上的例子,我們可以來總結一下解釋型語言和編譯型語言的優缺點,因為編譯型語言在程式執行之前就已經對程式做出了“翻譯”,所以在執行時就少掉了“翻譯”的過程,所以效率比較高。但是我們也不能一概而論,一些解釋型語言也可以通過直譯器的優化來在對程式做出翻譯時對整個程式做出優化,從而在效率上超過編譯型語言。

此外,隨著Java等基於虛擬機器的語言的興起,我們又不能把語言純粹地分成解釋型和編譯型這兩種。

用Java來舉例,Java首先是通過編譯器編譯成位元組碼檔案,然後在執行時通過直譯器給解釋成機器檔案。所以我們說Java是一種先編譯後解釋的語言。

 

3. Python到底是什麼 

其實Python和Java/C#一樣,也是一門基於虛擬機器的語言,我們先來從表面上簡單地瞭解一下Python程式的執行過程吧。

當我們在命令列中輸入python hello.py時,其實是啟用了Python的“直譯器”,告訴“直譯器”:你要開始工作了。可是在“解釋”之前,其實執行的第一項工作和Java一樣,是編譯。

熟悉Java的同學可以想一下我們在命令列中如何執行一個Java的程式:

javac hello.java

java hello

 

只是我們在用Eclipse之類的IDE時,將這兩部給融合成了一部而已。其實Python也一樣,當我們執行python hello.py時,他也一樣執行了這麼一個過程,所以我們應該這樣來描述Python,Python是一門先編譯後解釋的語言。

4. 簡述Python的執行過程

在說這個問題之前,我們先來說兩個概念,PyCodeObject和pyc檔案。

我們在硬碟上看到的pyc自然不必多說,而其實PyCodeObject則是Python編譯器真正編譯成的結果。我們先簡單知道就可以了,繼續向下看。

當python程式執行時,編譯的結果則是儲存在位於記憶體中的PyCodeObject中,當Python程式執行結束時,Python直譯器則將PyCodeObject寫回到pyc檔案中。

當python程式第二次執行時,首先程式會在硬碟中尋找pyc檔案,如果找到,則直接載入,否則就重複上面的過程。

所以我們應該這樣來定位PyCodeObject和pyc檔案,我們說pyc檔案其實是PyCodeObject的一種持久化儲存方式。

 

十一、資料型別初識 

1、數字

2 是一個整數的例子。
長整數 不過是大一些的整數。
3.23和52.3E-4是浮點數的例子。E標記表示10的冪。在這裡,52.3E-4表示52.3 * 10-4。
(-5+4j)和(2.3-4.6j)是複數的例子,其中-5,4為實數,j為虛數,數學中表示覆數是什麼?。

int(整型)

  在32位機器上,整數的位數為32位,取值範圍為-2**31~2**31-1,即-2147483648~2147483647
  在64位系統上,整數的位數為64位,取值範圍為-2**63~2**63-1,即-9223372036854775808~9223372036854775807
long(長整型)
  跟C語言不同,Python的長整數沒有指定位寬,即:Python沒有限制長整數數值的大小,但實際上由於機器記憶體有限,我們使用的長整數數值不可能無限大。
  注意,自從Python2.2起,如果整數發生溢位,Python會自動將整數資料轉換為長整數,所以如今在長整數資料後面不加字母L也不會導致嚴重後果了。
float(浮點型)
      先掃盲 http://www.cnblogs.com/alex3714/articles/5895848.html 
  浮點數用來處理實數,即帶有小數的數字。類似於C語言中的double型別,佔8個位元組(64位),其中52位表示底,11位表示指數,剩下的一位表示符號。
complex(複數)
  複數由實數部分和虛數部分組成,一般形式為x+yj,其中的x是複數的實數部分,y是複數的虛數部分,這裡的x和y都是實數。
注:Python中存在小數字池:-5 ~ 257
 
2、布林值
  真或假
  1 或 0
3、字串
"hello world"
萬惡的字串拼接:
  python中的字串在C語言中體現為是一個字元陣列,每次建立字串時候需要在記憶體中開闢一塊連續的空,並且一旦需要修改字串的話,就需要再次開闢空間,萬惡的+號每出現一次就會在內從中重新開闢一塊空間。
字串格式化輸出
1
2
3
4
name = "alex"
print "i am %s " % name
  
#輸出: i am alex

PS: 字串是 %s;整數 %d;浮點數%f

字串常用功能:
  • 移除空白
  • 分割
  • 長度
  • 索引
  • 切片
4、列表
建立列表:
1
2
3
name_list = ['alex''seven''eric']
name_list = list(['alex''seven''eric'])

基本操作:

  • 索引
  • 切片
  • 追加
  • 刪除
  • 長度
  • 切片
  • 迴圈
  • 包含
5、元組(不可變列表)
建立元組:
1
2
3
ages = (1122334455)
ages = tuple((1122334455))
 
6、字典(無序)
建立字典:
1
2
3
person = {"name""mr.wu"'age'18}
person = dict({"name""mr.wu"'age'18})

常用操作:

  • 索引
  • 新增
  • 刪除
  • 鍵、值、鍵值對
  • 迴圈
  • 長度

十二、資料運算  

算數運算:

比較運算:

賦值運算:

邏輯運算:

成員運算:

身份運算:

位運算:

*按位取反運算規則(按位取反再加1)   詳解http://blog.csdn.net/wenxinwukui234/article/details/42119265

 

運算子優先順序:

更多內容:猛擊這裡

  

十三、表示式if ... else

場景一、使用者登陸驗證

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 提示輸入使用者名稱和密碼
  
# 驗證使用者名稱和密碼
#     如果錯誤,則輸出使用者名稱或密碼錯誤
#     如果成功,則輸出 歡迎,XXX!
 
 
#!/usr/bin/env python
# -*- coding: encoding -*-
  
import getpass
  
  
name = raw_input('請輸入使用者名稱:')
pwd = getpass.getpass('請輸入密碼:')
  
if name == "alex" and pwd == "cmd":
    print("歡迎,alex!")
else:
    print("使用者名稱和密碼錯誤")

場景二、猜年齡遊戲

在程式裡設定好你的年齡,然後啟動程式讓使用者猜測,使用者輸入後,根據他的輸入提示使用者輸入的是否正確,如果錯誤,提示是猜大了還是小了

  

外層變數,可以被內層程式碼使用
內層變數,不應被外層程式碼使用

 

十四、表示式for loop

最簡單的迴圈10次

1
2
3
4
5
6
#_*_coding:utf-8_*_
__author__ = 'Alex Li'
 
 
for in range(10):
    print("loop:", i )

輸出:

1
2
3
4
5
6
7
8
9
10
loop: 0
loop: 1
loop: 2
loop: 3
loop: 4
loop: 5
loop: 6
loop: 7
loop: 8
loop: 9

需求一:還是上面的程式,但是遇到小於5的迴圈次數就不走了,直接跳入下一次迴圈

1
2
3
4
for in range(10):
    if i<5:
        continue #不往下走了,直接進入下一次loop
    print("loop:", i )

需求二:還是上面的程式,但是遇到大於5的迴圈次數就不走了,直接退出

1
2
3
4
for in range(10):
    if i>5:
        break #不往下走了,直接跳出整個loop
    print("loop:", i )

 

十五、while loop   

 有一種迴圈叫死迴圈,一經觸發,就執行個天荒地老、海枯石爛。

海枯石爛程式碼

1
2
3
4
5
count = 0
while True:
    print("你是風兒我是沙,纏纏綿綿到天涯...",count)
    count +=1
    

 

其實除了時間,沒有什麼是永恆的,死loop還是少寫為好 

上面的程式碼迴圈100次就退出吧

 

 

 

回到上面for 迴圈的例子,如何實現讓使用者不斷的猜年齡,但只給最多3次機會,再猜不對就退出程式。

  

  

十六、作業 

作業一:部落格

作業二:編寫登陸介面

  • 輸入使用者名稱密碼
  • 認證成功後顯示歡迎資訊
  • 輸錯三次後鎖定

 

作業三:多級選單
  • 三級選單
  • 可依次選擇進入各子選單
  • 所需新知識點:列表、字典

  

  

  

 

 

  

  

 

  

 

入門知識拾遺

一、bytes型別

 

二、三元運算

1
result = 1 if 條件 else 2

如果條件為真:result = 值1
如果條件為假:result = 值2

三、進位制

  • 二進位制,01
  • 八進位制,01234567
  • 十進位制,0123456789
  • 十六進位制,0123456789ABCDEF  二進位制到16進位制轉換http://jingyan.baidu.com/album/47a29f24292608c0142399cb.html?picindex=1

計算機記憶體地址和為什麼用16進位制?

為什麼用16進位制
1、計算機硬體是0101二進位制的,16進位制剛好是2的倍數,更容易表達一個命令或者資料。十六進位制更簡短,因為換算的時候一位16進位制數可以頂4位2進位制數,也就是一個位元組(8位進位制可以用兩個16進製表示)
2、最早規定ASCII字符集採用的就是8bit(後期擴充套件了,但是基礎單位還是8bit),8bit用2個16進位制直接就能表達出來,不管閱讀還是儲存都比其他進位制要方便
3、計算機中CPU運算也是遵照ASCII字符集,以16、32、64的這樣的方式在發展,因此資料交換的時候16進位制也顯得更好
4、為了統一規範,CPU、記憶體、硬碟我們看到都是採用的16進位制計算


16進位制用在哪裡
1、網路程式設計,資料交換的時候需要對位元組進行解析都是一個byte一個byte的處理,1個byte可以用0xFF兩個16進位制來表達。通過網路抓包,可以看到資料是通過16進位制傳輸的。
2、資料儲存,儲存到硬體中是0101的方式,儲存到系統中的表達方式都是byte方式

3、一些常用值的定義,比如:我們經常用到的html中color表達,就是用的16進位制方式,4個16進位制位可以表達好幾百萬的顏色資訊。

 

四、 一切皆物件

對於Python,一切事物都是物件,物件基於類建立

所以,以下這些值都是物件: "wupeiqi"、38、['北京', '上海', '深圳'],並且是根據不同的類生成的物件。

 

  

  

 

  

 
 

相關文章