本節書摘來自華章計算機《python程式設計》一書中的第2章,第2.1節,作者:[美]戴維 i.施奈德(david i. schneider)著,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視
計算機所處理的大量資料中均含有數值。在程式設計術語中,數值稱為數字字面量(number literal)。本節将介紹對數值的各種操作以及數值顯示的方式。
2.1.1 兩種數值類型:整型和浮點型
一個沒有小數點的數字稱為整型(int,integer的簡寫),一個帶有小數點的數字稱為浮點型(float,floating-point的簡寫)。

2.1.2 算術運算符
五種基本的算術運算符是加、減、乘、除和幂運算。python中加、減、除的運算符分别使用标準的符号+、–、/來表示。但是,用于表示乘法和幂運算的運算符,與通常的數學表示略有不同。
除法運算的結果通常是浮點型,即使結果商是一個整數。在其他運算中,如果參與運算的兩個數有一個是浮點型,結果即為浮點型,否則結果為整型。
2.1.3 print函數
print函數用于在顯示器上顯示相應的數值。如果n是一個數字,那麼下列語句
将顯示數字n。由數字、算術運算符和括号可以組成用于計算的數值表達式。作用在表達式上的print函數将顯示表達式計算後的結果。單個print函數還可以顯示多個數值。如果m、 n、r、…是數值(或者數值表達式),那麼語句
将依次顯示數字(或者數值表達式的值),并用空格分隔。
print函數會觸發一個換行操作(newline operation),意味着下一個print函數的輸出将從新的一行開始。
例1 算術運算符
下面的程式分别使用了五種标準的算術運算符。[run]表示執行程式(通過按鍵〈f5〉或者單擊“run”菜單下的“run module”指令)。緊随[run]之後就是程式的輸出結果。當計算2 * (3 + 4)時,括号中的部分将首先進行計算(括号中的表達式總是優先進行計算)。
提示:所有例子中出現的程式代碼都可以從本書的合作站點上下載下傳。具體可參見前言中的介紹。
2.1.4 變量
在求解數學問題時,量值通常使用一個名字來代表。例如,求解如下算術問題:“如果一輛汽車以50英裡/小時的速度行駛,那麼14小時後它能夠行駛多遠?”要解決這個問題,可以采用下面熟悉的公式
距離=速度×行駛時間
例2展示了如何使用python程式來解決這個問題。
例2 行駛距離
下面的程式使用了速度和行駛時間來計算行駛距離。其中,被賦于數值的那些名稱就稱為變量。程式第一行的意思是建立(或聲明)了變量speed并指派為50。同樣,第二行和第三行分别建立了其他的變量并進行了相應的指派。
數值表達式中也可以使用變量。表達式的計算需要依次将每個變量替換為其值後再進行算術運算。一些使用變量的表達式如:(2 * distance) + 7、n + 1和(a + b) / 3。
一般而言,變量是一個名稱,對應着儲存在記憶體的一個資料。本節中的所有資料都是數值。下列的語句形式:
variablename = numericexpression
稱為指派語句。該語句首先計算等号右側表達式的值,然後将其結果賦于左邊的變量。當變量第一次出現在指派語句的左邊時,該變量即被建立。以後對該變量的指派語句隻是為這個變量賦予不同的值。事實上,每個變量均指向了一個存儲其數值的記憶體位址。在表達式使用變量之前,該變量必須先使用指派語句進行建立。
python語言規定,變量名必須以字母或下劃線開頭,并且隻能由字母、數字和下劃線組成(最短的變量名可以隻有一個字母)。有意義的變量名能夠幫助其他人(或者稍後的你自己)輕易地回想起變量當初所代表的含義。一些有意義的變量名如:totalsales、rateofchange和taxrate。作為約定,我們将變量名中除了首個單詞外,每個單詞的首字母大寫,其他都使用小寫字母。由于大寫字母就像變量名中的駝峰一樣,是以這種命名約定稱為駱駝命名法(camel casing)。
python是大小寫敏感的,也意味着python是區分大小寫字母的。是以,變量名amount和amount代表兩個不同的變量。
python中有33個具有特殊含義的單詞,稱為保留字(或者關鍵字)。保留字不可以作為變量名而使用。一些保留字如:return、for、while和def。附錄b列出了所有的33個保留字。(提示:idle編輯器自動地使用橙色高亮顯示保留字。)
2.1.5 abs、int與round函數
除了标準的算術運算之外,還有一些常用的運算用于處理數值類型的資料。例如,需要對數字進行四舍五入或者取其絕對值。這些操作可以通過内建函數來完成。與函數相關的有一個或多個數值稱為輸入,一個數值稱為輸出。函數可看做傳回輸出結果。下文中提到的三個函數均是數值輸入和輸出。
絕對值函數abs(x)就是|x|。該函數将負數中的負号去掉并保持其他部分不變。int函數将保持整數不變,并将浮點數通過丢棄小數部分轉換為整數。round(n, r) 函數的結果是四舍五入保留數值n的小數點後r位,參數r可以省略。在這種情況下,n将四舍五入為整數。部分例子如下:
括号中的部分可以是數字(如上所示)、數值變量,或者數值表達式。對于表達式的情況,需要首先計算表達式的值來作為函數的輸入。
例3 函數
下面的程式在表達式中分别使用了剛剛講過的三個函數。
提示:與變量名類似,函數名是大小寫敏感的。比如,round函數是不可以寫成round的。
2.1.6 增量指派
由于指派語句中指派操作開始之前右邊的表達式将首先進行計算,下列語句
是有意義的。它首先計算右側表達式的值(也就是,在變量var的值上加1),然後再将求和結果賦給變量var。效果等價于對變量var進行了加1。從記憶體位址的角度上看,該語句從var的記憶體位址中取出其值,并計算var + 1,最後将求和結果存在一個記憶體位址。由于這種計算非常普遍,是以python專門提供了一種特殊的運算符來執行這種運算。語句
可以用下列語句來替換
一般而言,如果n是一個數值,那麼語句
将var的值加上n的值。運算符+=可看做執行了一個增量指派。其他的增量指派運算符有–=、=、/=和*=。
例4 增量指派語句
下面的程式展示了不同的增量指派運算符。
2.1.7 其他兩種整型運算符
除了在本節開始為大家介紹的五種标準算術運算符之外,python中還可以使用整除運算符(//)和求餘運算符(%)。假設m和n是兩個正整數,當m除以n時,将得到一個整數的商和一個整數的餘數,整數的商記為m//n,整數的餘數記為m%n。例如,
本質上講,m // n 是兩數相除,并去掉結果中的小數部分。m % n是m除以n時的餘數。一些例子如下:
例5 轉換長度
下面的程式将41英寸轉換為3英尺5英寸。
2.1.8 括号與優先級
括号可以用來更加清晰地說明表達式的含義。當表達式中有括号時,算術運算符的執行順序按照以下的優先級進行:
括号中的部分優先計算(由内而外)。
幂運算。
乘法、除法(排列組合和整數)、求餘運算。
加法和減法。
多個同級運算符之間由左向右進行運算。例如,8 / 2 3等價于(8 / 2) 3。
好的程式設計習慣應該盡可能多地使用括号,這樣就不需要刻意記憶優先級的規則。例如,将2 3 + 4寫為(2 3) + 4,将4 + 2 3寫為4 + (2 3)。
2.1.9 三種類型的錯誤
文法和标點符号錯誤稱為文法錯誤。一些使用不當的語句及其錯誤如表2-1:
當代碼由解釋器分析(在程式開始運作之前)時,文法錯誤會高亮顯示,python會彈出類似于圖2-1的消息框。在單擊“ok”按鈕後,python會用一個閃爍的光标定位程式中出現錯誤的可能位置。
在程式正在運作時出現的錯誤稱為運作時錯誤或異常。一些使用不當的語句及其錯誤如表2-2所示。
表2-2中,前兩個錯誤是nameerror,第三個是zerodivisionerror。當python遇到異常時,python将終止目前程式的執行并顯示如圖2-2所示的消息。這個出錯消息的最後兩行定位到引發錯誤的語句并給出錯誤的類型。
第三種錯誤稱為邏輯錯誤。這樣的錯誤出現意味着程式沒有按照預想的方式執行。例如,語句
文法上沒有問題,卻得不到正确的結果。計算平均值的正确方法是:
是以,邏輯錯誤是最難發現與定位的錯誤。
2.1.10 記憶體中的數值對象
思考下面的兩行代碼:
圖2-3展示了這兩行代碼執行時記憶體的變化情況。當第一行代碼執行時,python配置設定了一塊記憶體儲存數字5。變量n可看做是引用(或指向)數值5的記憶體位址。當第二行代碼執行時,python又配置設定了一個新的記憶體位址儲存數值7,并将變量n重新指向新的記憶體位址。記憶體中的數字5可看做被丢棄了。最終,python通過垃圾回收程序将孤立的數值從記憶體中移除。
注釋
變量所使用的名稱有時也稱為辨別符。
數值表達式可以是量、變量、函數與運算符的任意組合,并且表達式的計算結果是一個數值。而一個單獨的量或者變量是表達式的一種特殊情況。
表達式或指派中所使用的數值字面量不可以包含逗号、美元号($)和百分号。此外,也不允許包含混合數字,如8 1/2。
當數字n是兩個相鄰整數的中間值(例如1.5、2.5、3.5和4.5)時,round函數将傳回與其最為接近的偶數。例如,round(2.5)的結果是2,而round(3.5)的結果是4。
使用科學計數法,數字可以寫成b·10r的形式。其中,b是一個從1到(但不包括)10用于表示量級的數字,r是一個整數。python經常使用科學計數法來表示非常大或非常小的數值,相應地,b·10r寫成be+r或be-r(字母e是指數的縮寫)。例如,當執行語句print(123.8 (10 * 25))時,結果顯示為1.238e+27。
本節介紹的函數都是内建函數,因為它們就是python語言中的一部分。在第4章,我們将為大家介紹如何建立自己的函數。這些函數通常也叫作使用者自定義函數。使用者自定義這種說法也有點不太準确。這些函數事實上應該叫作程式員自定義函數。
idle編輯器使用不同的顔色呈現語言中的不同元素。例如,一般文本使用黑色,而内建函數(如print、abs、int、round)則使用紫色。
“異常”是“異常(壞)事件”的簡稱。
實踐問題2.1
計算 3 + 4×5。
說明下面兩個指派語句的不同:
根據要執行的代碼填寫表格中變量對應的值。
寫一個語句表示數值變量var的值增加5%。
習題2.1
在習題1~12中,在不使用計算機的情況下,計算數值表達式的值,之後再使用python驗證你的答案。
在習題13~18中,确定哪個名稱是合法的變量名。
在習題19~24中,當a = 2、b = 3、c = 4時,計算數值表達式的值。
在習題25~30中,寫出計算并顯示相應值的代碼。
在習題31和32中,根據要執行的代碼填寫表格中變量對應的值。
在習題33~38中,根據給出的代碼寫出輸出結果。
在習題39~42中,找出其中的錯誤。
在習題43~48中,給出函數的傳回結果。
在習題49~54中,當a = 5、b = 3時,給出函數的傳回結果。
在習題55~60中,用增強指派運算符改寫語句。
在習題61~68中,編寫程式使得每行代碼實作每一個步驟。
計算利潤 下面的步驟可以計算公司的利潤。
(a) 建立變量revenue,并指派為98 456。
(b) 建立變量costs,并指派為45 000。
(c) 建立變量profit,并指派為變量revenue和costs的內插補點。
(d) 輸出變量profit的值。
股票購買 下面的步驟可以計算股票購買的數量。
(a) 建立變量costpershare,并指派為25.625。
(b) 建立變量numberofshares,并指派為400。
(c) 建立變量amount,并指派為costpershare和numberofshares的乘積。
(d) 輸出變量amount的值。
折扣價格 下面的步驟可以計算物品降價30%後的價格。
(a) 建立變量price,并指派為19.95。
(b) 建立變量discountpercent ,并指派為30。
(c) 建立變量markdown,并指派為price和倍數值(discountpercent除以100)的乘積。
(d) 從price中減去markdown。
(e) 輸出變量price的值(保留小數點後兩位)。
收支平衡 下面的步驟可以計算公司的收支平衡,即公司為了實作收支平衡必須生産和銷售的物品數量。
(a) 建立變量fixedcosts,并指派為5 000。
(b) 建立變量priceperunit,并指派為8。
(c) 建立變量costperunit,并指派為6。
(d) 建立變量breakevenpoint,并指派為fixedcosts除以(priceperunit和costperunit的內插補點)的商。
(e) 輸出變量breakevenpoint 的值。
儲蓄賬戶 下面的步驟可以計算出儲蓄賬戶中以5%年複合利息存入的100美元三年後的餘額。
(a) 建立變量balance,并指派為100。
(b) 以5%增加變量balance的值。
(c) 以5%增加變量balance的值。
(d) 以5%增加變量balance的值。
(e) 輸出balance的值(保留小數點後兩位)。
儲蓄賬戶 下面的步驟可以計算出儲蓄賬戶中每年初固定存入100美元以5%年複合利息計算三年後的餘額。
(b) 以5%增加變量balance的值,并再加上100。
(c) 以5%增加變量balance的值,并再加上100。
儲蓄賬戶 下面的步驟可以計算出儲蓄賬戶中以5%年複合利息存入的100美元十年後的餘額。
(b) 變量balance乘以1.05的10次幂。
(c) 輸出balance的值(保留小數點後兩位)。
股票利潤 下面的步驟可以計算出股票售出的利潤比例。
(a) 建立變量purchaseprice,并指派為10。
(b) 建立變量sellingprice,并指派為15。
(c) 建立變量percentprofit,并指派為sellingprice和purchaseprice內插補點乘以100再除以purchaseprice。
(d) 輸出percentprofit的值。
在習題69~78中,編寫相應的程式完成問題的求解。程式中應當為每個量值使用變量。
玉米産量 假設土地畝産玉米18噸,那麼30畝大的農場可以種植多少噸玉米?
抛物運動 假設一個球以初始速度每秒50英尺和初始高度5英尺向上筆直抛出。三秒後球所在高度是多少?提示:t秒後的高度可以使用表達式–16t2+v0t+h0計算得出。其中,v0是初始速度,h0是初始高度。
平均速度 如果一輛汽車2點從華盛頓出發,并在7點到達紐約,平均速度是多少呢?提示:華盛頓和紐約相距233英裡。
每公裡汽油消耗 一個駕駛員想計算他的每公裡油耗。在23 352英裡時(裡程表所示)灌滿油箱。在23 695英裡時油箱再次加入14加侖後灌滿。該車輛在兩次加油期間每公裡平均消耗多少加侖汽油?
水使用量 一項調查表明美國人平均每人每天要消耗掉1600加侖的水,其中也包括了工業的用水。那麼美國一年要消耗掉多少加侖的水呢?提示:美國現人口為3.15億。
匹薩 美國人平均每秒要吃掉350片匹薩。那麼一天會吃掉多少片匹薩呢?
飯店 美國大約有12%的飯店是匹薩店,而美國大約有7萬家匹薩店。估算美國飯店的總體數量。
人口增長 2000年美國人口大約為2.81億,預計到2050年将達到4.04億。估算美國在21世紀的前50年裡的人口增長率。結果四舍五入至最近的整數。
美國國家債務 假設美國國家債務總量為1.68×1013美元,而美國人口為3.1588×108。計算人均美國國家債務。結果四舍五入至最近的整數。
卡路裡 估算1立方英裡大小的巧克力冰激淩中卡路裡的數量。
提示:1英裡有5 280英尺,1立方英尺的巧克力冰激淩大約包含有48 600卡路裡。
實踐問題2.1的解答
60。乘法運算要先于加法運算。如果原本希望加法要先于乘法進行運算,表達式應該寫成(3 + 4) * 5。
第一個指派語句将變量var2的值賦給了變量var1,而第二個指派将變量var1的值賦給var2。
每執行一個指派語句,隻有一個變量(等号左邊的變量)的值會發生變化。
下面的四個語句都可以表示将var的值增加5%: