值必有類型
之前我們說的整形數(shù),浮點數(shù)其實是一種數(shù)據(jù)類型。每一個程序能認識的值都有類型。比如42就是一個整形數(shù),具體而言整形類型可以用int來表示;7.5是一個浮點數(shù),浮點數(shù)類型可以用float來表示。
在本書,我們學(xué)的數(shù)據(jù)類型并不多,包括下一章會學(xué)習(xí)到的string類型。到現(xiàn)在為止,為什么學(xué)習(xí)的都是值類型,值類型只是數(shù)據(jù)類型的一種,要識別一個數(shù)據(jù)的數(shù)據(jù)類型很簡單,只需要看你打出的值就是了。比如整形數(shù)木有小數(shù)點,而浮點數(shù)是一定有小數(shù)點,你就很容易理解42是整形數(shù),而42.0是浮點數(shù)了。
賦值語句與數(shù)據(jù)存儲方式
我知道你們一直很明白我說的東西,直到上一節(jié),關(guān)于值,值類型與數(shù)據(jù)類型的東西,這些基本的概念一定得明白,這一節(jié)希望能從計算機工作原理來和大家講述。
當(dāng)我們使用了估值表達式之后,程序會把他們推演到一個值,但是如何把他們存儲下來呢?通常計算機把這些東西存儲到變量里頭。
為了更好的理解變量這個東西,我們假象一個盒子出來,這個盒子放著要存儲的值。通常一個變量需要通過用=號連接的表達式來傳遞這個值,稱為賦值。比如我要把15這個值存到名叫“spam”的變量里頭去,我們只需要寫spam=15:
你可以假想變量就是那個盒子,命名為spam(貼在盒子上,你可以寫別的名字貼上去),里面裝著一個15的值,就好像一張寫著15的小紙片一樣。
在命令行上敲入這句代碼回車后,你看不到任何的響應(yīng),只有一個空行。除非出現(xiàn)了錯誤,顯示的是錯誤語句,你可以認為這些指令已經(jīng)成功執(zhí)行。出現(xiàn)了>>>后你可以敲下一個指令了。
一個帶有=的賦值語句做了什么事情呢?首先,創(chuàng)建了一個名叫spam的變量,然后存儲了值為15的數(shù)據(jù)。和估值表達式不同,語句是一種指令性的操作,不會去做估值計算的事情,僅僅是完成某項操作,所以這就是為什么命令行執(zhí)行完命令后沒有回應(yīng)的原因了。
看到這里,各位看官可能會迷惑,啥是表達式,啥是語句呢?請記住,如果Python的程序能推到出一個值的時候那就是表達式,如果不是,就是語句。(老外還是迷糊,不過有些東西一句話未必能講清楚,慢慢看)
一個賦值語句的格式是這樣的,一個變量名,后面跟著=,然后是一個表達式。這個表達式計算出來的值就會存到這個變量里頭。
要記住,變量存儲的永遠只是一個值,而不是表達式,再復(fù)雜的表達式最終都會推演出一個值,不然程序就掛了。比如,我們有這樣一個語句spam=10+5,表達式10+5會被計算為15,然后15就會被存儲到spam里頭。賦值語句中的變量如果是第一次出現(xiàn),那么程序會先創(chuàng)建這個變量,然后把值存進去。
這里有個有意思的東西,如果我們輸入spam+5的時候,命令行會返回20
看起來有點奇怪,不過你還記得我們之前已經(jīng)給spam這個變量賦值15了,表達式spam+15就會被估值計算為15+5,然后把結(jié)果20送回。在表達式里頭,那些變量的值會被提取出來,參與計算。(所以表達式不是僅僅是兩個值類型的數(shù)做運算)
變量覆蓋
(不要吐槽這個小標(biāo)題,因為你知道么當(dāng)年就關(guān)于這個詞應(yīng)該怎么表達,我們都吵了幾個星期,最后才定下來的)
當(dāng)一個變量已經(jīng)賦過值,但是需要改動這個變量的值的時候,這就是變量覆蓋了。請看例子:
第一次我們輸入spam+5的時候,結(jié)果返回是20,因為spam里頭我們存儲的是15.但是我們執(zhí)行了spam=3的時候,原來存在spam的值就變成了3,意味著15被3覆蓋了。所以,你再次執(zhí)行spam+5的時候,返回值就是8,這個時候spam+5就相當(dāng)于3+5,spam的舊值已經(jīng)不見了。
想知道現(xiàn)在某個變量的值是多少,只需要在命令行里頭敲入該變量就是了
你可能會感到迷惑,為什么一個變量也可以是一個表達式?原因就是這樣,變量存儲的東西可以被取出變成一個表達式,還記得以前一個整型值就是一個表達式的概念么?
延伸一下,我們不妨考慮一下,在賦值語句的時候,在表達式一端也用上我們的變量:
這句話spam=spam+5的意思其實就是說,spam的新值等于當(dāng)前值加上5。記住等號的左邊是要賦值的變量,等號的右邊的要計算的表達式。通過這個方式我們可以讓spam持續(xù)的增長:
使用多個變量
其實,在我們的程序里頭,通常都會有很多變量,你想要多少就有多少。比如,我們給以下兩個變量fizz和eggs賦值:
此時,fizz的值是10,而eggs的值是15.
讓我們嘗試給變量spam賦個新值,敲入spam=fizz+eggs,回車之后再敲入spam,看看命令后輸出什么:
也就是說spam的值已經(jīng)變成25了,是因為我們表達式fizz+eggs已經(jīng)告訴計算機把存在變量里頭的值拿出來相加了。
變量名
名字對我們很重要,但是對計算機來說,他們是不關(guān)心的。給變量命名反映的不僅是值的數(shù)據(jù)類型,更重要的是讓人更明白程序的運行機制。比起name這樣無意義的變量名來說,我們更應(yīng)該用abrahamLincoln或者monkey這樣的名字。雖然無論你怎么命名,只要程序?qū)憣α耍嬎銠C都會正確運行。
對于Python來說,變量名也是大小寫敏感的(對Python而言,所有出現(xiàn)字符的時候都是大小寫敏感的)。大小寫敏感意味著,拼寫相同變量,只要某個字符大小寫不一樣,那就會被認為是不同的變量。所以spam,SPAM,Spam和sPAM就是4個獨立的不相干的變量,存儲著各自的不同的值。
實話說,在一個程序里頭,拼寫相同但是大小寫不同的變量是不應(yīng)該出現(xiàn)的,那么做會是個災(zāi)難。比如你把你的姓存在變量NAME,把名字存在變量name中,你剛開始寫這個程序的時候,你會很清楚,但是過后你要重新閱讀的時候,你就會抓狂了。
Camel Case
(這個沒法翻譯,這就是個名字,翻譯成駱駝風(fēng)格,整個人都不好了)這個命名風(fēng)格要求如果變量里頭包含了多個英文單詞的時候,最好把這個單詞的首字母大寫。請看例子,比如我要命名一個這樣的變量whatIHadForBreakfast,來存儲我早餐吃了什么,是不是比whatihadforbreakfast好多了。這就是Camel Case,為什么叫駱駝風(fēng)格呢,你看那些夾雜著大寫的變量名是不是很像駝峰(哈哈哈,這就是西方的幽默,我也不知道哪里好笑)。這是一個在Python里頭很方便也很常用的東西,雖然你可以不這么做,但是做事情要有規(guī)矩,命名也就是個規(guī)矩。多個單詞組成的變量,從第二個單詞開始首字母大寫會大大增強代碼的可讀性(納尼,我的程序為什么要給人家讀,小樣的,不然你以后自己讀起來也痛苦)。
作業(yè)時間
1.下面的代碼輸出的是啥?
>>> spam = 20
>>> spam
2.下面的代碼輸出的又是啥?
>>> spam = 20
>>> spam = 30
>>> spam
3.下面的代碼輸出的又是啥?
>>> spam? 20
>>> spam = spam + 20
>>> spam
4.下面的代碼輸出的又是啥?
>>> spam = 20
>>> spam + 20
40
>>> spam
5.下面的代碼輸出的又是啥?
>>> spam = 20
>>> SPAM = 30
>>> spam
6.下面的代碼輸出的又是啥?
>>> spam =
7.下面的代碼輸出的又是啥?
>>> monkeyplumber
8.下面的代碼那些是表達式,那些是語句?
>>> 2 + 2
4
>>> spam = 42
9.下面的代碼那些是表達式還是語句?
>>> 5
5
答案:1.20;2.30;3.40;4.20;5.20;6.程序會出錯,因為變量賦值語句缺失值;
7.程序出錯,因為變量沒有定義;8.2+2是表達式,spam=42是語句;9.表達式
為何破解密碼的內(nèi)容還未到?
很快就到了,我們不會學(xué)太多的預(yù)備知識,我們還有一個章節(jié)編程的內(nèi)容需要學(xué)習(xí).
本章節(jié)你學(xué)到了Python語言的基本的編程知識,以及如何在命令行里頭執(zhí)行代碼.Python語言需要你告訴計算機應(yīng)該怎么去做,計算機沒有常識不會明白你的言語,只能通過一些簡單的指令去工作.你已經(jīng)學(xué)習(xí)了估值表達式,這個東東就是值和操作符號(正如+和-)的集合.同時你知道了你如何能把某個值存到變量里頭,以便下次使用.
命令行是學(xué)習(xí)Python一個很有用的工具,因為每次你敲了語句都可以看到執(zhí)行的結(jié)果.讓我們到下一個章節(jié),掌握了更多的基礎(chǔ)知識,你就可以完成你的第一個程序了.