破解密碼那些事兒(chapter 3,初識Python,下)

值必有類型

之前我們說的整形數浮點數其實是一種數據類型。每一個程序能認識的值都有類型。比如42就是一個整形數,具體而言整形類型可以用int來表示;7.5是一個浮點數,浮點數類型可以用float來表示。

在本書,我們學的數據類型并不多,包括下一章會學習到的string類型。到現在為止,為什么學習的都是值類型,值類型只是數據類型的一種,要識別一個數據的數據類型很簡單,只需要看你打出的值就是了。比如整形數木有小數點,而浮點數是一定有小數點,你就很容易理解42是整形數,而42.0是浮點數了。

賦值語句與數據存儲方式

我知道你們一直很明白我說的東西,直到上一節,關于值,值類型與數據類型的東西,這些基本的概念一定得明白,這一節希望能從計算機工作原理來和大家講述。

當我們使用了估值表達式之后,程序會把他們推演到一個值,但是如何把他們存儲下來呢?通常計算機把這些東西存儲到變量里頭。

為了更好的理解變量這個東西,我們假象一個盒子出來,這個盒子放著要存儲的值。通常一個變量需要通過用=號連接的表達式來傳遞這個值,稱為賦值。比如我要把15這個值存到名叫“spam”的變量里頭去,我們只需要寫spam=15:

你可以假想變量就是那個盒子,命名為spam(貼在盒子上,你可以寫別的名字貼上去),里面裝著一個15的值,就好像一張寫著15的小紙片一樣。

在命令行上敲入這句代碼回車后,你看不到任何的響應,只有一個空行。除非出現了錯誤,顯示的是錯誤語句,你可以認為這些指令已經成功執行。出現了>>>后你可以敲下一個指令了。

一個帶有=的賦值語句做了什么事情呢?首先,創建了一個名叫spam的變量,然后存儲了值為15的數據。和估值表達式不同,語句是一種指令性的操作,不會去做估值計算的事情,僅僅是完成某項操作,所以這就是為什么命令行執行完命令后沒有回應的原因了。

看到這里,各位看官可能會迷惑,啥是表達式,啥是語句呢?請記住,如果Python的程序能推到出一個值的時候那就是表達式,如果不是,就是語句。(老外還是迷糊,不過有些東西一句話未必能講清楚,慢慢看)

一個賦值語句的格式是這樣的,一個變量名,后面跟著=,然后是一個表達式。這個表達式計算出來的值就會存到這個變量里頭。

要記住,變量存儲的永遠只是一個值,而不是表達式,再復雜的表達式最終都會推演出一個值,不然程序就掛了。比如,我們有這樣一個語句spam=10+5,表達式10+5會被計算為15,然后15就會被存儲到spam里頭。賦值語句中的變量如果是第一次出現,那么程序會先創建這個變量,然后把值存進去。

這里有個有意思的東西,如果我們輸入spam+5的時候,命令行會返回20

看起來有點奇怪,不過你還記得我們之前已經給spam這個變量賦值15了,表達式spam+15就會被估值計算為15+5,然后把結果20送回。在表達式里頭,那些變量的值會被提取出來,參與計算。(所以表達式不是僅僅是兩個值類型的數做運算)

變量覆蓋

(不要吐槽這個小標題,因為你知道么當年就關于這個詞應該怎么表達,我們都吵了幾個星期,最后才定下來的)

當一個變量已經賦過值,但是需要改動這個變量的值的時候,這就是變量覆蓋了。請看例子:

第一次我們輸入spam+5的時候,結果返回是20,因為spam里頭我們存儲的是15.但是我們執行了spam=3的時候,原來存在spam的值就變成了3,意味著15被3覆蓋了。所以,你再次執行spam+5的時候,返回值就是8,這個時候spam+5就相當于3+5,spam的舊值已經不見了。

想知道現在某個變量的值是多少,只需要在命令行里頭敲入該變量就是了

你可能會感到迷惑,為什么一個變量也可以是一個表達式?原因就是這樣,變量存儲的東西可以被取出變成一個表達式,還記得以前一個整型值就是一個表達式的概念么?

延伸一下,我們不妨考慮一下,在賦值語句的時候,在表達式一端也用上我們的變量:

這句話spam=spam+5的意思其實就是說,spam的新值等于當前值加上5。記住等號的左邊是要賦值的變量,等號的右邊的要計算的表達式。通過這個方式我們可以讓spam持續的增長:

使用多個變量

其實,在我們的程序里頭,通常都會有很多變量,你想要多少就有多少。比如,我們給以下兩個變量fizz和eggs賦值:

此時,fizz的值是10,而eggs的值是15.


讓我們嘗試給變量spam賦個新值,敲入spam=fizz+eggs,回車之后再敲入spam,看看命令后輸出什么:

也就是說spam的值已經變成25了,是因為我們表達式fizz+eggs已經告訴計算機把存在變量里頭的值拿出來相加了。

變量名

名字對我們很重要,但是對計算機來說,他們是不關心的。給變量命名反映的不僅是值的數據類型,更重要的是讓人更明白程序的運行機制。比起name這樣無意義的變量名來說,我們更應該用abrahamLincoln或者monkey這樣的名字。雖然無論你怎么命名,只要程序寫對了,計算機都會正確運行。

對于Python來說,變量名也是大小寫敏感的(對Python而言,所有出現字符的時候都是大小寫敏感的)。大小寫敏感意味著,拼寫相同變量,只要某個字符大小寫不一樣,那就會被認為是不同的變量。所以spam,SPAM,Spam和sPAM就是4個獨立的不相干的變量,存儲著各自的不同的值。

實話說,在一個程序里頭,拼寫相同但是大小寫不同的變量是不應該出現的,那么做會是個災難。比如你把你的姓存在變量NAME,把名字存在變量name中,你剛開始寫這個程序的時候,你會很清楚,但是過后你要重新閱讀的時候,你就會抓狂了。

Camel Case

(這個沒法翻譯,這就是個名字,翻譯成駱駝風格,整個人都不好了)這個命名風格要求如果變量里頭包含了多個英文單詞的時候,最好把這個單詞的首字母大寫。請看例子,比如我要命名一個這樣的變量whatIHadForBreakfast,來存儲我早餐吃了什么,是不是比whatihadforbreakfast好多了。這就是Camel Case,為什么叫駱駝風格呢,你看那些夾雜著大寫的變量名是不是很像駝峰(哈哈哈,這就是西方的幽默,我也不知道哪里好笑)。這是一個在Python里頭很方便也很常用的東西,雖然你可以不這么做,但是做事情要有規矩,命名也就是個規矩。多個單詞組成的變量,從第二個單詞開始首字母大寫會大大增強代碼的可讀性(納尼,我的程序為什么要給人家讀,小樣的,不然你以后自己讀起來也痛苦)。

作業時間

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.表達式

為何破解密碼的內容還未到?

很快就到了,我們不會學太多的預備知識,我們還有一個章節編程的內容需要學習.

本章節你學到了Python語言的基本的編程知識,以及如何在命令行里頭執行代碼.Python語言需要你告訴計算機應該怎么去做,計算機沒有常識不會明白你的言語,只能通過一些簡單的指令去工作.你已經學習了估值表達式,這個東東就是值和操作符號(正如+和-)的集合.同時你知道了你如何能把某個值存到變量里頭,以便下次使用.

命令行是學習Python一個很有用的工具,因為每次你敲了語句都可以看到執行的結果.讓我們到下一個章節,掌握了更多的基礎知識,你就可以完成你的第一個程序了.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容