簡單介紹一下Python(圖文詳解)

2022-03-24 22:01:35
本篇文章給大家帶來了關於的相關知識,其中主要介紹了包括程式執行機制和Python語言的誕生與發展史等相關問題,希望對大家有幫助。

推薦學習:

一、計算機組成

  計算機已經成為我們這個時代的核心裝置,我們無時無刻都需要它。它也已經不是人們印象中的桌上型電腦、伺服器,已經演變成了我們身邊的任何物體,如手機、平板電腦和筆電,以及很多人主觀上沒有意識到,但實際裝置內部確實包含「計算機」的裝置,如電視機、微波爐、汽車,甚至小孩玩的智慧機器人等。毫不誇張地說,計算機已經成為人身體的延伸,大腦的延伸,成為不可或缺的一部分。未來,計算機將真的進入人體、進入大腦,真正成為人體的一部分。比如,在科幻電影《駭客帝國》中的主角被超級針頭插在頸部後方便可以實現快速學習,改變大腦神經網路,幾秒成為功夫高手。計算機,俗稱電腦(Computer),用於高速計算的電子機器,是20世紀最偉大的科學技術發明之一,可以進行數值計算和邏輯判斷,同時還具有儲存記憶和資料處理的功能。一個完整的計算機系統由硬體系統軟體系統組成,如下圖所示:

1.1 硬體系統

  硬體系統主要可以分為主機和外設,是指構成計算機系統的物理實體,它們主要由各種各樣的電子器件和機電裝置組成。從ENIAC(世界上第一臺計算機)到目前最先進的電腦,硬體系統的設計採用的都是馮·諾依曼體系結構,如下所示:

  • 運算器: 負責資料的算術運算和邏輯運算,即資料的加工處理;
  • 控制器: 計算機的中樞神經,協調計算機各部分元件工作以及記憶體和外設的存取;
    其中:運算器和控制器統稱為中央處理器,即CPU
  • 記憶體: 實現記憶功能的部件,用來儲存程式、資料、命令和各種訊號等資訊,並在需要時提供這些資訊;
  • 輸入裝置: 實現將程式、原始資料、文字、字元、控制命令或現場採集的資料等資訊輸入到計算機中;
  • 輸出裝置: 實現將計算機處理後生成的中間結果或最終結果輸出,包括各種資料符號、文字和控制訊號等資訊;

1.2 軟體系統

  軟體系統主要可以分為系統軟體和應用軟體,是指保證計算機正常執行所需的各種程式,是我們程式設計實踐的主要物件,組成如下:

  • 系統軟體: 保證計算機硬體的正常工作和效能得到發揮,並且為計算機使用者提供一個直觀、友好和方便的使用介面。
  1. 作業系統: 方便使用者控制和管理計算機軟硬體資源的系統軟體,功能複雜,是所有軟體正常執行的基礎和核心;
  2. 編譯程式: 也叫語言處理程式,作用是把程式設計師使用各種程式語言,如Java和Python等所編寫的程式,翻譯成計算機可執行的機器語言。
  • 應用軟體: 應用軟體是計算機為滿足不同使用者的需求而提供的那部分軟體,它可以拓寬計算機系統的應用領域,方法硬體的效能。
  1. 社交辦公類: 微信、QQ、WPS、騰訊會議、釘釘、陌陌等;
  2. 休閒娛樂類: QQ音樂、騰訊視訊、Steam、歡樂鬥地主等;

二、程式執行機制

  機器語言也叫機器碼,是可以通過CPU進行分析和執行的指令集。計算機只能識別0和1的機器碼,不能接收類似於漢語、英語或其它的人類語言。因此,為了實現人類和計算機的互動,各種程式語言應運而生,如C++、Java、PhP和Python等。

2.1 編譯型和解釋型

分析: 計算機可以直接識別下面這段Python程式碼嗎?

"""
分析:在控制檯輸出以下Python程式碼,計算機可以直接處理嗎?
"""print("Hello world!")  # print()為Python中的內建函數,主要用於輸出括號內的內容,類似於Java中的System.out.println("Hello world!")

  顯然,上述程式碼主要由英文字母和標點符號組成,但前面已經說過,計算機只能識別機器碼(0和1),即它本身壓根就不認識這段程式碼。

  那麼,我們是如何通過程式碼控制計算機進行工作的?

  人機互動的過程就像一個當地人與一個外國人進行交流時一樣,如果雙方想要理解彼此的想法,就需要一箇中間媒介,它可以通過某種方式把對方的語言轉換成自己可以理解的語言,反之亦然。因此,計算機如果想要理解我們編寫的程式碼,就需要將其轉換為自己可以識別的機器碼,而根據轉換過程,程式語言又被分為編譯型和解釋型。

  • 編譯型: 編譯型語言可以直接將程式碼轉為計算機可以識別並執行的機器碼,如C++
  • 解釋型: 直譯語言先將程式碼轉換為位元組碼,然後再將其翻譯成計算機可識別的機器碼,如Python

2.2 計算機處理程式的流程

  1. 使用者開啟程式,程式開始執行;
  2. 作業系統將程式內容和相關資料送入計算機記憶體;
  3. CPU根據程式內容從記憶體中讀取指令;
  4. CPU分析、處理指令,併為下一條指令做好準備;
  5. 讀取下一條指令分析並處理,如此迴圈往復直至處理完程式中的全部指令,最後將計算結果放入指令指定的記憶體地址中;

2.3 計算機語言發展史

   演演算法是計算機的靈魂,而程式語言是使得計算機具有靈魂的工具。伴隨著計算機硬體的發展,計算機程式語言也歷經了從低階到高階的演變,而每一次改變的核心思想就是「讓人更容易程式設計」。計算機硬體的速度越快、體積越小、成本越低,應用到人類社會的場景就會越多,那麼所需要的演演算法就會越複雜,也就要求計算機程式語言越高階。最初重達幾十噸但一秒只能運算5000次的ENIAC,只能做非常小的應用,如彈道計算。如今,任何一個人的手機運算能力都可以秒殺那個年代地球上所有計算機運算能力的總和。越容易使用的語言,就有越多人使用;越多人使用,就有越多人共同作業;越多人共同作業,就可以創造越複雜的物體。現代社會,一個軟體動輒幾十或幾百人、甚至幾千人共同作業也成為可能,這自然就為開發複雜軟體提供了「人力基礎」。這是一個人類普遍的社會現象,越容易使用的工具,通過使用數量,通過大量人的共同作業,徹底改變某個行業甚至人類社會。未來三十年必將是軟體人才的世界,除普通軟體,大量人工智慧軟體,如自動駕駛、機器人保姆以及機器人女友都會進入我們的生活,甚至計算機技術和基因工程結合以實現長生不老,感興趣的可以閱讀一下《未來簡史: 從智人到智神》。

  • 機器語言: 相當於人類的的原始階段;

  機器語言由數位組成所有指令。當讓你使用數位程式設計,寫幾百個數位、甚至幾千個數位,每天面對的是純數位,可以大膽預測:「程式設計師群體100%會有精神問題」。機器語言通常由數位串組成(最終被簡化成二進位制0和1),對於人類來說,機器語言過於繁瑣。使用機器語言,人類無法編出複雜的程式。

  • 組合語言: 相當於人類的手工業階段;

  為了程式設計的方便,以及解決更加複雜的問題,程式設計師開始改進機器語言,使用英文縮寫的助記符(單詞)來表示基本的計算機操作。這些助記符構成了組合語言的基礎,如:LOAD、MOVE 之類,這樣人更容易記憶和使用。識別成百上千個單詞,總比成百上千個數位,感覺會好很多。組合語言相當於人類的手工業社會,需要技術極其嫻熟的工匠,但是開發效率也非常低。組合語言雖然能編寫高效率的程式,但是學習和使用都不是易事,並且很難偵錯。另一個複雜的問題,組合語言以及早期的計算機語言(Basic、Fortran等)沒有考慮結構化設計原則,而是使用goto語句來作為程式流程控制的主要方法。這樣做的後果是:一大堆混亂的調轉語句使得程式幾乎不可能被讀懂。對於那個時代的程式設計師,能讀懂上個月自己寫的程式碼都成為一種挑戰。即使這樣,組合語言仍然應用於工業電子程式設計領域、軟體的加密解密、計算機病毒分析等。

  • 高階程式語言: 相當於人類工業階段;

  對於簡單的任務,組合語言可以勝任。但是,隨著計算機的發展以及其漸漸滲透到了工作生活的方方面面,一些複雜的任務出現了,組合語言就顯得力不從心(應該說是程式設計師使用組合語言解決複雜問題出現了瓶頸)。於是,出現了高階語言,如C++Java等。語言越高階,越接近人的思維,使用起來就越方便。高階語言,尤其是物件導向的語言,如Java、Python等,使得程式設計的難度和門檻越來越低。目前以及可預見的未來,計算機語言仍然處於「第三代高階語言」階段,高階語言允許程式設計師使用接近日常英語的指令來編寫程式。例如,實現一個簡單的任務:A+B=C , 使用機器語言、組合語言和高階語言的的實現如下所示:
在這裡插入圖片描述

三、Python語言的誕生與發展史

Python是一門動態資料型別、物件導向的直譯語言,主要用於人工智慧的各個領域,如機器學習、爬蟲與資料分析、深度學習、計算機視覺等。

TIOBE程式語言排行榜:

3.1 誕生與發展

  • 時代背景: 硬體限制;

  Python的作者,Guido von Rossum(吉多·範·羅蘇姆),荷蘭人。1982年,吉多從阿姆斯特丹大學獲得了數學和計算機碩士學位。然而,儘管他算得上是一位數學家,但他更加享受計算機帶來的樂趣。用他的話說,雖然擁有數學和計算機雙料資質,他總趨向於做計算機相關的工作,並熱衷於做任何和程式設計相關的事情。在那個時候,吉多接觸並使用過諸如Pascal、C、Fortran等語言。這些語言的基本設計原則是讓機器能更快執行。在80年代,雖然IBM和蘋果已經掀起了個人電腦(personal computer)浪潮,但這些個人電腦的設定很低。比如早期的Macintosh,只有8MHz的CPU主頻和128KB的RAM,一個大的陣列就能佔滿記憶體。所有的編譯器的核心是做優化,以便讓程式能夠執行。為了增進效率,語言也迫使程式設計師像計算機一樣思考,以便能寫出更符合機器口味的程式。在那個時代,程式設計師恨不得用手榨取計算機每一寸的能力。有人甚至認為C語言的指標是在浪費記憶體。至於動態型別,記憶體自動管理,物件導向…… 別想了,那會讓你的電腦陷入癱瘓。

  • Shell: 本質是呼叫命令,它不是一個真正的語言;

  這種程式設計方式讓吉多感到苦惱。吉多知道如何用C語言寫出一個功能,但整個編寫過程需要耗費大量的時間,即使他已經準確的知道了如何實現。他的另一個選擇是shellBourne Shell作為UNIX系統的直譯器已經長期存在。UNIX的管理員們常常用shell去寫一些簡單的指令碼,以進行一些系統維護的工作,比如定期備份、檔案系統管理等等。shell可以像膠水一樣,將UNIX系統下的許多功能連線在一起。許多C語言上百行的程式,在shell下只用幾行就可以完成。然而,shell的本質是呼叫命令,它並不是一個真正的語言。例如,shell沒有數值型的資料型別,加法運算都很複雜。總之,shell不能全面調動計算機的功能

  • ABC語言: 可讀易用,弊端明顯;

  吉多希望有一種語言,這種語言能夠像C語言那樣,能夠全面呼叫計算機的功能介面,又可以像shell那樣,可以輕鬆的程式設計。ABC語言讓吉多看到希望。ABC是由荷蘭的數學和計算機研究所開發的。吉多在該研究所工作,並參與到ABC語言的開發。ABC語言以教學為目的。與當時的大部分語言不同,ABC語言的目標是「讓使用者感覺更好」。ABC語言希望讓語言變得容易閱讀、使用、記憶和學習,並以此來激發人們學習程式設計的興趣。
  然而,ABC語言編譯器需要很高的電腦設定才能執行,而這些電腦的使用者通常都精通電腦,所以他們更多的是關注程式的效率,而非它的學習難度。另一方面,如下致命的設計問題是它沒有流行起來的原因:

  1. 可延伸性差: ABC不是模組化語言,如果想在其中增加功能,如對圖形化的支援,需要改動很多地方。
  2. 不能直接進行IO: ABC不能直接操作檔案系統,即不能直接讀寫資料。輸入輸出的困難對於計算機而言是致命的,你能想象一個不能開啟車門的跑車嗎?
  3. 過度革新: ABC用自然語言的形式來表達程式的意義。例如,它使用How to來定義一個函數,而對於程式設計師來說,他們更習慣用functiondefine
  4. 傳播困難: ABC編譯器很大,必須儲存在磁帶上,這也就意味著如果想要使用它,必須先準備一個大大的磁帶。
  • Python孕育與成長: 介於CShell之間的簡單易學、功能全面的語言;

  1989年,為了打發聖誕節假期,吉多開始寫Python語言的編譯器。Python這個名字,來自吉多所摯愛的電視劇Monty Python’s Flying Circus。他希望這個新的叫做Python的語言,能符合他的理想:介於C和shell之間,功能全面,易學易用,可拓展的語言。吉多作為一個語言設計愛好者,已經有過設計語言的嘗試。這一次,也不過是一次純粹的hacking行為。

  1991年,第一個Python編譯器誕生。它是用C語言實現的,並能夠呼叫C語言的庫檔案。從一出生,Python已經具有了:類,函數,例外處理,包含表和詞典在內的核心資料型別,以及模組為基礎的拓展系統。Python語法很多來自C,但又受到ABC語言的強烈影響。來自ABC語言的一些規定直到今天還富有爭議,比如強制縮排,但這些語法規定讓Python容易讀。另一方面,Python聰明的選擇服從一些慣例,特別是C語言的慣例,比如恢復等號賦值。吉多認為,如果「常識」上確立的東西,沒有必要過度糾結。Python從一開始就特別在意可拓展性。Python可以在多個層次上拓展。從高層上,你可以直接引入.py檔案。在底層,你可以參照C語言的庫。Python程式設計師可以快速的使用Python寫.py檔案作為拓展模組。但當效能是考慮的重要因素時,Python程式設計師可以深入底層,寫C程式,編譯為.so檔案引入到Python中使用。Python就好像是使用鋼構建房一樣,先規定好大的框架,而程式設計師可以在此框架下相當自由的拓展或更改。

  最初的Python完全由吉多本人開發。Python得到吉多同事的歡迎。他們迅速的反饋使用意見,並參與到Python的改進。吉多和一些同事構成Python的核心團隊。他們將自己大部分的業餘時間用於hack Python。隨後,Python拓展到研究所之外。Python將許多技術層面上的細節隱藏,交給編譯器處理,並凸顯出邏輯層面的程式設計思考。因此,Python程式設計師可以花更多的時間用於思考程式的邏輯,而不是具體的實現細節。這一特徵吸引了廣大的程式設計師,Python開始流行。計算機硬體越來越強大,Python又容易使用,所以許多人開始轉向Python。吉多維護了一個mail list,Python使用者就通過郵件進行交流。Python使用者來自許多領域,有不同的背景,對Python也有不同的需求。Python相當的開放,又容易拓展,所以當使用者不滿足於現有功能,很容易對Python進行拓展或改造。隨後,這些使用者將改動發給吉多,並由吉多決定是否將新的特徵加入到Python或者標準庫中。如果程式碼能被納入Python自身或者標準庫,這將是極大的榮譽。由於吉多至高無上的決定權,他因此被稱為「終身的仁慈獨裁者」2018年7月12日,在完成PEP(Python Enhancement Proposals)572後,吉多決定退出Python核心決策層。

  Python以及其標準庫的功能強大,這些是整個社群的貢獻。Python的開發者來自不同領域,他們將不同領域的優點帶給Python。例如,Python標準庫中的正規表示式(Regular expression)是參考Perl,而lambda, map, filter, reduce等函數參考了Lisp。Python本身的一些功能以及大部分的標準庫來自於社群。Python的社群不斷擴大,進而擁有了自己的newsgroup,網站,以及基金。從Python 2.0開始,Python也從mail list的開發方式,轉為完全開源的開發方式。社群氣氛已經形成,工作被整個社群分擔,Python也獲得了更加高速的發展。到今天,Python的框架已經確立。Python語言以物件為核心組織程式碼,支援多種程式設計正規化,採用動態型別,自動進行記憶體回收。Python支援解釋執行,並能呼叫C庫進行拓展。Python有強大的標準庫。由於標準庫的體系已經穩定,所以Python的生態系統開始拓展到第三方包。這些包,如Django、web.py、wxpython、numpy、matplotlib、PIL,將Python升級成了物種豐富的熱帶雨林。

  Python崇尚優美、清晰、簡單,是一個優秀並廣泛使用的語言。Python在TIOBE排行榜中排行第八,它是Google的第三大開發語言,Dropbox的基礎語言,豆瓣的伺服器語言。Python的發展史可以作為一個代表,帶給我們許多啟示。在Python的開發過程中,社群起到了重要的作用。吉多自認為自己不是全能型的程式設計師,所以他只負責制訂框架。如果問題太複雜,他會選擇繞過去,也就是cut the corner。這些問題最終由社群中的其他人解決。社群中的人才是異常豐富的,就連建立網站,籌集基金這樣與開發稍遠的事情,也有人樂意於處理。如今的專案開發越來越複雜,越來越龐大,合作以及開放的心態將成為專案最終成功的關鍵

  Python從其他語言中學到了很多,無論是已經進入歷史的ABC,還是依然在使用的C和Perl,以及許多沒有列出的其他語言。可以說,Python的成功代表了它所有借鑑的語言的成功。同樣,Ruby借鑑了Python,它的成功也代表了Python某些方面的成功。每個語言都是混合體,都有它優秀的地方,但同時也有各種各樣的缺陷。同時,一個語言「好與不好」的評判,往往受制於平臺、硬體、時代等等外部原因,程式設計師經歷過許多語言之爭。

3.2 設計哲學

  • 獲取Python設計哲學: 成功安裝Python軟體後(下一個專題),開啟任意一個編輯環境鍵入import this執行即可;
  • 總結: 簡單優雅可延伸,實用扁平是關鍵,最佳方案only one???

3.3 優勢與不足

  • 優勢:
  1. 簡單易學可延伸: 閱讀一個良好的Python程式就像欣賞一篇優美的文章一樣,儘管它的要求非常嚴格,如強制縮排可提高程式碼的可讀性。Python的這種虛擬碼本質使得我們可以更多地關注於解決問題的邏輯而非搞明白語言本身,如我們無需過多關注諸如記憶體管理這樣的底層細節。如果我們希望一段關鍵程式碼執行的更快(C要比Python快50倍以上)或希望某些演演算法不公開,可以把部分程式用CC++語言編寫,然後在Python程式中進行呼叫。
  2. 免費開源可移植: Python是FLOSS(自由/開放原始碼軟體)之一,也就是說我們可以自由地釋出這個軟體的拷貝、閱讀它的原始碼 、對它做改動、把它的一部分用於新的自由軟體中。由於其開源本質,Python可移植在許多計算機平臺上,如Windows、Linux等
  3. 物件導向: Python既支援程式導向的程式設計也支援物件導向的程式設計。在「程式導向」的語言中,程式是由過程或僅僅是可重用程式碼的函數構建起來的。在「物件導向」的語言中,程式是由資料和功能組合而成的物件構建起來的。與其它的程式語言如C++和Java相比,Python以一種非常強大又簡單的方式實現物件導向程式設計,而封裝、繼承和多型三大特性則是它成"神"的關鍵。
  4. 動態語言: 動態語言,又稱為弱型別語言,是指變數在建立時不需宣告型別,具體型別根據指向的記憶體單元中的資料型別決定,即指向什麼型別就是什麼型別。相反,靜態語言(強型別語言),定義變數時需要宣告型別,變數指向的記憶體單元可存放的資料型別固定。例如,Python中定義一個整數變數為num = 10,而在Java中則為int num = 10;。總結:動態型別,指向可變,記憶體單元中的內容不可變;靜態型別,指向不可變,內容可變。
  5. 直譯語言: 編譯型語言,如C++寫的程式可以從原始檔(C++語言)轉換到一個你的計算機使用的語言,即二進位制程式碼(0和1)。這個過程通過編譯器和不同的標記以及選項完成。當我們執行程式的時候,連線轉載器軟體把我們的程式從硬碟複製到記憶體中並且執行。而Python語言寫的程式不需要編譯成二進位制程式碼。我們可以直接從原始碼執行程式。在計算機內部,Python直譯器把原始碼轉換成稱為位元組碼的中間形式,然後再把它翻譯成計算機使用的機器碼並執行。由於只需要把我們的Python程式拷貝到另外一臺計算機上,它就可以工作了,這也使得Python程式更加容易移植。
  6. 豐富的庫: 包括Python自帶的標準庫和第三方庫。其中Python的標準庫可以幫助我們處理各種工作,包括正規表示式、檔案生成、執行緒、資料庫、HTML、GUI等。這被稱作Python的「功能齊全」理念。除了標準庫以外,Python也支援安裝第三方庫,如wxPython、Twisted和Python影象庫等。
  • 缺點: Python語言非常完美,沒有明顯的短板和缺點。唯一的不足就是執行效率慢,而這個是直譯語言所通有的,不過這一缺陷會隨著計算機硬體效能的不斷提升而弱化。

3.4 應用場景

推薦學習:

以上就是簡單介紹一下Python(圖文詳解)的詳細內容,更多請關注TW511.COM其它相關文章!