在本文中,您將了解Python中使用的不同數字,如何將一種數據類型轉換為另一種數據類型,以及Python中支持的數學操作。
Python支持整數,浮點數和復數。他們被定義為int,float和complex在Python數據類型中。
整數和浮點由存在或不存在小數點分隔。5是整數,而5.0是浮點數。
復數以形式書寫x + yj,其中x是實部,y是虛部。
我們可以使用type()函數來判斷變量或值屬于哪種數據類型,并且可以使用函數isinstance()檢查它是否屬于特定的類型。
a = 5 # 輸出: <class 'int'> print(type(a)) # 輸出: <class 'float'> print(type(5.0)) # 輸出: (8+3j) c = 5 + 3j print(c + 3) # 輸出: True print(isinstance(c, complex))
雖然整數可以是任意長度,但浮點數最多只能精確到15個小數位(第16位不準確)。
我們每天處理的數字是十進制(以10為底)的數字系統(tǒng)。 但是計算機程序員(通常為嵌入式程序員)需要使用二進制(基數2),十六進制(基數16)和八進制(基數8)的數字系統(tǒng)。
在Python中,我們可以通過在數字之前添加前綴來表示這些數字。下表列出了這些前綴。
編號系統(tǒng) | 前綴 |
---|---|
Binary | '0b'或'0B' |
Octal | '0o'或'0O' |
Hexadecimal | '0x'或'0X' |
這里有些示例
# 輸出: 107 print(0b1101011) # 輸出: 253 (251 + 2) print(0xFB + 0b10) # 輸出: 13 print(0o15)
運行該程序時,輸出為:
107 253 13
我們可以將一種數字轉換為另一種數字。這也稱為強制轉換。
如果操作數之一是浮點數,則加法,減法等操作會強制整數隱式(自動)浮點。
>>> 1 + 2.0 3.0
我們可以在上面看到1(整數)被強制轉換為1.0(float)進行加法運算,結果也是一個浮點數。
我們還可以使用諸如的內置函數int(),float()和complex()在類型之間進行顯式轉換。這些函數甚至可以從字符串轉換。
>>> int(2.3) 2 >>> int(-2.8) -2 >>> float(5) 5.0 >>> complex('3+5j') (3+5j)
從float轉換為整數時,數字將被截斷(接近零的整數)。
Python內置類float會執(zhí)行一些可能令我們驚訝的計算。我們都知道1.1和2.2的總和是3.3,但是Python似乎不同意。
>>> (1.1 + 2.2) == 3.3 False
到底是怎么回事?
事實證明,浮點數在計算機硬件中以二進制分數形式實現,因為計算機僅理解二進制(0和1)。由于這個原因,我們知道的大多數十進制小數不能準確地存儲在我們的計算機中。
讓我們舉個示例。我們不能將分數1/3表示為十進制數。這將給出0.33333333 ...無限長,我們只能對其進行近似。
原來的十進制小數0.1會導致無限長的二進制分數0.000110011001100110011 ...而我們的計算機只存儲了有限數量的二進制數。
這只會接近0.1,但永遠不會相等。因此,這是我們計算機硬件的局限性,而不是Python中的錯誤。
>>> 1.1 + 2.2 3.3000000000000003
為了克服這個問題,我們可以使用Python隨附的十進制模塊。浮點數的精度最高可以達到15個小數位,而十進制模塊具有用戶可設置的精度。
import decimal # 輸出: 0.1 print(0.1) # 輸出: Decimal('0.1000000000000000055511151231257827021181583404541015625') print(decimal.Decimal(0.1))
當我們要像在學校學習的那樣進行十進制計算時,將使用此模塊。
它也保留了意義。我們知道,25.50公斤比25.5公斤更準確,因為它有兩位小數,而不是一位。
from decimal import Decimal as D # 輸出: Decimal('3.3') print(D('1.1') + D('2.2')) # 輸出: Decimal('3.000') print(D('1.2') * D('2.50'))
注意上例中的尾隨零。
我們可能會問,為什么不每次都執(zhí)行Decimal而不是float?主要原因是效率。進行浮點運算必須比十進制運算更快。
在以下情況下,我們通常使用十進制。
當我們進行需要精確十進制表示的金融應用程序時。
當我們要指定所需的精度水平時。
當我們想實現小數位有效的概念時。
當我們希望像在學校一樣進行運算時
Python通過其fractions模塊提供涉及小數的運算。
小數具有分子和分母,它們都是整數。該模塊支持有理數算法。
我們可以通過多種方式創(chuàng)建Fraction對象。
import fractions # 輸出: 3/2 print(fractions.Fraction(1.5)) # 輸出: 5 print(fractions.Fraction(5)) # 輸出: 1/3 print(fractions.Fraction(1,3))
從float創(chuàng)建分數時,我們可能會得到一些異常的結果。這是由于上一節(jié)中討論的二進制浮點數表示不完善所致。
幸運的是,小數還允許我們使用字符串示例化。這是使用十進制數字時的首選選項。
import fractions # 用作 float # 輸出: 2476979795053773/2251799813685248 print(fractions.Fraction(1.1)) # 用作 string # 輸出: 11/10 print(fractions.Fraction('1.1'))
此數據類型支持所有基本操作。這里有幾個示例。
from fractions import Fraction as F # 輸出: 2/3 print(F(1,3) + F(1,3)) # 輸出: 6/5 print(1 / F(5,6)) # 輸出: False print(F(-3,10) > 0) # 輸出: True print(F(-3,10) < 0)
Python提供了類似的模塊,math和random可以執(zhí)行不同的數學運算,例如三角函數,對數,概率和統(tǒng)計等。
import math # 輸出: 3.141592653589793 print(math.pi) # 輸出: -1.0 print(math.cos(math.pi)) # 輸出: 22026.465794806718 print(math.exp(10)) # 輸出: 3.0 print(math.log10(1000)) # 輸出: 1.1752011936438014 print(math.sinh(1)) # 輸出: 720 print(math.factorial(6))
這是Python math模塊中可用的完整列表函數和屬性。
import random # 輸出: 16 print(random.randrange(10,20)) x = ['a', 'b', 'c', 'd', 'e'] # 得到隨機選項 print(random.choice(x)) # 打亂x列表順序 random.shuffle(x) # 打印輸出被打亂順序后的x print(x) # 打印隨機元素 print(random.random())
輸出結果(隨機結果):
19 c ['e', 'a', 'd', 'c', 'b'] 0.707947055817621
這是Python random模塊中可用的完整列表函數和屬性。