2020年10月11日星期日

002 與小卡特一起學 Python 第 2 章 記住記憶體和變數

 申明本站飛宇網 https://feiyetopro.blogspot.com/自網路收集整理之書籍文章影音僅供預覽交流學習研究,其[書籍、文章、影音]情節內容, 評論屬其個人行為, 與本網站無關。版權歸原作者和出版社所有,請在下載 24 小時內刪除,不得用作商業用途;如果您喜歡其作品,請支持訂閱購買[正版]謝謝!


2 章 記住記憶體和變數

什麼是程式?嘿,等等,我想我們在第 1 章已經回答過這個問題!我們說過,程式就是下達給電腦的一系列指令。

對,確實是這樣。不過,幾乎所有真正有用或者有意思的程式都還有一些別的特徵:

·    都有輸入(input);

·    都會處理(process)輸入;

·    都會產生輸出(output)。

 

2.1 輸入、處理和輸出

你的第一個程式(代碼清單 1-1)並沒有任何輸入或處理。也正是因為這個原因,那個程式沒有太大意思。它的輸出就是程式在螢幕上列印的消息。

你的第二個程式猜數遊戲(代碼清單 1-2)就具備以下這三個基本要素。

·    輸入:玩家鍵入的數,也就是他猜的數。

·    處理:程式檢查玩家猜的數,並統計已經猜過幾次。

·    輸出:程式最後列印的消息。

下面再看一個例子,這個程式也具備所有這三個基本要素:在一個視頻遊戲中,輸入是來自操縱杆或遊戲控制器的信號,處理是程式確定你是否擊中外星人、避開火球、順利過關或者做其他活動,輸出是螢幕上顯示的圖形和揚聲器或耳機傳出的聲音。


輸入、處理和輸出。一定要把這些記住。

那好,這麼說電腦需要輸入。不過它會怎麼處理這些輸入呢?為了處理輸入,電腦必須記住它們,或者把它們保存在某個地方。電腦會把這些內容(包括輸入以及程式本身)保存在它的記憶體中。

到底怎麼回事?


你可能聽說過電腦記憶體,不過這到底是什麼意思呢?

我們說過,電腦只是一大堆開關。不錯,記憶體就像是放在同一個位置上的一組開關。一旦以某種方式設置了這些開關,它們就會一直保持那種狀態,直到你做出改變。也就是說,它們會記住你原先的設置……

哇,記憶體!

你可以寫記憶體(設置開關),或者讀記憶體(查看開關如何設置,不過不做任何改變)。

但是我們怎麼告訴 Python 要把一個東西放在記憶體中的某個位置呢?另外,放在那裡之後,又怎麼再把它找回來呢?

Python 中,如果希望程式記住某個東西,以便你以後使用,所要做的就是給這個東西起一個名字。Python 會在電腦的記憶體中為這個東西留出位置,可能是數位、文本、圖片或者音樂。下次想要引用這個東西時,只需要使用同一個名字。

下面還是在交互模式中使用 Python,對名字多做一些研究吧。

 

2.2 名字

再回到 Python Shell 窗口。(如果完成第 1 章中的例子後關閉了 IDLE,現在要再打開它。)在提示符後面鍵入:

>>> Teacher = "Mr. Morton"

>>> print Teacher

 

(記住,>>> Python 顯示的提示符。你只需要鍵入它後面的內容,然後按回車。)你會看到下面的結果:

Mr. Morton

>>> 

 

你剛才創建了一個由字母 "Mr. Morton" 組成的東西,並且給它起了一個名字 Teacher

這裡的等號(=)告訴 Python 要賦值(assign)或者……等於……”。這裡把字母序列 "Mr.Morton" 賦值給名字 Teacher


在電腦記憶體中的某個位置,字母序列 "Mr.Morton" 已經存在。你不需要準確地知道它們到底在哪裡。只需要告訴 Python 這個字母序列的名字是 Teacher,從現在開始就要通過這個名字來引用這個字母序列。名字就像標籤或者不乾膠便條,你可以用它來標識一些東西。


在一個東西兩邊加上引號時,Python 會按字面來處理它。它會把引號裡的內容原樣列印出來。如果沒有加引號,Python 就必須明確這個東西到底是什麼。這可能是數字(如 5)、運算式(比如 5 + 3)或者名字(如 Teacher)。由於我們創建了名字 Teacher,所以 Python 會列印這個名字裡的內容,這正是字母序列 "Mr. Morton"

這就像有人在說,請寫下你的地址,你肯定不會這樣寫(如下圖):


(不過,也許卡特會這麼幹,因為他總是喜歡調皮搗蛋……


你可能會這樣寫:


如果寫成你的地址,就是在按字面看這句話。除非加上引號,否則 Python 不會按字面來處理。下面來看另一個例子:

>>> print "53 + 28"

53 + 28

>>> print 53 + 28

81

 

有引號時,Python 會直接照你所說顯示輸出:53 + 28

沒有引號時,Python 53 + 28 處理為一個算術運算式,它會計算這個運算式。在這裡,這是一個兩數相加的運算式,所以 Python 會給出它們的和。

術語箱

算術運算式(arithmetic expression)是數位和符號的一個組合,Python 可以算出它的值。

計算(evaluate)就表示算出……的值

Python 要確定需要多少記憶體來存儲這些字母,以及要使用哪一部分記憶體。要獲取資訊(取回資訊),只需要再使用同樣的名字。我們使用 print 關鍵字並提供名字,這會在螢幕上顯示具體的內容(如數位元或文本)。

像程式師一樣思考

把一個值賦給一個名字時(如把值“Mr. Morton”賦給 Teacher),它會存儲在記憶體中,稱為變數(variable)。在大多數程式設計語言中,都把這稱為把值存儲(store)在變數中

不過 Python 與大多數其他電腦語言的做法稍有不同。它並不是把值存儲在變數中,而更像是把名字放在值上。

有些 Python 程式師說,Python 沒有變數,而是只有名字。不過其實它們的行為基本上是一樣的。這是一本關於程式設計的書(只不過剛好使用了 Python),而不是專門討論 Python 的。所以談到 Python 名時,我們可能會交替使用變數(variable)、名字(name)或變數名(variable name)等不同的術語。實際上,只要你理解變數有什麼表現以及在程式中如何使用變數,怎麼稱呼並不重要。

順便說一句,Guido van Rossum(也就是創建 Python 的那個人)在他的 Python 教程中曾經這樣講:“‘=’符號用來將一個值賦給一個變數。所以我猜他認為 Python 是有變數的!

 

一種簡潔的存儲方法

Python 中使用名字就像是乾洗店給衣服加標籤。你的衣服掛在晾衣架上,上面附著寫有你的名字的標籤,這些衣服都掛在一個巨大的旋轉吊架上。你回來取衣服時,並不需要知道它們存放在這個大型吊架的具體哪個位置。只需要提供你的名字,乾洗店的人就會把衣服交還給你。實際上,你的衣服可能並不在原先所放的位置。不過乾洗店的人會為你記錄衣服的位置。要取回你的衣服,只需要提供你的名字。

變數也一樣。你不需要準確地知道資訊存儲在記憶體中的哪個位置。只需要記住存儲變數時所用的名字,再使用這個名字就可以了。


除了字母,還可以為其他內容創建變數。可以給數值指定名字。你應該還記得前面的例子:

>>> 5 + 3

8

 

下面用變數來完成這個例子:

>>> First = 5

>>> Second = 3

>>> print First + Second

8

 

在這裡,我們創建了兩個名字 First  Second。數位 5 賦給 First,數字 3 賦給 Second。然後用 print 把這兩個數的和列印出來。下面是完成這個例子的另一種做法。你可以試試看:

>>> Third = First + Second

>>> Third

8

 


 
注意這裡的做法。在交互模式中,只需鍵入變數名就可以顯示這個變數的值,而不必使用 print。(不過程式中可不行。)

在這個例子中,並沒有在 print 指令中求和,而是先取 First 的值和 Second 的值,將二者相加,創建一個新的值,名為 ThirdThird  First  Second 的和。


同一個東西可以有多個名字,可以在交互模式中試試這個指令:

>>> MyTeacher = "Mrs. Goodyear"

>>> YourTeacher = MyTeacher

>>> MyTeacher

"Mrs. Goodyear"

>>> YourTeacher

"Mrs. Goodyear"

 


這就像在同一個東西上貼兩個標籤。一個標籤寫著 YourTeacher,另一個標籤寫著 MyTeacher,不過它們都貼在 "Mrs. Goodyear" 上。


卡特,這個問題問得好。答案是:不會。實際上,修改這個名字會創建一個新的值 "Mrs.Tysick"。標籤 MyTeacher 會從 "Mrs.Goodyear" 上撕掉,貼到 "Mrs. Tysick" 上。你仍然有兩個不同的名字(兩個標籤),不過,現在它們分別貼在兩個不同的東西上,而不再貼在同一個東西上了。

 


2.3 名字裡是什麼

可以給變數取你喜歡的任何名字(嚴格地說,應該是幾乎任何名字)。名字長短由你來定,裡面可以有字母和數位,還可以有底線(_)。

不過對於變數名還有幾條規則。最重要的一點是名字是區分大小寫的,即大寫和小寫是不同的。所以 teacher  TEACHER 是兩個完全不同的名字。同樣,first  First 也不相同。

另一條規則是變數名必須以字母或底線開頭。不能以數字開頭,所以 4fun 不能作為變數名。

還有一條規則,變數名中不能包含空格。

如果你想知道 Python 中有關變數名的所有規則,可以查看本書後面的附錄 A

從前的美好時光


在一些較早的程式設計語言中,變數名的長度只能是一個字,而且有些電腦只有大寫字母,這說明變數名只有 26 種選:A Z !如果程式中需要的變數超過 26 個,那就難辦了!

 


2.4 數位和字串

目前為止,我們已經為字母(文本)和數位創建了變數。不過,在前面的加法例子中,Python 怎麼知道我們指的是數字 5 3,而不是字元“5”“3”呢?就像前面這句話一樣,正是引號帶來了差別。

字元或字元序列(字母、數位或標點符號)稱為一個字串(string)。要告訴 Python 你在創建一個字串,就要在字元兩邊加上引號。至於使用單引號還是雙引號,Python 並不太挑剔。單引號和雙引號都是可以的:


不過,字串的開頭和結尾必須使用同種類型的引號(要麼都是雙引號,要麼都是單引號)。

如果鍵入一個數字而沒有加引號,Python 就會知道這表示數值,而不是字元。可以試試看二者的區別:

>>> first = 5

>>> second = 3

>>> first + second

8

>>> first =    '5'

>>> second = '3'

>>> first + second

'53'

 

沒有引號時,5 3 都處理為數字,所以我們會得到二者的和。有引號時,'5'  '3' 處理為字串,所以會得到兩個字元相加的結果,也就是 '53'。還可以把由字母構成的字串在一起,第 1 章中已經見過這樣的例子:

>>> print "cat" + "dog"

catdog

 

要注意,像這樣將兩個字串相加時,它們之間沒有空格。兩個字串會緊緊地拼接在一起。

注意!這個詞有意思!

拼接

談到字串時我們說把它們相加(剛才就這麼說過),不過這並不完全正確。把字元或字串放在一起構成更長的字串時,有一個特殊的稱呼。並不是相加(相加只適用於數字),而是稱為拼接(concatenation)。

我們會說拼接兩個字串。

長字串

如果希望得到一個跨多行的字串,必須使用一種特殊的字串,稱為三重引號字串(triple-quoted string),就像下面這樣:

long_string = """Sing a song of sixpence, a pocket full of rye,

Four and twenty blackbirds baked in a pie.

When the pie was opened the birds began to sing.

Wasn't that a dainty dish to set before the king?"""

 

這種字串以 3 個引號開頭和結尾。所用的引號可以是雙引號也可以是單引號,所以也可以寫成下面的形式:

long_string = '''Sing a song of sixpence, a pocket full of rye,

Four and twenty blackbirds baked in a pie.

When the pie was opened the birds began to sing.

Wasn't that a dainty dish to set before the king?'''

 

如果希望多行文本顯示在一起,而且你不希望每一行都使用一個單獨的字串, 在這種情況下,三重引號字串就非常有用。

 

2.5 它們有多可變

變數之所以叫做變數是有原因的,就是因為它們是……怎麼說呢……是可變的!這是指你可以改變賦給它們的值。在 Python 中,這就要創建一個與原先不同的新東西,並把舊標籤(名字)貼到這個新東西上。上一節中我們就採用這種方式改變了 MyTeacher。我們將標籤 MyTeacher  "Mrs. Goodyear" 上取下來,把它貼到一個新東西 "Mrs. Tysick" 上。這樣就為 MyTeacher 賦了一個新值。


下面再來試一個例子。還記得之前創建的變數 Teacher 嗎?嗯,如果你還沒有關閉 IDLE,這個變數就還在。可以檢查看看:

>>> Teacher

'Mr. Morton'

 

沒錯,確實還在。不過現在可以把它改成其他內容:

>>> Teacher = 'Mr. Smith'

>>> Teacher

'Mr. Smith'

 

我們創建了一個新東西 "Mr. Smith",並把它命名為 Teacher。我們的標籤從原來的值上取下來,貼到了這個新東西上。不過原來的 "Mr. Morton" 怎麼樣了呢?

應該記得,一個東西可以有多個名字(上面可以貼多個標籤)。如果 "Mr. Morton" 上還有另一個標籤,那麼它還在電腦的記憶體裡。不過,如果它上面再沒有任何標籤了,標籤被移走 Python 就會發現再沒有人需要它了,所以會把它從記憶體中刪除。


這樣一來,記憶體中就不會塞滿那些沒人用的東西。Python 會自動完成所有這些清理工作,根本不用你操心。

還有一點很重要,這裡並沒有真的把 "Mr. Morton" 改成 "Mr. Smith"。我們只是把標籤從一個東西移到另一個東西上(重新指派名字)。Python 中有些東西(如數位和字串)是不能改變的。你可以把它們的名字重新指派到其他東西上(就像我們剛才所做的一樣),但是並不能對原先的東西做任何改變。

Python 中還有一些東西是可以改變的。第 12 章介紹列表(list)時我們會更多地討論這方面的內容。


 2.6 全新的我

還可以創建一個等於自己的變數:

>>> Score = 7

>>> Score = Score

 

我敢打賭,你肯定在想:什麼嘛,這一點兒用都沒有!你的想法沒錯。這實際上就是在說我是我。不過,稍稍做點改變,你就能成為一個全新的你!試試看:


這裡發生了什麼?在第一行中,Score 標籤本來貼在值 7 上。我們創建了一個新東西:Score + 1,也就是 7 + 1。這個新東西是 8。然後把 Score 標籤從原來的東西(7)上取下來,貼到這個新東西(8)上。所以 Score  7 重新指派到 8

要讓變數等於某個東西,這個變數總會出現在等號(=)左邊。巧妙的是,變數也可以出現在等號右邊。這很有用,在很多程式中都會看到。最常見的用法是讓變數自增(increment),也就是讓它增加某個量(就像前面所做的),或者與之相反,也可以讓變數自減(decrement),讓它減少某個量。


·    開始時 Score = 7

·    讓它增加 1(得到 8),創建一個新東西。

·    把名字 Score 賦給這個新東西。

這樣一來,Score 就從 7 變成了 8

關於變數,有幾個重要的問題必須記住。

·    程式可以在任何時間對變數重新賦值(把標籤貼在新東西上)。這一點很重要,必須記住,因為程式設計中最常見的 bug 就是改變了不該改變的變數,或者儘管改變的變數無誤,但是時機不合適。

要避免這種情況,有效的方法是使用容易記的變數名。我們可能用過下面這 兩個變數名:

t = 'Mr. Morton'

 

x1796vc47blahblah = 'Mr. Morton'

 

不過這樣在程式中會很難記住。如果使用這些變數名,出錯的可能性會更大。應該儘量使用能夠說明用途的名字,可以告訴你變數要用來做什麼。

·    變數名區分大小寫。這說明大寫和小寫是不同的。所以 teacher  Teacher 是兩個完全不同的名字。

記住,如果想瞭解 Python 的所有變數命名規則,可以查看附錄 A

像程式師一樣思考

我們曾經說過,你可以為變數取任何名字(不過前提是要滿足命名規則),這一點不假。你可以把變數叫做 teacher 或者 Teacher,這兩個名字都是可以的。

專業的 Python 程式師給變數命名時幾乎總是以小寫字母開頭,其他電腦語言可能會採用不同風格。是否遵循 Python 風格由你來決定。因為我們使用的是 Python,所以這本書後面都會遵循這種風格。

你學到了什麼

這一章中,你學到了以下內容。

·    如何使用變數在電腦記憶體中記住或保存資訊。

·    變數也叫做名字變數名

·    變數可以是不同類型的東西,如數位和字串。

測試題

1. 如何告訴 Python 變數是字串(字元)而不是數位?

2. 一旦創建一個變數,能不能改變賦給這個變數的值?

3. 變數名 TEACHER  TEACHEr 相同嗎?

4. Python 來說,'Blah'  "Blah" 一樣嗎?

5. Python 來說,'4' 是不是等同於 4

6. 下麵哪個變數名不正確?為什麼?

 (a) Teacher2

 (b) 2Teacher

 (c) teacher_25

 (d) TeaCher

7. "10" 是數位還是字串?

動手試一試

1. 創建一個變數,並給它賦一個數值(任何數值都行)。然後使用 print 顯示這個變數。

2. 改變這個變數,可以用一個新值替換原來的值,或者將原來的值增加某個量。使用 print 顯示這個新值。

3. 創建另一個變數,並賦給它一個字串(某個文本)。然後使用 print 顯示這個變數。

4. 像上一章一樣,在交互模式中讓 Python 計算一周有多少分鐘。不過,這一次要使用變數。以 DaysPerWeek(每週天數)、HoursPerDay(每天小時數)和 MinutesPerHour(每小時分鐘數)為名分別創建變數(或者也可以用自己取的變數名),然後將它們相乘。

5. 人們總是說沒有足夠的時間做到盡善盡美。如果一天有 26 個小時,那麼一周會有多少分鐘呢?(提示:改變 HoursPerDay 變數。)

 

 

 

0 留言:

發佈留言