1. 程式人生 > >Python內建型別補充

Python內建型別補充

內建型別補充

下面是對Python直譯器中內建的標準型別的一個補充。

Python的主要內建型別有數字、序列、對映、類、例項以及異常。

真值驗證

任何物件都可以作為if或while的條件來做真值驗證,以下情況均為假:

  • None
  • False
  • 數字零,類似0,0.0,0j等
  • 任意空序列,類似”,(),[]
  • 任意空對映,類似{}
  • 使用者自定義類的例項,如果類定義了__bool__()或____len__()方法,當該方法返回數字0或布林值False時

除了上述這些情況,其餘情況都預設為True,因此許多不同型別的物件總為真值。

布林運算子

下表是由優先順序降序排列:

操作 結果 對應說明
x or y if x is false,then y,else x 1
x and y if x is false,then x,else y 2
not x if x is false,then true,else false 3

1. or是一個短路操作符,如果x符合條件則不再判斷y
2. and也是一個短路操作符,如果x不符合條件,則不再判斷y
3. not在布林運算子中優先順序最高,但布林運算子對比其他運算子優先順序較低。所以,not a==b被解釋為not (a==b),而a == not b 是一種語法錯誤。

比較運算子

Python中共有8種比較運算子,且都處在同一優先順序。比較運算子可以做鏈式比較,例如:x < y <= z 等同於x

數字運算子

數字型別主要有三種:整型,浮點數和複數型別。布林值是整數型別的一個子型別。整型為無限精度,浮點型類似C語言中的雙精度。而精度一般是有所用機器的系統決定的,可通過sys.float_info來檢視浮點的精度範圍。複數型別有一個實數部分和一個虛數部分,兩部分都為浮點型別,假設變數z為一個複數,可以通過z.realz.imag來得到實數和虛數部分。標準庫還包括其他的數字型別,fractions儲存有理數,decimal儲存使用者自定義精度的浮點數。

Python支援不同數字型別的混合運算:當一個二進位制操作符運算不同數字型別的運算數時,“窄”型別的運算元會被轉換成另一種型別後進行運算,寬窄等級如下:整型<浮點型<複數型別。兩個不同型別的數字對比也遵循如上規則。int()、float()、complex()等構造器可以用來構建對應的數字型別。

除了複數之外的所有數字型別都支援如下操作符,這些操作符是以優先順序從小到大排列的。所有數字運算子都要比比較運算子優先順序高。

操作符 結果 對應說明
x + y x和y之和
x - y x減y之差
x * y x乘以y
x / y x除以y
x // y x除以y取模 說明1
x % y x除以y取餘數 說明2
-x x取反
+x x不變
abs(x) x絕對值
int(x) 將x轉換為整數型別 說明3、說明6
float(x) 將x轉換為浮點型別 說明4、說明6
complex(re, im) 轉換為複數型別,其中re為實數部分,im為虛數部分,im預設為0 說明6
c.conjugate() 數字c的複數型別
divmod(x, y) (x // y, x % y)組成的元組 說明2
pow(x, y) x的y次方冪 說明5
x ** y x的y次方冪 說明5

說明:

  1. 與除法相關,結果會傾向於較小的那個整數:1 // 2 返回0,(-1) // 2 返回-1,1 // (-2) 返回-1,(-1) // (-2) 返回0。
  2. 這種運算不適用於複數。
  3. 將浮點型轉換為整型的小數部分取捨類似於C語言;可以參考math模組中的floor()和ceil()函式。
  4. float可以接受字串引數如“nan”和“inf“以及一個設定字首的位置引數”+“或”-“來表示NaN的正負極限。
  5. Python定義了pow(0, 0)以及0 ** 0的值為1.
  6. 接收0-9數字以及任何Unicode對等量。

所有實數型別可以進行如下操作:

操作 結果
math.trunc(x) 結果截斷至整數
round(x[, n]) 儲存到小數點後n位數,n預設為0
math.floor(x) 結果取到整數,會取最小整數,例如:1.111和1.999結果都為1
math.ceil(x) 結果取到整數,會取最大整數,例如:1.111和1.999結果都為2

位元運算

整數支援一種只對位元串有效的操作。整數轉換為二進位制,負數被轉換為自身的補碼。

這種二進位制的按位操作的優先順序低於數字運算,但高於對比運算。一元操作符~的優先順序同其他一元數字運算一致(例如+和-)。

以下是位元運算子,以優先順序從低到高排序:

操作 結果 舉例
x | y x和y按位或操作 4|2=6,100|010 中,只要一位上有一個值為1,則結果中此位值為1,所以本例結果為110,十進位制6
x ^ y x和y按位異或操作 4^2,100^010,對應位相加,返回結果為110,二進位制為
x & y x和y按位與操作 4&2,100&010,只有某位的值都為1時,此位值才是1,其餘情況都為0,因此本例結果為000,二進位制0
x << y x按位左移n位 4<<2=16, 100左移兩位為10000,結果為16
x >> y x按位右移n位 4>>2=1, 100左移兩位為1, 結果為1
~x x按位反轉 ~4=-5,-(100+1) =-5,此運算子為一元運算子,運算規則為~x=-(x+1)

說明:

  1. 按位左移和右移的位數不能為負數,否則會引發ValueError異常;
  2. 按位左移運算等價於乘以pow(2, n),且不做溢位檢測;
  3. 按位右移運算等價於除以pow(2, n),且不做溢位檢測。

整型的其他方法

  • int.bit_length()

    返回一個整數的二進位制位數。

    >>> n = -37
    >>> bin(n)
    '-0b100101'
    >>> n.bit_length()
    6

    相當於:

    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
  • int.to_bytes(length, byteorder, *, signed=False)

    返回一個表示整數的位元組陣列。

    >>> (1024).to_bytes(2, byteorder='big')
    b'\x04\x00'
    >>> (1024).to_bytes(10, byteorder='big')
    b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00'
    >>> (-1024).to_bytes(10, byteorder='big', signed=True)
    b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00'
    >>> x = 1000
    >>> x.to_bytes((x.bit_length() // 8) + 1, byteorder='little')
    b'\xe8\x03'
  • int.from_bytes(bytes, byteorder, *, signed=False)

    類方法,返回位元組陣列所表示的整數。

    >>> int.from_bytes(b'\x00\x10', byteorder='big')
    16
    >>> int.from_bytes(b'\x00\x10', byteorder='little')
    4096
    >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=True)
    -1024
    >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=False)
    64512
    >>> int.from_bytes([255, 0, 0], byteorder='big')
    16711680

浮點型的其他方法

  • float.as_integer_ratio()

    返回一個由兩個整陣列成的元組,元組的第一個元素除以第二個元素的值為該浮點數。

    >>> a=1.234
    >>> a.as_integer_ratio()
    (694680242521899, 562949953421312)
    >>> 694680242521899/562949953421312
    1.234

    如果是無限迴圈小數,則丟擲OverflowError異常。而對於NaN則會丟擲ValueError異常。

  • float.is_integer()

    >>> (-2.0).is_integer()
    True
    >>> (3.2).is_integer()
    False
  • float.hex()

    返回表示該浮點數的十六進位制字串。對於有限浮點數,這種表示方法總是以0x開頭,並以p結尾。

  • float.fromhex(s)

    類方法,返回十六進位制字元所表示的浮點數。

    >>> float.fromhex('0x3.a7p10')
    3740.0
    >>> float.hex(3740.0)
    '0x1.d380000000000p+11'

數字對比其實就是對比兩者的雜湊值,雜湊值一致,則兩個數相等。

import sys, math

def hash_fraction(m, n):
    """Compute the hash of a rational number m / n.

    Assumes m and n are integers, with n positive.
    Equivalent to hash(fractions.Fraction(m, n)).

    """
    P = sys.hash_info.modulus
    # Remove common factors of P.  (Unnecessary if m and n already coprime.)
    while m % P == n % P == 0:
        m, n = m // P, n // P

    if n % P == 0:
        hash_ = sys.hash_info.inf
    else:
        # Fermat's Little Theorem: pow(n, P-1, P) is 1, so
        # pow(n, P-2, P) gives the inverse of n modulo P.
        hash_ = (abs(m) % P) * pow(n, P - 2, P) % P
    if m < 0:
        hash_ = -hash_
    if hash_ == -1:
        hash_ = -2
    return hash_

def hash_float(x):
    """Compute the hash of a float x."""

    if math.isnan(x):
        return sys.hash_info.nan
    elif math.isinf(x):
        return sys.hash_info.inf if x > 0 else -sys.hash_info.inf
    else:
        return hash_fraction(*x.as_integer_ratio())

def hash_complex(z):
    """Compute the hash of a complex number z."""

    hash_ = hash_float(z.real) + sys.hash_info.imag * hash_float(z.imag)
    # do a signed reduction modulo 2**sys.hash_info.width
    M = 2**(sys.hash_info.width - 1)
    hash_ = (hash_ & (M - 1)) - (hash & M)
    if hash_ == -1:
        hash_ == -2
    return hash_

序列型別—str,bytes,bytearray,list,tuple,range

序列通常有如下通用操作:

操作 結果 說明
x in s 當x屬於s時返回True,否則返回False 1
x not in s 當x不屬於s時返回True,否則返回False 1
s + t 返回序列x和t按順序拼接的結果 6
s*n, n*s 將s做n次淺拷貝並拼接後返回 2
s[i] 返回索引為i的元素,索引從0開始 3
s[i:j] 返回索引從i到j-1的切片 3,4
s[i:j:k] 返回索引從i到j,步長為k的切片 3,5
len(s) 返回序列的長度
min(s) 返回序列最小元素
max(s) 返回序列最大元素
s.index(i) 返回序列中首個元素為i的索引值
s.count(i) 返回序列中i元素出現的次數

序列型別支援對比,兩個序列相同的條件是,長度相同、每個元素相同、序列型別相同。

說明:

  1. 當序列為字串時,in和not in操作類似檢測是否為子字串;

  2. 當n的值小於0時,將一律當做0處理,這種情況下會返回空序列。需要注意的是此時為淺拷貝:

    >>> lists = [[]] * 3
    >>> lists
    [[], [], []]
    >>> lists[0].append(3)
    >>> lists
    [[3], [3], [3]]

    如果想要得到不同的結果,可以參考下列操作:

    >>> lists = [[] for i in range(3)]
    >>> lists[0].append(3)
    >>> lists[1].append(5)
    >>> lists[2].append(7)
    >>> lists
    [[3], [5], [7]]
  3. 如果i或j是複數,則索引是從後往前算:len(s) + i 或len(s) + j來替換該負值。但-0依然是0。

  4. 如果i或者j比len(s)大,則會替換為len(s)。如果i缺失或者為None,則會替換為0;如果j缺失或者為None,則會替換為len(s)。如果i大於等於j,則切片為空。

  5. 從i到j,步長為k的切片,其元素索引為i,i+k,i+2*k,…直到達到或超過j的值,但永不包含j。如果i或j大於len(s),則替換為len(s);如果i缺失或為None,則替換為0;如果j缺失或為None,則替換為len(s)。如果k缺失,取預設值1。

  6. CPython直譯器細節:如果s和t都為字串,有些Python直譯器例如CPython可以寫成這種格式:s = s + t或s += t。為了增強直譯器相容性,這種情況最好使用字串內建方法str.join([s, t])

字串格式化操作

這裡的字串格式化方式可能在未來棄用,請關注版本更新資訊

字串物件有一個特殊的內建操作符:%,用來做字串格式化。

當格式化一個值的時候,將被格式化的內容放到操作符%後:

>>> a = "Nemo"
>>> b = "hello %s" % a
>>> b
'hello Nemo'

當格式化多個值時,各個值按照位置關係,通過元組傳入到字串中:

>>> a = "hello"
>>> b = "Nemo"
>>> c = "%s %s" % (a, b)
>>> c
'hello Nemo'

當格式化內容存在字典時:

>>> print('%(language)s has %(number)03d quote types.' %
...       {'language': "Python", "number": 2})

其中%後跟著的字母為佔位符,不同佔位符所支援格式化的型別不同:

佔位符 說明
‘d’ 整數
‘i’ 整數
‘o’ 八進位制數
‘u’ 廢棄型別,和’d’差不多
‘x’ 十六進位制(小寫)
‘X’ 十六進位制(大寫)
‘e’ 浮點數指數格式(小寫)
‘E’ 浮點數指數格式(大寫)
‘f’ 浮點數十進位制格式(小寫)
‘F’ 浮點數十進位制格式(大寫)
‘g’ 浮點數格式。當指數級別小於-4或更低精度時使用指數格式(小寫),否則使用十進位制格式
‘G’ 浮點數格式。當指數級別小於-4或更低精度時使用指數格式(大寫),否則使用十進位制格式
‘c’ 單個字母(可以是整數或單個字母)
‘r’ 字元(使用repr()方法來轉換任意Python物件)
’s’ 字元(使用str()方法來轉換任意Python物件)
‘a’ 字元(使用ascii()方法來轉換任意Python物件)
‘%’ 如果沒有傳入任何引數,則結果中顯示原字元’%’

range型別

range型別是屬於不可變序列,通常用於迴圈操作。使用range的好處是,不論range長度多少,它都佔用等量的記憶體。

range物件支援索引操作、容器操作、迭代操作、len()函式,以及:

  • range.count(x)

    返回range物件中x元素存在的個數。

  • range.index(x)

    返回range物件中s[i] == x 的索引值i。如果x不在range物件中,則丟擲ValueError異常。

可變序列

列表和bytearray屬於可變序列,字串和元組屬於不可變序列。可變序列支援對序列中的元素更改,不可變序列中的元素一旦建立不可更改。可變序列有如下操作,需要注意的是列表元素可以為任意元素,bytearray的元素只能是範圍0~256的整數:

操作 結果
s[i] = x 將索引i的元素的值替換為x
s[i:j] = t 將索引為i到j的切片替換為可迭代物件t
del s[i:j] 類似s[i:j] = []
s[i:j:k] = t 將s[i:j:k]的元素替換為t
del s[i:j:k] 將s[i:j:k]裡的元素刪除
s.append(x) 等同於s[len(s) : len(s)] = [x]
s.extend(x) 等同於s[len(s) : len(s)] = x
s.count(x) 返回s中值為x元素的個數
s.index(x[, i[, j]]) 返回序列i到j切片中元素值等於x的最小索引
s.insert(i, x) 等同於s[i:i] = [x]
s.pop([i]) 等同於 x = s[i]; del s[i]; return x
s.remove(x) 等同於del s[s.index(x)]
s.reverse() 反轉序列元素
s.sort([key[, reverse]]) 對序列元素排序

說明:

  • 可迭代物件t的長度應當與被替換的切片長度一致;

  • x可以為任意可迭代物件;

  • 當序列s中不包含值為x的元素時,index方法會丟擲ValueError異常;
  • 當insert方法傳入負索引時,序列長度會增加。
  • pop方法的引數i預設值為-1,即預設刪除序列最後一個元素;
  • 當排序或反轉一個大序列時,sort方法和reverse方法開銷較小,但不好的一點是這兩種方法都不返回操作過的序列;
  • sort方法必須傳入排序關鍵字引數,作為排序的對比依據。key引數接收一個函式,對序列裡每個值處理後進行排序,例如:key=str.lower,這樣會把序列中的元素。

bytes和bytearray

bytes和bytearray物件,都屬於位元組字串,可以使用字串的所有方法,但bytes不接收str做引數,同理str也不接收bytes做引數。

a = "abc"
b = a.replace("a", "f")
a = b"abc"
b = a.replace(b"a", b"f")
  • bytes.decode(encoding=”utf-8”, errors=”strict”) bytesarray.decode(encoding=”utf-8”, errors=”strict”)

    返回位元組解碼後的字串,預設編碼方式為utf-8。errors引數為處理異常的模式,預設為strict,即編碼的時候遇到錯誤會丟擲UnicodeError異常。其他可用值有’ignore’,’replace’等。

  • bytes.fromhex(sting) bytesarray.fromhex(string)

    類方法,返回對string解碼後的字元物件。引數string中,每個位元組必須至少包含兩個十六進位制數,空格會被忽略。

    >>> bytes.fromhex('f0 f1f2  ')
    b'\xf0\xf1\xf2'
  • bytes.translate(table[, delete]) bytearray.translate(table[, delete])

    返回bytes或bytearray物件的副本,其中刪除了可選引數delete中出現的左右位元組,其餘位元組通過給定轉換表對映,該轉換表必須是長度為256的位元組物件。

    可以通過bytes.maketrans()方法來構造一個轉換表。

    如果只是想刪除字元,可以將table引數設為None。

    >>> b'read this short text'.translate(None, b'aeiou')
    b'rd ths shrt txt'
  • bytes.maketrans(from, to) bytearray.maketrans(from, to )

    靜態方法,返回一個轉換表,這個表通常提供給bytes.translate()使用。會把from和to中相同位置的字元做對映,而from和to必須為位元組型別並且長度相等。

相關推薦

Python型別補充

內建型別補充 下面是對Python直譯器中內建的標準型別的一個補充。 Python的主要內建型別有數字、序列、對映、類、例項以及異常。 真值驗證 任何物件都可以作為if或while的條件來做真值驗證,以下情況均為假: None False 數字零,類

python——型別——函式——引數

必選引數 def enroll(name, gender): print 'name:', name, 'gender:', gender enroll('Bob', 'M') enroll

易被忽略的Python型別

Python中的內建型別是我們開發中最常見的,很多人都能熟練的使用它們。 然而有一些內建型別確實不那麼常見的,或者說往往會被我們忽略,所以這次的主題就是帶領大家重新認識這些“不同尋常”的內建型別。 (注意:本文基於python3,不會包含任何python2相關內容) frozenset 不可變集合(fr

Python 型別及其用法

本文講述了Python內建型別。記錄以供學習。具體如下: python內建型別 1、list:列表 (即動態陣列,C++標準庫的vector,但可含不同型別的元素於一個list中) 程式碼如下: a = ["I","you","he","she

(1) Python 型別 –- 字串

概述:Python字串 – 一個有序的字元集合,用於儲存和表現基於文字的資訊。 1 字串 1.1 單引號、雙引號、三引號和轉義引號 單引號和雙引號沒有區別;三重引號編寫多行字串塊;轉義引號代表特

Python型別效能分析

timeit模組 timeit模組可以用來測試一小段Python程式碼的執行速度。 class timeit.Timer(stmt=‘pass’, setup=‘pass’, timer=) Timer是測量小段程式碼執行速度的類。 stmt引數是要測試的程式碼

python——型別——整型 浮點型 字串 布林型 空型

整型 十進位制:123,456八進位制:0123,0456十六進位制:0x7abc,0X8def浮點型 十進位制(必須包含小數點):123.456,.123,123.科學計數法(e或E前後必須有值):

為什麼繼承 Python 型別會出問題?!

> 本文出自“Python為什麼”系列,請檢視[全部文章](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzUyOTk2MTcwNg==&action=getalbum&album_id=1338406397180084225&su

Python序列型別概覽

1.容器序列 list,tuple和collections.deque這些序列能存放不同型別的資料。 2.扁平序列 str,bytes,bytearray,memoryview和array.array。這類序列只能容納一種型別。   扁平序列其實是一

python從零開始--36 python類屬性 __len__ __getitem__ 實現 (補充26節)

在網上看到一個關於實現 __len__   __getitem__的程式碼,稍微修改了一下,剛好作為26節內建類屬性的補充。 程式碼說明: 1. 定義一稿Card具名元組,用來存放撲克點數和花色的組合,FrenchDeck初始化後,剛好是52組資料 2. __len_

python——資料型別(上)

內建資料三大主要型別:           數字(整數,浮點數)           序列(字串,列表,元組)           對映(字典

Python 3.7.1 基礎-型別

內建型別 1.真值測試 2.布林運算 3.比較運算子 4.數值型別 4.1 操作運算子 4.2 整數的一些方法 int.bit_length() int.to_bytes(length, byteo

python從零開始--36 python類屬性 __len__ __getitem__ 實現 (補充26節)

在網上看到一個關於實現 __len__   __getitem__的程式碼,剛好作為26節內建類屬性的補充。 程式碼說明: 1. 定義一稿Card具名元組,用來存放撲克點數和花色的組合,FrenchDeck初始化後,剛好是52組資料 2. __len__實現了len(o

python資料結構heapq【以後補充&修正】

heapq 最小堆 heapq.heapify()將列表原地轉換為堆。 sort()區別在於heap採用的是堆排序演算法,sort採用的是歸併排序演算法。 堆(heap)是一個樹形資料結構,其中子節點與父節點是一種有序關係。 二叉堆(Binary heap)可以使用以

Python的序列型別 Python 程式設計規範 —— TODO 註釋(結合 PyCharm)

bytes   list  str  tuple  bytearray 元組和字串都是不可以改變的 ctrl+q pycharm  查詢的是文件  就是在函式的地方  TODO 自然表示需要做而未做的一些待完成的事項,有助於事後的檢索,以及對整體專案做進一步的修改

python 函式型別判斷isinstance的用法以及與type的區別

 type() 方法的語法: type(object) type(name, bases, dict) 引數  返回值 name -- 類的名稱。 bases -- 基類的元組。 dict -- 字典,類內定義的名稱空間變數。 一個引數返回物件型別, 三個引數

Python基礎學習:型別(1)

Python中基本內建型別由數字、序列、對映、類、例項和例外。一些集合類是可變的,因此那些可以增添、刪除或排列這些類的方法不會奏效,只會返回None,用來示意函式呼叫者邏輯上的錯誤。但同時,幾乎所有操作都支援幾種典型的函式操作,比如說:比較、真值測試以及用str()或repr

python物件型別轉換簡記

內建物件 釋義 int(x) 字串或數字轉換為整數,如果是浮點型數,則進行舍位,而不是舍入 long(x) 字串或整數轉換成長整形,同上 float(x)

Python基礎學:型別(2)

5.迭代器型別       Python支援對容器進行迭代的概念。他有兩種不同的實現方法,但都可以歸於使用使用者自定義的類實現迭代。接下來,將詳細解釋說明:       第一種方法需要定義容器物件以提供迭代基礎:container. __iter__()該方法返回一個迭代器物

Python:type、object、class與型別

Python:type、object、class Python: 一切為物件 >>> a = 1 >>> type(a) <class'int'>