資料型別

內建型別

布林

boolTrueFalse 的布林值。像 andornot 這樣的邏輯運算可以在布林值上執行。

x or y    # if x is False then y otherwise x 
x and y   # if x is False then x otherwise y
not x     # if x is True then False, otherwise True

在 Python 2.x 和 Python 3.x 中,布林值也是一個 intbool 型別是 int 型別的子類,TrueFalse 是它唯一的例項:

issubclass(bool, int) # True

isinstance(True, bool) # True
isinstance(False, bool) # True

如果在算術運算中使用布林值,則它們的整數值(10 用於 TrueFalse)將用於返回整數結果:

True + False == 1 # 1 + 0 == 1
True * True  == 1 # 1 * 1 == 1

數字

  • int:整數

    a = 2
    b = 100
    c = 123456789
    d = 38563846326424324
    

    Python 中的整數具有任意大小。

    注意:在舊版本的 Python 中,可以使用 long 型別,這與 int 不同。這兩個已經統一了。

  • float:浮點數; 精度取決於實現和系統架構,對於 CPython,float 資料型別對應於 C double。

    a = 2.0
    b = 100.e0
    c = 123456789.e1
    
  • complex:複數

    a = 2 + 1j
    b = 100 + 10j
    

當任何運算元是複數時,<<=>>= 運算子將引發 TypeError 異常。

字串

Python 3.x >= 3.0
  • str:一個 unicode 字串'hello'的型別
  • bytes:一個位元組字串b'hello'的型別
Python 2.x <= 2.7
  • str:一個位元組字串'hello'的型別
  • bytesstr 的同義詞
  • unicode:一個 unicode 字串u'hello'的型別

序列和集合

Python 區分有序序列和無序集合(例如 setdict)。

  • 字串(strbytesunicode)是序列

  • reversed:具有 reversed 功能的 str 的逆序

    a = reversed('hello')
    
  • tuple:任何型別的 n 值的有序集合(n >= 0)。

    a = (1, 2, 3)
    b = ('a', 1, 'python', (1, 2))
    b[2] = 'something else' # returns a TypeError
    

    支援索引; 不可改變的; 如果其所有成員都可以清洗,則可以清洗

  • listn 值的有序集合(n >= 0

    a = [1, 2, 3]
    b = ['a', 1, 'python', (1, 2), [1, 2]]
    b[2] = 'something else' # allowed
    

    不可洗; 可變的。

  • set:無序的唯一值集合。物品必須是可清洗的

    a = {1, 2, 'a'}
    
  • dict:一組無序的唯一鍵值對; 鍵必須是可以清洗的

    a = {1: 'one',
         2: 'two'}
    
    b = {'a': [1, 2, 3],
         'b': 'a string'}
    

如果一個物件具有一個在其生命週期內永遠不會改變的雜湊值(它需要一個 __hash__() 方法),並且可以與其他物件進行比較(它需要一個 __eq__() 方法),則該物件是可清除的。比較相等性的 Hashable 物件必須具有相同的雜湊值。

內建常量

結合內建資料型別,內建名稱空間中有少量內建常量:

  • True:內建式 bool 的真正價值
  • False:內建型別 bool 的錯誤值
  • None:用於表示某個值不存在的單例物件。
  • Ellipsis...:在 Python3 +核心中使用,在 Python2.7 +中作為陣列表示法的一部分使用有限。numpy 和相關軟體包將其用作陣列中的包含所有內容引用。
  • NotImplemented:用於向 Python 指示特殊方法不支援特定引數的單例,如果可用,Python 將嘗試替代方法。
a = None # No value will be assigned. Any valid datatype can be assigned later
Python 3.x >= 3.0

None 沒有任何自然順序。不再支援使用訂購比較運算子(<<=>=>)並且將提升 TypeError

Python 2.x <= 2.7

None 總是小於任何數字(None < -32 評估為 True)。

測試變數的型別

在 python 中,我們可以使用內建函式 type 檢查物件的資料型別。

a = '123'
print(type(a))
# Out: <class 'str'>
b = 123
print(type(b))
# Out: <class 'int'>

在條件語句中,可以使用 isinstance 測試資料型別。但是,通常不鼓勵依賴變數的型別。

i = 7
if isinstance(i, int):
    i += 1
elif isinstance(i, str):
    i = int(i)
    i += 1

有關 type()isinstance() 之間差異的資訊,請參閱: Python 中 isinstance 和 type 之間的差異

要測試是否有什麼東西是 NoneType

x = None
if x is None:
    print('Not a surprise, I just defined x as None.')

在資料型別之間轉換

你可以執行顯式資料型別轉換。

例如,‘123’是 str 型別,可以使用 int 函式將其轉換為整數。

a = '123'
b = int(a)

可以使用 float 函式從浮點字串(例如'123.456’)轉換。

a = '123.456'
b = float(a)
c = int(a)    # ValueError: invalid literal for int() with base 10: '123.456'
d = int(b)    # 123

你還可以轉換序列或集合型別

a = 'hello'
list(a)  # ['h', 'e', 'l', 'l', 'o']
set(a)   # {'o', 'e', 'l', 'h'}
tuple(a) # ('h', 'e', 'l', 'l', 'o')

文字定義的顯式字串型別

在引號前面有一個字母標籤,你可以知道要定義的字串型別。

  • b'foo bar':Python 3 中的 bytes,Python 2 中的 str
  • u'foo bar':Python 3 中的 str,Python 2 中的 unicode
  • 'foo bar':結果 str
  • r'foo bar':結果所謂的原始字串,其中不需要轉義特殊字元,所有內容都是在你輸入時逐字記錄的
normal  = 'foo\nbar'   # foo
                       # bar
escaped = 'foo\\nbar'  # foo\nbar   
raw     = r'foo\nbar'  # foo\nbar

可變和不可變資料型別

如果可以更改物件,則稱為 mutable 。例如,當你將列表傳遞給某個函式時,可以更改列表:

def f(m):
    m.append(3)  # adds a number to the list. This is a mutation.

x = [1, 2]
f(x)
x == [1, 2]  # False now, since an item was added to the list

如果無法以任何方式更改物件,則該物件稱為不可變。例如,整數是不可變的,因為沒有辦法改變它們:

def bar():
    x = (1, 2)
    g(x)
    x == (1, 2)  # Will always be True, since no function can change the object (1, 2)

請注意,變數本身是可變的,因此我們可以重新分配變數 x,但這不會改變 x 之前指向的物件。它只讓 x 指向一個新物件。

例項可變的資料型別稱為可變資料型別,類似於不可變物件和資料型別。

不可變資料型別的示例:

  • intlongfloatcomplex
  • str
  • bytes
  • tuple
  • frozenset

可變資料型別的示例:

  • bytearray
  • list
  • set
  • dict