4. Numeric Types — int, float, long, complex
有四種不同的數字類型:普通整數,長整數,浮點數和(hé)複數。另外(wài),布爾也(yě)是普通整數的一個子類型。在C 中實現(xiàn)純整數(也(yě)稱爲整數)long,它使它們具有至少32位的精度(sys.maxint總是設置爲當前平台的最大(dà)純整數值,最小(xiǎo)值爲-sys.maxint - 1)。長整數具有無限精度。浮點數通常double在C中實現(xiàn); 有關運行程序的機器的浮點數的精度和(hé)内部表示的信息可在sys.float_info。複數有一個實部和(hé)虛部,每個部分都是一個浮點數。要從(cóng)複數z中提取這(zhè)些(xiē)零件,請(qǐng)使用(yòng)z.real和(hé)z.imag。(标準庫包含額外(wài)的數字類型,fractions用(yòng)于保存有理(lǐ)數據,并decimal保存具有用(yòng)戶可定義精度的浮點數。)
數字由數字文(wén)字或内置函數和(hé)運算(suàn)符的結果創建。未經修飾的整數文(wén)字(包括二進制,十六進制和(hé)八進制數字)會(huì)産生純整數,除非它們表示的值太大(dà)而不能(néng)表示爲普通整數,在這(zhè)種情況下(xià),它們會(huì)産生長整數。一個整數文(wén)字'L'或'l'後綴産量長整型('L'是首選,因爲1l看(kàn)起來(lái)太的十一!)。包含小(xiǎo)數點或指數符号的數字文(wén)字會(huì)生成浮點數字。追加'j'或'J'數字文(wén)字會(huì)産生一個虛數(一個具有零實數部分的複數),您可以将其添加到(dào)整數或浮點數以獲得具有實部和(hé)虛部的複數。
Python完全支持混合算(suàn)術:當二進制算(suàn)術運算(suàn)符具有不同數值類型的操作(zuò)數時(shí),具有“窄”類型的操作(zuò)數會(huì)擴展到(dào)另一個操作(zuò)數,其中純整數比窄整數窄于浮點比窄比複雜(zá)。混合類型的數字之間的比較使用(yòng)相同的規則。[2]的構造int(),long(),float(),和(hé)complex()可以用(yòng)于産生特定類型的号碼。
糾錯
所有内置的數字類型都支持以下(xià)操作(zuò)。有關運營商的優先事(shì)項,請(qǐng)參閱電力運營商和(hé)後續章節。
手術 | 結果 | 筆(bǐ)記 |
---|---|---|
x + y | x與y之和(hé) | |
x - y | x與y的差 | |
x * y | x與y的乘積 | |
x / y | x與y的商數 | (1) |
x // y | x與y的商的整數部分 | (4)(5) |
x%y | x / y的餘數部分 | (4) |
-X | x的負數 | |
+ X | x的正數 | |
ABS(x)的 | 絕對(duì)值 | (3) |
int(x)的 | x轉換爲整數 | (2) |
long(x)的 | x轉換爲長整數 | (2) |
float(x)的 | x轉換爲浮點 | (6) |
complex(RE,IM) | 與實數部分相關的複數,虛數部分im。默認爲零。 | |
c.conjugate() | 複數c的共轭。(實際身份) | |
divmod(x,y) | 返回tuple(x//y,x%y) | (3)(4) |
pow(x,y) | x到(dào)權力y | (3)(7) |
x ** y | x到(dào)權力y | (7) |
筆(bǐ)記:
對(duì)于(純或長)整數除法,結果是一個整數。結果總是向負無窮大(dà)舍入:1/2是0,(-1)/ 2是-1,1 /( - 2)是-1,(-1)/( - 2)是0.請(qǐng)注意,如果任一操作(zuò)數是長整型,則結果爲長整數,無論數值如何。
像使用(yòng)相關函數一樣,使用(yòng)int()或long()截斷爲零的浮點數轉換math.trunc()。使用(yòng)該功能(néng)math.floor()向下(xià)滾動并向math.ceil()上(shàng)滾動。
有關完整說明(míng),請(qǐng)參閱内置函數。
自(zì)從(cóng)版本2.3開(kāi)始棄用(yòng):樓層劃分運算(suàn)符,模運算(suàn)符和(hé)divmod()函數不再爲複數定義。相反,abs()如果适用(yòng),則使用(yòng)該函數将其轉換爲浮點數。
也(yě)被稱爲整數除法。結果值是一個整數,雖然結果的類型不一定是int。
對(duì)于非數字(NaN)和(hé)正或負無窮,float還接受帶有可選前綴“+”或“ - ”的字符串“nan”和(hé)“inf”。2.6版本中的新功能(néng)。
Python定義pow(0, 0)和(hé)0 ** 0将會(huì)1像編程語言一樣常見。
所有numbers.Real類型(int,long和(hé)float)還包括以下(xià)操作(zuò):
Operation | 結果 |
---|---|
math.trunc(x)的 | x截斷爲Integral |
round(x,n) | x四舍五入爲n位數,從(cóng)零開(kāi)始取整。如果省略n,則默認爲0。 |
math.floor(x)的 | 作(zuò)爲float <= x的最大(dà)整數 |
math.ceil(x)的 | 作(zuò)爲float> = x的最小(xiǎo)整數 |
4.1。整數類型的按位運算(suàn)
按位運算(suàn)隻對(duì)整數有意義。負數被視(shì)爲它們的2的補碼值(假定在操作(zuò)過程中沒有溢出發生的位數足夠大(dà))。
二進制按位運算(suàn)的優先級均低(dī)于數值運算(suàn)并高(gāo)于比較; 一元運算(suàn)~與其他(tā)一元運算(suàn)(+和(hé)-)具有相同的優先級。
此表列出按升序優先級排序的按位運算(suàn):
Operation | 結果 | 筆(bǐ)記 |
---|---|---|
x | 和(hé) | 按位或x和(hé)y | |
x ^ y | 按位排他(tā)或x和(hé)y | |
x&y | 按位和(hé)x和(hé)y | |
x << n | x左移n位 | (1)(2) |
x >> n | x右移n位 | (1)(3) |
〜X | x的位反轉 | |
注釋:
負轉移次數是非法的,并導緻a ValueError被提出。
左移n位相當于乘以pow(2, n)。如果結果超出純整數範圍,則返回一個長整數。
右移n位相當于除以pow(2, n)。
4.2。整數類型的其他(tā)方法
整數類型實現(xiàn)numbers.Integral 抽象基類。另外(wài),他(tā)們還提供了(le)另一種方法:
int.bit_length()long.bit_length()
返回表示二進制整數所需的位數,不包括符号和(hé)前導零:
>>> n = -37
>>> bin(n)
'-0b100101'
>>> n.bit_length()
6
複制
更确切地說,如果x不爲零,則x.bit_length()是唯一的正整數k這(zhè)樣2**(k-1) <= abs(x) < 2**k。等價地,當abs(x)小(xiǎo)到(dào)足以得到(dào)正确的舍入對(duì)數時(shí),則k = 1 + int(log(abs(x), 2))。如果x是零,則x.bit_length()返回0。
相當于:
def bit_length(self):
s = bin(self) # binary representation: bin(-37) --> '-0b100101'
s = s.lstrip('-0b') # remove leading zeros and minus sign
return len(s) # len('100101') --> 6
複制
2.7版本的新功能(néng)。
4.3。其他(tā)方法浮動
浮點類型實現(xiàn)numbers.Real 抽象基類。float還有以下(xià)附加方法。
float.as_integer_ratio()
返回一對(duì)整數,其比例與原始浮點數完全相等,并帶有一個正的分母。提高(gāo)OverflowError無窮大(dà)和(hé)ValueErrorNaNs。
2.6版本中的新功能(néng)。
float.is_integer()
返回True如果浮子實例是有限的與積分值,并False以其他(tā)方式:
>>> (-2.0).is_integer()
True
>>> (3.2).is_integer()
False
複制
2.6版本中的新功能(néng)。
兩種方法支持與十六進制字符串的轉換。由于Python的浮點數在内部存儲爲二進制數,因此将浮點數轉換爲十進制字符串或從(cóng)十進制字符串轉換浮點數通常會(huì)導緻一個小(xiǎo)的舍入誤差 相反,十六進制字符串允許精确表示和(hé)指定浮點數。這(zhè)在調試和(hé)數值工(gōng)作(zuò)時(shí)非常有用(yòng)。
float.hex()
将浮點數的表示形式返回爲十六進制字符串。對(duì)于有限的浮點數,這(zhè)種表示将總是包括前導0x和(hé)尾随p以及指數。
2.6版本中的新功能(néng)。
float.fromhex(s)
Class方法返回由十六進制字符串s表示的float 。字符串s可能(néng)有前導和(hé)尾随空(kōng)白(bái)。
2.6版本中的新功能(néng)。
請(qǐng)注意,這(zhè)float.hex()是一種實例方法,而它float.fromhex()是一種類方法。
十六進制字符串采用(yòng)以下(xià)形式:
[sign] ['0x'] integer ['.' fraction] ['p' exponent]
複制
其中可選sign可以是+或者-,integer并且fraction是十六進制數字的字符串,并且exponent是具有可選前導符号的十進制整數。大(dà)小(xiǎo)寫不重要,整數或小(xiǎo)數中至少有一個十六進制數字。此語法與C99标準的6.4.4.2節中指定的語法類似,也(yě)與Java 1.5之後的語法類似。特别是,輸出float.hex()可用(yòng)作(zuò)C或Java代碼中的十六進制浮點字面值,并且由C的%a格式字符或Java 産生的十六進制字符串Double.toHexString被接受float.fromhex()。
請(qǐng)注意,指數是用(yòng)十進制而不是十六進制編寫的,它給出了(le)乘以系數的2的幂。例如,十六進制字符串0x3.a7p10表示浮點數(3 + 10./16 + 7./16**2) * 2.0**10,或者3740.0:
>>> float.fromhex('0x3.a7p10')
3740.0
複制
将反向轉換應用(yòng)于3740.0給出代表相同數字的不同十六進制字符串:
>>> float.hex(3740.0)
'0x1.d380000000000p+11'
網站(zhàn)建設開(kāi)發|APP設計(jì)開(kāi)發|小(xiǎo)程序建設開(kāi)發