本節書摘來自華章計算機《從問題到程式:用python學程式設計和計算》一書中的第2章,第2.5節,作者:裘宗燕 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
前面用表達式做的計算都是各自獨立的,實際上是把python用作一個簡單電腦。在提示符下輸入一個合法的表達式,解釋器處理該表達式,得到一個結果。不同表達式的計算互相無關。顯然,這種方式很有局限性,隻能完成最簡單的計算工作。複雜的計算可能需要經過許多步驟,每步做一點計算工作并記錄得到的結果,再基于已得到的結果一步步繼續工作下去。要實作這種計算方式,就要有記錄計算結果的方法。
2.5.1 變量、名字和值
python中記錄計算結果的機制稱為變量。一個變量有一個名字,在程式裡可以用變量記錄計算的結果,而後就可以通過這些變量使用記錄的資訊。
辨別符和關鍵字
變量需要有名字,python中的名字用辨別符表示。辨別符是語言中的一類單詞,python辨別符是滿足形式規定的連續字元序列。作為名字(如變量名)時,人們常用的辨別符拼寫形式是:第一個字元用一個小寫或大寫英文字母(a~z,a~z),或者用下劃線字元;後續字元可以是英文字母、下劃線或數字。下面是一些合法辨別符:

https://yqfile.alicdn.com/f71ab10177abb7a79268814b9358d0d2e789b581.png" >
python辨別符區分大小寫,這意味着ok、ok、ok、ok是四個不同辨別符。寫程式時必須注意,拼寫和大小寫應一緻,否則就是不同辨別符了。實際上,python允許在辨別符裡包含非英文的國際語言字母,但為了拼寫和識别友善,人們通常隻在這裡用英文字母。
python規定了一組稱為關鍵字的特殊辨別符,其中每一個都有特殊的語言意義,不能作為名字使用(不能作為變量名)。解釋器看到這些關鍵字,就認定了它們的特殊意義。前面描述程式包導入時使用的from和import都是關鍵字。
python語言的關鍵字一共有33個,如下所示:
雖然python的關鍵字很多,但是沒有關系,也不需要把它們背下來。随着讨論的深入,讀者将一個個地接觸并熟悉它們。
注意,除了false、true和none三個關鍵字之外,其他關鍵字都是完全由小寫英文字母構成的。這三個關鍵字是字面量(特殊的表達式)。
變量和指派
除關鍵字外的辨別符都可以在python程式裡作為合法的名字。在前面讨論中,我們已經看到過名字的許多使用,包括類型名(如int、float、str等)、函數名(如type、len、sin等)、程式包名(如math、cmath)、數學常量名(e和pi)。請注意,這些類型名、函數名、程式包名都不是關鍵字,而是普通的辨別符。
python變量實際上是名字的一類使用方式:用于記錄表達式求出的值。用一個變量記錄一個表達式值的操作通過指派語句描述,其最基本的形式是:
變量 = 表達式
這裡給出的是指派語言的文法形式,其中的變量應該是一個符合規定的名字,随後是一個表示指派的等号(也稱為指派符),然後是一個表達式。指派語句的作用(即語義,或說執行時的效果)是先求出表達式的值,然後用變量記錄這個值。這個操作亦被稱為指派,人們也常說是把表達式的值賦給了變量。
如前所述,變量的作用就是儲存計算的結果。指派後的變量可以用在表達式裡,解釋器在求值表達式時遇到變量,就會取出其儲存的值參加計算,例如:
前兩個指派語句分别給變量area和volume指派,最後的表達式顯示出volume的值。這裡的連續三個指令計算出底半徑為7.26(cm),高為13.49(cm)的圓柱體的體積,并将其顯示出來。由于底面積和體積記錄在變量裡,這些值還可以在随後的計算中繼續使用。例如,假設這是一個鉛質圓柱體,下面語句計算其重量和對底面的壓強:
這段計算假定已經導入了數學包math,其中用到math裡定義的pi。不難想象,其實pi也就是數學包裡定義的一個變量,被賦予對應于圓周率的浮點數值。
在python程式裡,可以根據需要任意引進新變量。一旦給某個變量指派,這個變量就有了定義。變量也是一種基本表達式,對有定義的變量求值将得到它的值。對沒有定義的變量求值,解釋器将報告一個錯誤。例如:
這裡想計算24cm2面積上的壓力,由于不小心把字母p寫成大寫,解釋器找不到名字為pressure的變量(沒定義),是以報錯。
另一方面,如果一個變量已經有值(賦過值),完全可以再次給它指派。再次指派後這個變量的值就改變了,用在表達式裡将得到新賦的值。這一情況說明,在一個變量的存在期間,其值可能不斷變化。取值時得到的總是此前最後一次賦給這個變量的值。由此可見,程式裡的一個變量真是一個“可能變化着的量”。
變量的命名
用變量記錄計算中得到的結果,相當于給有關結果取了一個名字。如果名字取得好,可以幫助人了解計算中的情況,提示這個結果表示什麼。就像在自然科學和技術領域,人們經常需要定義一些概念,如面積、體積、加速度等,其實它們也可能是從其他路徑成本求出的結果。取名就是定義概念,是一種最基本的抽象技術,有助于人把握自然中的現象或者過程。程式設計中情況類似,适當的變量名有助于人把握計算的描述和過程。
雖然變量的名字可以随意取,但人們的經驗說明,對于開發複雜的程式,好的變量名很有意義(後面将會見到其他對象,也有類似的命名問題)。采用簡單的a1、x2、b1之類作為變量名是不好的做法,因為它們字面上不攜帶任何資訊。而area、volume等就好得多,其英文詞義有助于人思考和了解程式,正确安排計算的過程。
python并不強制性地要求如何為變量取名,但有些建議:首先,應該采用有意義的名字(除非對本身沒意義的輔助變量,後面會看到)。有合适的單詞最好,也可以采用詞組,用下劃線連接配接不同單詞,如cylinder_volume、start_point等。此外,python建議變量名中不包含大寫字母,隻用小寫字母、數字和下劃線。
以下劃線開頭的名字不要随便用,隻建議在一些特殊情況下使用它們。此外,以兩個下劃線開頭和結尾的名字保留給python系統,程式設計者不應自己創造這種名字。
本書中的例子将盡可能遵循這些規則。
2.5.2 簡單順序計算
通過指派把計算得到的值儲存到變量,而後通過變量(的名字)使用,使人可以寫出一串指派語句,一點點把解決問題需要的中間結果計算出來,最後算出所需的最終結果。加上python的内置函數和數學函數包,通過這些功能已經可以解決許多問題了。一段計算中可以使用的變量個數沒有限制,可以根據需要随時定義。這些機制組合起來,其威力已經大大超過常見的科學電腦(常見的電腦隻有最簡單的存儲機制)。
引入變量的一個作用是避免重複計算。以前面2.2.3節最後的已知三角形的三邊長度,求三角形的面積為例,現在不需要重複描述和計算半周長了:
這段描述與數學公式有更好的對應,半周長也隻需計算一次,更合理。減少重複計算,把需要多次使用的中間結果記錄下來,是變量的一種重要用途。
有了指派語句,前面的語句可能影響後面語句的效果,是以需要考慮如何組織起一段不斷進展的計算。如果需要做某種複雜計算,就要先規劃好得到最終結果的過程,将其分解為一條條指令,通過多次與計算機互動的方式完成計算。這裡的規劃就是程式設計,把複雜的計算過程分解為一條條python解釋器可以直接執行的語句。通過與解釋器互動,反複要求其執行所提供的指令,實作的是一種簡單的順序計算。
請注意前面提到的一種情況:變量可以重新指派,例如:
這是一段完全合法的計算,其中n = n + 1要求給變量n賦一個新值,這個值是基于變量n當時的值計算出來的。
不難看到,上面這種計算有一個很大的缺點:計算過程的進展依賴于人的活動,因為解釋器需要一次次等待人的指令,人的輸入速度限制了計算機能力的發揮。要發揮計算機的威力,就需要利用其自動執行的能力,把一系列指令做成一個程式,然後要求python解釋器自動地執行程式裡的指令。這樣寫出的python程式也稱為腳本。實際上,相應的腳本執行方式是解釋器執行python程式的基本方式。