官术网_书友最值得收藏!

1.3 Python解釋器

以數字序列的方式來編寫程序是非常煩瑣的(盡管在計算機時代的早期階段,程序員就是這么做的)。幸運的是,人們很快意識到,他們可以為編寫程序而定義特殊的語言,并使用計算機將程序從高級編程語言轉換為機器代碼。早期的編程語言有Fortran、COBOL和BASIC。今天流行的語言有C++、C#、Java和JavaScript等。Python是另一種非常流行的編程語言:它是由荷蘭數學中心(Stichting Mathematisch Centrum)的Guido van Rossum于20世紀90年代初發明的。與流行的看法不同,Python并不是以蛇來命名,它是以英國喜劇團體Monty Python的名字命名的。他們的流行喜劇節目Monty Python’s Flying Circus于1969年至1974年在英國廣播公司播出。IDLE是Python的集成開發環境,實際上暗示了該團體的成員Eric Idle。

在高級編程語言中,每個語句都轉換為多個CPU指令。圖1-3展示了一個用Python編寫的函數,它由一個文檔字符串(Docstring,三引號中的一段注釋,幫助使用該函數)和一些語句組成。

圖1-3 用Python編寫的函數

用機器語言或匯編語言編寫的程序僅適用于具有兼容性CPU的計算機。換句話說,命令/語句限定于特定的CPU。用高級語言編寫的程序可以與任何CPU一起使用。例如,它可以在PC或Mac上運行。

? ? ?

有兩種方法,可以將高級編程語言編寫的程序轉換為機器代碼。第一種方法稱為“編譯”:一種稱為“編譯器”的特殊程序,檢查高級語言編寫的程序文本,生成適當的機器語言指令,并將它們保存在一個可執行文件中,該文件可以在計算機上運行。程序編譯后,運行該文件就不需要編譯器了。第二種方法稱為“解釋”:一種稱為“解釋器”的特殊程序,檢查程序的文本,生成適當的指令,并立即執行這些指令。解釋器不會創建可執行文件,每次運行程序都需要解釋器。

編譯就像外語教材的書面翻譯一樣,解釋就像在外國人說話的同時進行同聲翻譯。解釋器可以從文件中讀取程序,也可以允許你以交互方式逐行輸入程序語句。

一些現代語言(如Java)使用混合的方法。首先,它們將程序編譯成一種稱為“字節碼”的中間低級語言,它仍然獨立于特定的CPU,但更緊湊,更接近機器語言。然后它們在解釋字節碼時執行程序。Python也將“模塊(函數庫)”預編譯為字節碼。

? ? ?

程序的文本由相當嚴格的語法規則控制:你不能簡單地輸入隨心所欲的內容,并指望計算機理解它。

程序中的每個符號都必須位于正確的位置。

在英語或其他自然語言中,你可以拼錯一個單詞或省略一些標點符號,但仍然可以生成可讀的文本。這是因為自然語言具有“冗余”,信息以低于最佳效率的方式傳輸,但這導致即使它有某種亂碼,讀者仍可以正確地解釋消息(見圖1-4)。

圖1-4 Lyla Fletcher Groom的故事,5歲(由寫作研討會提供)

編程語言實際上沒有冗余,幾乎每個字符都是必不可少的。編程中很可能會犯錯誤,因此編程人員必須學會耐心并注重細節,在修復代碼的錯誤時堅持不懈。

? ? ?

我們現在準備使用Python。根據開源許可證,Python可免費獲得,即使是商業應用程序也是如此。Python許可證由Python Software Foundation管理。

在本書中,我們將使用Python 3,即Python的較新版本。

早期版本的Python稱為“Python 2”。Python 2和Python 3之間存在一些差異——它們不是百分之百兼容。在撰寫本書時,Python 3的最新版本是3.7.3。

關于如何下載適用于你的計算機和操作系統的Python安裝程序,請參閱其他相關入門教程。

? ? ?

在編譯語言時,你需要創建程序文本,并將它保存在一個文件中,稱為“源代碼”,然后讓源代碼文件通過編譯器運行,以得到可執行程序。在Python中,你可以從源文件中讀取程序,也可以在Python解釋器Shell中輸入單個語句,并立即查看結果。

使用GUI(圖形用戶界面)前端運行Python解釋器很方便。標準安裝的Python附帶的GUI稱為IDLE(見圖1-5)。

圖1-5 在Windows系統中,Python的GUI“Shell”,稱為IDLE

>>>是Python解釋器的“提示符”。提示符是來自程序的信號,表示它正在等待用戶輸入。用戶可以輸入語句,當用戶按<Enter>鍵時,解釋器會顯示結果。

例如,輸入:

>>> 2+3 <Enter>

(用戶輸入以粗體顯示)。Python會顯示:

5
>>>

看起來很不錯!這里發生了很多事情。解釋器讀取你輸入的文本行(語句),然后分析文本并發現該語句有兩個用+號分隔的數字。分析文本并提取它的組件的過程稱為“解析”。

一些小實驗會讓你相信空格并不重要(只要語句在提示后立即開始,沒有前導空格)。例如,你可以輸入2+3或2+3或2+3——結果相同。但是如果你輸入2+* 3,你就會得到:

>>> 2+*3
      ^
SyntaxError: invalid syntax
>>> 

現在嘗試:

>>> 2(3+4)

你預期會得到14,對嗎?沒有!你得到的是:

Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    2(3+4)
TypeError: 'int' object is not callable

顯然,Python解釋器“認為”你輸入的語句有問題。但是,Python(讓我們將解釋器簡稱為Python)不是報告語法錯誤,而是報告了別的內容,這似乎沒有什么幫助。TypeError指的是一個對象的“類型”(一個整數、一個函數等),而不是你在鍵盤上輸入的內容。顯然Python已經斷定你試圖用一個名為2的函數調用輸入值3+4,所以Python告訴你(以它自己神秘的方式),2不是一個函數。你可能會認為Python有時非常愚蠢。事實上,它既不聰明也不愚蠢——它只是一段代碼。

同時,你真正的意思是:

>>> 2*(3+4)

也許你認為乘法符號是可省略的,就像在數學中一樣。不是這樣。正如我們告訴過你:每個字符都很重要!

1.定義“冗余”。?

2.在Python解釋器中輸入2+?3。這是有效的語法嗎?解釋結果。現在對2++ 3做同樣的事情。

3.■嘗試2+++ 3。解釋結果。

4.嘗試2** 3和2 ** 4。Python的運算符**表示什么?

5.在Python中,單引號、雙引號或三引號中的文本片段代表“文字字符串”。嘗試"abc" + "def"和'abc' + 'def'和'''abc''' + '''def'''和"""abc""" + """def"""。解釋+運算符應用于字符串時的作用。?

6.*運算符可以應用于整數和字符串嗎?嘗試3 *'La'并解釋結果。

7.輸入9?8*2+6并解釋結果。輸入(5?1)*(1+2)**3并解釋結果。Python表達式中,“運算符的優先級”是什么(即首先應用哪些運算符)? ?

8.■在Python提示符處輸入17%3,同時嘗試15%4和15%5。%運算符計算什么?與+、 ?、*、/和**相比,運行一些測試以確定其等級(優先級)。 ?

主站蜘蛛池模板: 永兴县| 西华县| 谢通门县| 盐津县| 滨州市| 宁波市| 榕江县| 涡阳县| 洪洞县| 澄迈县| 读书| 乐山市| 临澧县| 抚州市| 柯坪县| 沙坪坝区| 平武县| 吴忠市| 黄冈市| 茂名市| 北京市| 江西省| 垫江县| 红河县| 大同市| 大渡口区| 武威市| 南投县| 临沧市| 岗巴县| 乐都县| 芷江| 炉霍县| 内江市| 株洲市| 莱阳市| 方正县| 方山县| 阿勒泰市| 汨罗市| 桦南县|