一、Python介紹

來源:互聯網
上載者:User

標籤:全域   必須   源碼   分享   and   它的   邏輯運算   重複   過程   

一、低級語言與進階語言

最初的電腦程式都是用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 的優缺點

先看優點

  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的存在,所以禁止多線程的並存執行。
還有很多優缺點,等等...........

變數定義的規則:

    • 變數名只能是 字母、數字或底線的任意組合
    • 變數名的第一個字元不能是數字
    • 以下關鍵字不能聲明為變數名
      [‘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‘]
字元編碼

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)。

注釋

  當行注視:# 被注釋內容

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

詳情:http://www.runoob.com/python3/python3-tutorial.html資料類型 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~9223372036854775807long(長整型)
  跟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 或 03、字串字串常用功能:
  • 移除空白
  • 分割
  • 長度
  • 索引
  • 切片
4、列表

基本操作:

  • 索引
  • 切片
  • 追加
  • 刪除
  • 長度
  • 切片
  • 迴圈
  • 包含
5、元組(不可變列表) 6、字典(無序)

常用操作:

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

 7、集合

集合是一個無序的,不重複的資料群組合,它的主要作用如下:

  • 去重,把一個列表變成集合,就自動去重了
  • 關係測試,測試兩組資料之前的交集、差集、並集等關係
資料運算  算數運算:

比較運算:

賦值運算:

邏輯運算:

成員運算:

身份運算:

位元運算:

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

 

運算子優先順序:

if ... elif...elsefor loopwhile loop 

三元運算

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,一切事物都是對象,對象基於類建立

一、Python介紹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.