1. 程式人生 > >Python 基本資料型別(一): 數值型別

Python 基本資料型別(一): 數值型別

content

  • 整數型int
  • 布林型bool
  • 浮點型float
  • 複數型complex
  • 以及上述型別的轉化

一、數值型別

1. 整數型int
(1)整數的定義
 # 數學上定義的整數 1  2   -50
 # 變數名 = 整數數值
 a = 10
 print(type(a))
 # int
(2)取值範圍
"""
python底層是c語言 int long
python 2.2版本之後,就取消long,直接將整型歸結int 
"""
(3)四種進位制
"""
 N進位制,逢N進1
 1. 二進位制(使用 0b或者0B做字首)
 2. 八進位制(使用0o或者0O做字首)
 3. 十進位制
 4. 十六進位制(使用0x或者0X做字首) 
"""
x=0b10001100 print(type(x)) print(x) # <class 'int'> # 140
(4)四種進位制之間的轉換
"""
1) 十進位制轉換成其他進位制

 將x轉換成2進位制?
 x=25
 使用下除法
 被除數:十進位制的數
 除數:要轉換成的進位制
 取商和餘數,方向,從下往上
"""
"""
 2) 其他進位制轉換成十進位制
 
 乘冪法
 將y轉換成十進位制
 y=0b1100
 底數:當前的進位制
 冪:從右到左,從0開始計位,當前的位

 練習:
     (1)x=58 轉換成8進位制,16進位制
     (2)y=0b1010,轉換成10進位制  1*2**3+1*2**1=10
 底數:當前的進位制 2
 冪:從右到左,從0開始計位,當前的位  3  1

"""
"""
3) 其他進位制之間轉換

*手演算法*

二進位制和八進位制:二進位制的三位對應八進位制的一位
z=0o765
	111110101
z=0b10101111111
0o2577

二進位制和十六進位制:二進位制的四位對應十六進位制的一位
z=0x765
	011101100101
z=0b10101111111
57f
"""
# *引用函式*

# bin():將數值轉換成二進位制
z=0o765
print(bin(z),type(bin(z)))
# z結果:0b111110101 <class 'str'>
# 注意:python中對於進位制轉換使用的函式,只有int的返回值是數值型別,其他都是str型別
# int():將數值轉換成十進位制 z=0b10101111111 print(int(z),type(int(z))) # oct():將數值轉換成八進位制 print(oct(z),type(oct(z))) # hex():將數值轉換成十六進位制 z=0b10101111111 print(hex(z),type(hex(z))) # 注意:進位制轉換後type是str,str只能和str進行計算 x=101 print(x+1) # 102 print(bin(101)+1) # TypeError: must be str, not int print(bin(101)+bin(1)) # 0b11001010b1
# *關於int的進位制用法print(int(字串,n))*

# 關於int的進位制用法print(int(字串,n)) 
# 就是將字串看成n進位制的數,進行int轉換
print(int("100",8)) # 可以 將100看成8進位制,做int轉換
print(int("9800",2)) # ValueError: invalid literal for int() with base 2: '9800'
print(int("100")) # 100  因為預設就是十進位制
2. 布林型 bool
# 布林型別是整數型別的子型別
# True  False
# 整數型別 0(False)   1(True)

# 定義布林型別
# 變數名=變數值

# 在實際的開發中不要這樣
x=True
print(x,type(x))
print(x+1)   

# bool主要的應用:
a=3
b=5
print(a<b)

浮點型 float
(1)浮點的定義
"""
小數 0.1  2.2
python的浮點型別只支援十進位制

變數名=浮點數
# 浮點型別定義時,前面可以加0,整數型別不可以
"""
f=01.1
print(f,type(f))
# 1.1 <class 'float'>
(2)浮點型別的科學計數法
print(1.2E8)
print(1.2e-8)
# 1.2*10**8   120000000.0
# 1.2e-08
(3)取值範圍
# 浮點數是有範圍的
import sys
print(sys.float_info.max)
print(sys.float_info.min)
print(1.2e1001)
# 1.7976931348623157e+308
# 2.2250738585072014e-308
# inf
(4)特殊的浮點數
"""
# inf: 無窮 +inf 無窮大   -inf 無窮小
# nan : 不是一個數字,表示一個數,但是是一個無效的數字
"""
# nan的應用
print(float("inf"),type(float("inf")))
print(float("nan"),type(float("nan")))
a=float("inf")
print(a*0)
print(a/a)
# inf <class 'float'>
# nan <class 'float'>
# nan
# nan

# nan跟誰都不相等
a=float("nan")
b=float("nan")
print(a==b) # False

# math模組中isnan函式可以判斷物件是否是nan
import math
c=1
print(math.isnan(c))
# False
(5)浮點型別的不精確性
# 浮點型別在計算機中是近似儲存
print(1/3)
print(10/3)
# 0.3333333333333333
# 3.3333333333333335

# 為什麼浮點型別不精確?二進位制
# 小數的二進位制規則  :小數位*2,取整數位,從上到下
# 例子

"""
0.1
0.1*2=0.2    0
0.2*2=0.4    0
0.4*2=0.8    0
0.8*2=1.6    1
0.6*2=1.2    1
0.2*2=0.4    0
原因:小數在計算機中真實的儲存,有可能是無限的二進位制小數。

0.25
0.25*2=0.5   0
0.5*2=1.0    1
"""
# 使用浮點數的時候要注意:
# (1)避免數量級相差很大的浮點數之間進行運算
# 運算的時候無法跨越到下一個數量級
f1=5e20
f2=1
print(f1+f2)

#(2)浮點數避免進行等量判斷
f1=0.1
f2=0.2
print(f1+f2==0.3)
# print(f1+f2)
# 解決浮點型別的不精確性
print(f1)
# 需要使用decimal模組顯示浮點型別的原型
import decimal
print(decimal.Decimal(0.1))
print(decimal.Decimal("inf"))
print(decimal.Decimal("nan"))
print(decimal.Decimal(0.25))
 
# 0.1000000000000000055511151231257827021181583404541015625
# Infinity
# NaN
# 0.25

# 希望數學0.1+0.2
# 使用字串傳入浮點型別,使得浮點型別變得精確
x=decimal.Decimal("0.1")
y=decimal.Decimal("0.2")
print(x+y)
print(x+y==0.3)
print(x+y==decimal.Decimal("0.3"))
# 0.3
# False
# True

# 慎用,需要佔用記憶體
print(decimal.Decimal(0.1))

#獲得浮點數保留的位數
print(decimal.getcontext().prec)
# 永遠是28位  

# 可以自行設定decimal.getcontext().prec保留位數
import decimal
decimal.getcontext().prec=5

x=decimal.Decimal(0.1)
print(x)
# 0.1000000000000000055511151231257827021181583404541015625

y=decimal.Decimal(0.2)
print(y)
# 0.200000000000000011102230246251565404236316680908203125

# 特別注意:只有在參與運算之後才生效。
print(x+y)
# 0.30000
4. 複數型 complex
# 4  === 2**2
# 數學上 實部+虛部  a+bi
# python   實部+虛部j
# 定義:  變數名= 複數

c=2+1j
print(c,type(c))
# (2+1j) <class 'complex'>

# 複數中的實部和虛部都是使用浮點數表示
print(c.real)
print(c.imag)
# 2.0
# 1.0

import cmath
print(cmath.sqrt(-4))

# import math
# print(math.sqrt(-1))
5. 型別轉換
"""
int(value)-----將value轉換成整數型別
float(value)---將value轉換成浮點型別
bool(value)---將value轉換成布林型別
complex(value)---將value轉換成複數型別
"""
i=2
f=-2.0
c=0j
b=True

# (1) int(value)-----將value轉換成整數型別
print(int()) # value如果不寫引數,預設會得到0
print(int(f))   # -2 將浮點型別中的小數部分去掉
# print(int(c)) # 不能將個複數型別轉換成整數型別
print(int(b)) # 1

# (2)float(value)---將value轉換成浮點型別
print(float()) # value如果不寫引數 ,預設得到0.0
print(float(i))  # 2.0
# print(float(c)) # 複數型別也不能轉換成浮點型別
print(float(b)) # 1.0

#(3)bool(value)---將value轉換成布林型別
# 任何一種資料型別都可以轉換成布林型別
# 整數0、浮點0.0、複數0j 對應的布林型別都是False,除此之外都是True
print(bool()) # value如果不寫引數,預設得到False
print(bool(i))  # True
print(bool(c)) # False
print(bool(f)) # True

#(4)complex(value)---將value轉換成複數型別
print(complex())   # 如果value不寫,預設返回是0j
print(complex(i)) # (2+0j)
print(complex(f)) # (-2+0j)
print(complex(b)) # (1+0j)

# 兩種型別之間做運算,結果取級別高的進行儲存
# 複數型別 > 浮點型別> 整數
i=3
f=-2.0
c=0j
b=True
print(i+f) # 1.0
print(c+f) # (-2+0j)