導讀:在本文中,你會學到如何處理數字、定義與使用變量和常量,以及編寫使用這些數據類型執行實際任務的簡單程序。
作者:凱·霍斯特曼(Cay Horstmann),蘭斯·尼塞斯(Rance Necaise)
如需轉載請聯系華章科技
當你的程序執行計算時,需要把值存儲下來以便后面使用。在Python程序中使用變量來存儲值。本文你會學到如何定義和使用變量。
為了演示變量的用法,我們會編寫一個解決下面問題的程序:在售的軟飲料一般分為罐裝和瓶裝。在商店里,一包6個12盎司的罐裝飲料與一個2升的瓶裝飲料售價一樣,你應該買哪個?(對于液態而言,12盎司約等于0.355升。)
▲哪一個包含更多的蘇打?6個12盎司的罐裝包,還是一個2升的瓶裝?
在我們的程序中,會定義變量來表示一包中罐的數量和每罐的體積,然后我們會計算一個6罐包的體積(以升為單位),并且輸出答案。
01 定義變量
在計算機程序中,變量是一個存儲位置,每個變量都有名字并且包含一個值。
變量類似于停車場的一個停車位。停車位擁有一個標識符(例如“J053”),并且可以容納一輛交通工具。變量擁有一個名字(例如cansPerPack),并且可以存儲一個值(例如6)。
▲類似于計算機程序中的變量,一個停車位擁有一個標識符和一個內容
▲賦值
使用賦值語句把一個值存入變量,例如:
cansPerPack = 6
賦值語句的左邊是一個變量,右邊是一個可計算得到某個值的表達式,表達式的值將會被存儲到該變量中。
第一次給變量賦值時,會創建變量并使用那個值進行初始化。定義之后,該變量就可以在另一個語句中使用了,例如:
print(cansPerPack)
會輸出cansPerPack變量中存儲的值。
如果一個已定義的變量被賦新值,新的值會替換掉該變量中已經存儲的值,例如:
cansPerPack = 8
會把變量cansPerPack中存儲的6改變為8。圖2-1演示了上面的賦值語句。
▲圖2-1 執行兩個賦值語句
符號=并不表示左右相等,而是表示右邊的值被放置到左邊變量的存儲空間中。
一定不要混淆賦值運算符和算術中表示相等的符號=。賦值是用來完成某個任務的指令——一般而言,就是把一個值存入一個變量。
例如,在Python中,下面的語句是合法的
cansPerPack = cansPerPack + 2
第2個語句表示查詢變量cansPerPack中的值,加上2,再把結果存入變量cansPerPack(見圖2-2)。這個語句的作用是把變量cansPerPack中的值增加2。如果執行該語句前變量cansPerPack中的值是8,那么會變成10。當然,數學表達式x = x + 2是沒有意義的,沒有值會和自身加2相等。
▲圖2-2 執行賦值語句cansPerPack = cansPerPack + 2
02 數字類型
計算機處理表示信息的數據,而這些數據可能是不同類型的。實際上,Python中的每個值都屬于一個特定的類型。一個值的數據類型決定了數據在計算機中如何表示以及能夠對該數據進行什么樣的操作。語言本身提供的數據類型被稱作基本數據類型。Python支持大量的數據類型:數字、字符串、文件、容器,等等。程序員也可以定義自己的自定義數據類型。
在Python中,有幾種不同類型的數字。整數是一個完全不包含小數部分的數字。例如,每一包中必須包含整數個易拉罐—你無法擁有小數個易拉罐。在Python中,這個類型叫作int。當需要小數部分時(例如數字0.355),我們使用浮點數,在Python中叫作float。
在Python程序中出現的6或0.355這樣的數值,被稱作數字常量。如果一個數字常量有小數點,則被稱作浮點數,否則被稱作整數。表2-1說明了如何在Python中寫整數和浮點數常量。
▲表2-1 Python中的數字常量
Python中的變量可以存儲任意類型的數值,數據類型與值相關聯,而不是與變量相關聯。例如,考慮使用整型數值初始化的變量:
taxRate = 5
同一個變量稍后可以擁有一個float類型的值:
taxRate = 5.5
它甚至可以包含一個字符串:
taxRate = “Non-taxable” # 不推薦這么用
然而,這并不是一個好主意。如果你使用這個變量并且該變量中包含一個意料之外的類型的值,你的程序會出錯。一旦你使用一個特定類型的值初始化了某個變量,你應該注意保持它的類型不變。
例如,因為稅率不一定是整數,使用浮點數初始化變量taxRate是個好主意,即使它恰好是個整數:
taxRate = 5.0 #稅率可以含有小數部分
這會幫你記住變量taxRate可能會有小數部分,即使初始值并沒有小數部分。
03 變量名
當定義變量時,你需要給它起一個名字來解釋其用途,在Python中起名時必須要遵循一些基本原則:
- 必須以字母或下劃線(_)開頭,并且其他的字符必須是字母、數字或下劃線。
- 不能使用?或%之類的符號,空白字符也不允許出現在名字之內。你可以使用大寫字母表示單詞邊界,就像cansPerPack。這種命名規則叫作駝峰規則,因為名字中間的大寫字母看上去很像駱駝的駝峰。
- 名字對大小寫敏感,也就是說,canVolume和canvolume是不同的名字。
- 不能使用if或class這樣的保留字作為名字,這些保留字在Python中有特殊的含義。
這些是Python語言的硬性規定,另外還有兩條應該遵守的規則可以提高你的品味和編程習慣:
- 最好使用描述性的名字,例如cansPerPack就比cpp這樣縮寫的名字好很多。
- 大多數Python程序員使用小寫字母開頭的變量名(例如cansPerPack)。與此相反,使用僅包含大寫字母的名字(例如CAN_VOLUME)表示常量。另外,大寫字母開頭的名字一般用來表示用戶自定義的類型(例如GraphicsWindow)。
下文給出了Python中合法和非法的變量名。
- canVolum1:變量名包含字母、數字和下劃線。
- x:在數學公式中可以使用x或y這樣短的變量名。這在Python中是合法的,但是并不常見,因為這會使得程序難以理解(見編程小提示2.1)。
- CanVolume:注意:變量名是大小寫敏感的。這個變量名與canVolume不同,并且違反了變量名應以小寫字母開頭的約定。
- 6pack:錯誤:變量名不能以數字開頭。
- can volume:錯誤:變量名中不能含有空格。
- class:錯誤:不能使用保留字作為變量名。
- 1tr/f1.oz:錯誤:不能使用.或/這樣的符號。
04 常量
常量是指指定了初始值后,其值不應該再改變。一些語言允許程序員顯式地標記常量,并且在你試圖修改常量的值時會產生語法錯誤。Python由程序員自己保證常量的值不被改變。所以,常量名全部大寫是一個慣例。
BOTTLE_VOLUME = 2.0
MAX_SIZE = 100
遵循這樣的約定,你可以為自己和他人提供信息,在整個程序中全部大寫的標識符是常量。
在程序中使用具名常量來解釋數值是一個好的編程風格。例如,比較語句
totalVolume = bottles * 2
和
totalVolume = bottles * BOTTLE_VOLUME
閱讀第一條語句的時候可能無法理解數字2的含義,而第二條語句使用具名常量使得計算非常清晰。
05 注釋
當程序越來越復雜時,你應該增加注釋,用來向人類閱讀者解釋代碼。例如,下面的注釋解釋了常量的值:
CAN_VOLUME = 0.355 # 12盎司易拉罐有多少升
這個注釋為人類閱讀者解釋了數字0.355的含義。解釋器根本不會執行注釋,它會忽略從#符號開始到行尾的任何東西。
提供注釋是一個好的習慣。這會幫助閱讀你的代碼的程序員理解你的意圖。并且,你會發現注釋對于回顧和檢驗自己的代碼也是非常有幫助的。
現在你已經了解了變量、常量、賦值語句和注釋的內容,我們就可以開始編寫解決本章開始問題的程序了。程序顯示一個6罐裝易拉罐包的容積以及一個6罐包和一個2升瓶裝的總容積。我們使用常量表示易拉罐和瓶子的容積,變量totalVolume被初始化為易拉罐的容積。使用賦值語句把瓶子的容積增加上去。正如程序輸出所顯示,6罐包裝包含2升以上的蘇打水。
##
# 這個程序計算一個6罐裝包蘇打水易拉罐的容積(以升為單位)以及1個6罐裝包和1個2升瓶裝的總容量。
#
# 1個12盎司的易拉罐和1個2升瓶有多少升
CAN_VOLUME = 0.355
BOTTLE_VOLUME = 2.0
# 每包的易拉罐數量
cansPerPack = 6
# 計算易拉罐的總容積
totalVolume = cansPerPack * CAN_VOLUME
print("A six-pack of 12-ounce cans contains", totalVolume, "liters.")
#計算易拉罐和2升瓶裝的總容積
totalVolume = totalVolume + BOTTLE_VOLUME
print("A six-pack and a two-liter bottle contain", totalVolume, "liters.")
程序運行結果
A six-pack of 12-ounce cans contains 2.13 liters.
A six-pack and a two-liter bottle contain 4.13 liters.
關于作者: 凱·霍斯特曼(Cay Horstmann) ,圣何塞州立大學計算機科學系教授,JAVA的倡導者,經常在開發人員會議上發表演講。他是《Java核心技術》的作者,同時也關注Python、Scala、C++等語言,為專業程序員和計算機科學專業學生編寫過數十本圖書。
蘭斯·尼塞斯(Rance Necaise) 蘭道爾夫-麥肯學院計算機科學系副教授,撰寫了《Data Structures and Algorithms Using Python》和《Python for Java Programmers》等技術書籍。
本文摘編自《Python程序設計(原書第2版)》,經出版方授權發布。