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.real
和z.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 // 2 返回0,(-1) // 2 返回-1,1 // (-2) 返回-1,(-1) // (-2) 返回0。
- 這種運算不適用於複數。
- 將浮點型轉換為整型的小數部分取捨類似於C語言;可以參考math模組中的floor()和ceil()函式。
- float可以接受字串引數如“nan”和“inf“以及一個設定字首的位置引數”+“或”-“來表示NaN的正負極限。
- Python定義了pow(0, 0)以及0 ** 0的值為1.
- 接收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) |
說明:
- 按位左移和右移的位數不能為負數,否則會引發ValueError異常;
- 按位左移運算等價於乘以pow(2, n),且不做溢位檢測;
- 按位右移運算等價於除以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元素出現的次數 |
序列型別支援對比,兩個序列相同的條件是,長度相同、每個元素相同、序列型別相同。
說明:
當序列為字串時,in和not in操作類似檢測是否為子字串;
當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]]
如果i或j是複數,則索引是從後往前算:len(s) + i 或len(s) + j來替換該負值。但-0依然是0。
如果i或者j比len(s)大,則會替換為len(s)。如果i缺失或者為None,則會替換為0;如果j缺失或者為None,則會替換為len(s)。如果i大於等於j,則切片為空。
從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。
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'>