- Python程序設(shè)計(jì)
- 張雪萍主編
- 2455字
- 2019-06-19 15:48:27
2.2 數(shù)字類型聲明及基本運(yùn)算
Python語言提供了整型、浮點(diǎn)型、復(fù)數(shù)類型3種數(shù)字類型??梢酝ㄋ椎乩斫鉃?,整型是不帶小數(shù)點(diǎn)的整數(shù),而浮點(diǎn)型是帶小數(shù)點(diǎn)的小數(shù)。
2.2.1 整型
整型共有4種進(jìn)制表示:十進(jìn)制、二進(jìn)制、八進(jìn)制、十六進(jìn)制。
(1)十進(jìn)制整數(shù)。為默認(rèn)情況,由0~9的數(shù)字組成,如12、23。
(2)二進(jìn)制整數(shù)。由0和1組成。在Python中表示該數(shù)為二進(jìn)制時(shí)需要在數(shù)字前面加0b或0B,如0b0、0b10等。
(3)八進(jìn)制整數(shù)。由 0~7 的數(shù)字組成。在 Python 中表示該數(shù)為八進(jìn)制時(shí)需要在數(shù)字前面加 0o 或 0O(第 1 個(gè)是數(shù)字 0,第 2 個(gè)是字母 o,大寫或小寫均可。以下均相同),如0o1、0O11等。
(4)十六進(jìn)制整數(shù)。由0~9 的數(shù)字、a~f 的字母組成。在Python 中表示該數(shù)為十六進(jìn)制時(shí)需要在數(shù)字前面加0x或0X,如0xbb、0x3d等。
在Python中的整型數(shù)據(jù)的精度并不像其他編程語言一樣有一個(gè)明確的范圍限制,從理論上來講,它能存儲(chǔ)多大的整型數(shù)據(jù)是由硬件結(jié)構(gòu)來決定的,即由內(nèi)存大小或者 CPU的運(yùn)算范圍來決定整數(shù)的范圍。
因此,我們可以處理非常非常大的數(shù)字,這在其他的編程語言是無法想象的。這也是Python具有的一個(gè)特性。
2.2.2 浮點(diǎn)型
Python中的浮點(diǎn)型有2種表示形式:十進(jìn)制表示和科學(xué)計(jì)數(shù)法表示。十進(jìn)制表示法與數(shù)學(xué)中的實(shí)數(shù)表示法一致。如.1、1.1、0.1、1.0等都是合法的表示方法。1.1×10-2的科學(xué)計(jì)數(shù)法為1.1e-2或1.1E-2,e或E表示以10為底,后跟10的冪次方,其值為0.011。
2.2.3 復(fù)數(shù)類型
Python 中的復(fù)數(shù)類型表示數(shù)學(xué)中的復(fù)數(shù)。復(fù)數(shù)分為實(shí)部和虛部,其中,虛部通過 j或J來表示,如12.5+5j或12.5+5J。復(fù)數(shù)的實(shí)部和虛部都是浮點(diǎn)型。
對(duì)于復(fù)數(shù)z,可以用z.real和z.imag來分別獲得它的實(shí)數(shù)部分和虛數(shù)部分。例如:

2.2.4 數(shù)字運(yùn)算符
變量被賦值為數(shù)字類型后,可以進(jìn)行數(shù)學(xué)中的加、減、乘、除等各種運(yùn)算。
Python 提供大部分常用的算術(shù)運(yùn)算符,如加、減、乘、除等。表 2-1 給出了常用的算術(shù)運(yùn)算符。
表2-1 常用的算術(shù)運(yùn)算符

運(yùn)算符運(yùn)算的結(jié)果可能會(huì)改變數(shù)字類型,3 種數(shù)字類型之間存在一種逐漸擴(kuò)展的關(guān)系,具體如下:
整型→浮點(diǎn)型→復(fù)數(shù)類型
例如:

表2-1中所有運(yùn)算符都有與之對(duì)應(yīng)的增強(qiáng)賦值運(yùn)算符。如果用op表示表2-1的運(yùn)算符,則以下賦值操作等價(jià)。注意:運(yùn)算符op和賦值號(hào)之間沒有空格。
x op=y 等價(jià)于 x=x op y
使用增強(qiáng)賦值運(yùn)算符簡化了代碼的表達(dá)。

2.2.5 數(shù)字類型的常用函數(shù)及math庫
1.內(nèi)置的數(shù)字運(yùn)算函數(shù)
Python 提供了一些內(nèi)置函數(shù)來完成特定的操作,與數(shù)字類型相關(guān)的內(nèi)置數(shù)字運(yùn)算函數(shù)如表2-2所示。
表2-2 與數(shù)字類型相關(guān)的內(nèi)置數(shù)字運(yùn)算函數(shù)

商余函數(shù)divmod(x,y)返回的是參數(shù)x和y整除及進(jìn)行模運(yùn)算之后得到的值組合形成的元組類型數(shù)據(jù)。

2.math庫
下面來看一下浮點(diǎn)型數(shù)值的常見處理方式。

但如果我們想按照自己的方式來處理后面的小數(shù),即希望把后面的小數(shù)部分去掉,就算是 3.99 也直接去掉后面的小數(shù)部分,該怎么辦?這時(shí)可以使用一個(gè)模塊,叫作“math”,它里面有些函數(shù)可以幫我們完成想要的操作。但它不是全局函數(shù),需要加載相應(yīng)的模塊才能使用。導(dǎo)入math庫的3種方法如下。
1)import math
采用這種形式導(dǎo)入math庫后,對(duì)math庫中函數(shù)的調(diào)用方式為:math.<函數(shù)名>()。

2)import math as<別名>
math庫中函數(shù)的調(diào)用方式為:math.<別名>()。


3)from math import*
math庫中函數(shù)的調(diào)用方式為:<函數(shù)名>()。

在math庫中有很多寫好的函數(shù),或稱為方法,可以用它來執(zhí)行一些常見操作。
math庫包括數(shù)學(xué)常數(shù)(見表2-3)、數(shù)值函數(shù)(見表2-4)、冪對(duì)數(shù)函數(shù)(見表2-5)等,更多內(nèi)容請(qǐng)查閱相關(guān)文獻(xiàn)。
表2-3 math庫的數(shù)學(xué)常數(shù)

表2-4 math庫的數(shù)值函數(shù)

表2-5 math庫的冪對(duì)數(shù)函數(shù)

說明:Python 解釋器的內(nèi)部表示存在一個(gè)小數(shù)點(diǎn)后若干位的精度尾數(shù),當(dāng)進(jìn)行浮點(diǎn)數(shù)的運(yùn)算時(shí),這個(gè)精度尾數(shù)可能會(huì)影響輸出結(jié)果。因此,在進(jìn)行浮點(diǎn)數(shù)運(yùn)算及結(jié)果比較時(shí),建議采用math庫提供的函數(shù)而不是直接使用Python提供的運(yùn)算符。
floor()和trunc()方法的區(qū)別如下。
floor():總是往左邊取值,往小的方向取值。
trunc():總是往0方向取值。
與floor()方法取值相反的還有ceil(),其總是往上、往大的方向取值。
關(guān)于更多“math”模塊下的函數(shù),大家可以查詢一些相關(guān)的文檔,也可以通過 help命令進(jìn)行查閱。

2.2.6 數(shù)字類型轉(zhuǎn)換函數(shù)
Python 是一個(gè)強(qiáng)類型的語言,類型很重要。當(dāng)兩個(gè)不同類型的數(shù)據(jù)相加時(shí),需要轉(zhuǎn)換其中一個(gè)的類型,比如將帶引號(hào)的"3"變成一個(gè)真正的十進(jìn)制的整型數(shù)字,可以寫成:

轉(zhuǎn)換的工作由一個(gè)內(nèi)置函數(shù)“int”來完成,內(nèi)置函數(shù)是 Python 中已經(jīng)內(nèi)置好的,不需要額外地引入一些對(duì)象或模塊、包就可以使用的函數(shù)。Python 中內(nèi)置的數(shù)字轉(zhuǎn)換函數(shù)如表2-6所示。
表2-6 內(nèi)置的數(shù)字轉(zhuǎn)換函數(shù)


之前在聲明的時(shí)候通過加一個(gè)前綴來區(qū)分?jǐn)?shù)的進(jìn)制,現(xiàn)在轉(zhuǎn)換的時(shí)候可以再加一個(gè)參數(shù)來告訴系統(tǒng)前面這個(gè)字符串的值是基于二進(jìn)制的。依次類推,我們也可以轉(zhuǎn)換八進(jìn)制數(shù)、十六進(jìn)制數(shù)。


函數(shù)complex更詳細(xì)的用法請(qǐng)通過“help(complex)”命令進(jìn)行查閱。
2.2.7 浮點(diǎn)型精度處理
之前在計(jì)算浮點(diǎn)數(shù)時(shí),大多數(shù)情況下都能得到所期望的結(jié)果,但接下來我們看一個(gè)特殊情況。下面是一個(gè)有關(guān)浮點(diǎn)型數(shù)字計(jì)算的簡單表達(dá)式。

盡管結(jié)果非常接近 0,但它不是 0。這在精度要求非常高的金融或財(cái)務(wù)領(lǐng)域是不能容忍的,因?yàn)檫@些領(lǐng)域一點(diǎn)點(diǎn)誤差都不能有。
造成這個(gè)問題的根本原因在于,計(jì)算機(jī)內(nèi)部的二進(jìn)制存儲(chǔ)機(jī)制本身就沒辦法存儲(chǔ)某些特定的數(shù)值,但是在精度要求非常高的科學(xué)計(jì)算或金融財(cái)務(wù)領(lǐng)域,又不允許出現(xiàn)絲毫的誤差,那該如何解決這個(gè)問題呢?
Python 提供了一個(gè)專門的模塊“decimal”來解決有關(guān)浮點(diǎn)數(shù)的精度問題。通過decimal 模塊下的類 Decimal(第一個(gè)字母大寫),提供了一種精度更高的處理浮點(diǎn)型數(shù)字的機(jī)制。

注意:這里是將字符串'0.1'作為參數(shù)傳遞給 decimal 模塊的類 Decimal 來構(gòu)造函數(shù),實(shí)際使用時(shí)經(jīng)常會(huì)犯錯(cuò),漏掉了'0.1'兩邊的引號(hào)。
如果想要以字符串的形式顯示在頁面或控制臺(tái)上,可以通過將它賦值給一個(gè)變量,然后通過格式化的方式(后面將介紹格式化輸出)或通過“str”轉(zhuǎn)換一下再輸出。


“import decimal”導(dǎo)入模塊的方式,在使用 decimal 模塊的每個(gè)類時(shí)都要帶上前綴“decimal.”,這種方式有點(diǎn)煩瑣,可以用如下方式來導(dǎo)入,從而可以有一種簡化的表示方式:

其中,from decimal import decimal 表示從 Decimal 模塊導(dǎo)入 Decimal 類。其語法為:

注意:浮點(diǎn)型的存儲(chǔ)是有缺陷的,所以在精度要求更高的場合,可以使用 decimal模塊的類 Decimal 來實(shí)現(xiàn)。但使用 decimal 模塊的類 Decimal 傳參數(shù)時(shí)一定要以字符串的形式進(jìn)行傳參。否則,如果直接傳一個(gè)浮點(diǎn)型,它不會(huì)報(bào)錯(cuò),但得不到我們想要的結(jié)果。

- Mastering Ext JS(Second Edition)
- JavaScript修煉之道
- Java編程指南:基礎(chǔ)知識(shí)、類庫應(yīng)用及案例設(shè)計(jì)
- Learning AWS Lumberyard Game Development
- Python自然語言處理(微課版)
- 從0到1:Python數(shù)據(jù)分析
- 好好學(xué)Java:從零基礎(chǔ)到項(xiàng)目實(shí)戰(zhàn)
- Qt5 C++ GUI Programming Cookbook
- Kotlin極簡教程
- Unity 2017 Game AI Programming(Third Edition)
- Python 3快速入門與實(shí)戰(zhàn)
- DevOps 精要:業(yè)務(wù)視角
- Java 11 and 12:New Features
- Effective C++:改善程序與設(shè)計(jì)的55個(gè)具體做法(第三版)中文版(雙色)
- 數(shù)據(jù)結(jié)構(gòu)與算法詳解