標籤:標誌位 限制 解決 members typeerror contex 調用 允許 存在
一:位操作
除了一般的數學運算,python也支援c語言中的大多數數學運算式。這包括那些把整數當作二進位位串對待的操作。例如,還可以實現位移及布爾操作:
>>> x = 1 #0001>>> x << 2 #shift left 2 bits:01004>>> x | 2 #Bitwise OR:00113>>> x & 1 #Bitwise AND:00011
這樣的按位進行掩碼的運算,使我們可以對一個整數進行多個標誌位和值進行編碼。在這裡,我們不太過於涉及更多的關於“位元運算”的細節。如果需要的話,它是支援的。在python3.1中,整數的bit_length方法也允許我們查詢以二進位表示一個數位值所需要的二進位的位元。另外,通過bin()和內建函數len()得到二進位字串的長度,然後再減去2,往往可以得到同樣的結果,儘管效率較低:
>>> X = 99>>> bin(X),X.bit_length()(‘0b1100011‘,7)>>>bin(256),(256).bit_length()(‘0b100000000‘,9)>>> len(bin(256)) - 2 #字串長度減去數字進位標誌‘0b’兩位長度9
二:其他的內建數學工具
除了核心物件類型以外,python還支援用於數文書處理的內建函數和內建模組。內建函數pow(),abs(),分別計算冪和絕對值。這裡有一些內建math模組(包含C語言中math庫中的絕大多數工具)。
>>> abs(-42.0),sum((1,2,3,4)) #sum()作用於數位一個序列(42.0,10)>>>min(3,1,2,4),max(3,1,2,4) #min()和max()函數接受一個參數序列或者單個的參數(1,4)
注意內建math這樣的模組必須先匯入,但是abs()這樣的內建函數不需要匯入就可以直接使用。換句話說,模組是外部的組件,而內建函數位於一個隱性的命名空間內,python自動搜尋程式的變數名。這個命名空間對應於python3.0中名為builtins的模組(python2.6中是__builtin__)。
三:小數類型:
a)小數數字:小數是通過一個匯入的模組調用函數後建立的,而不是通過允許常量運算式建立的。從功能 上來說,小數對象就像浮點數,只不過它們有固定的位元和小數點,因此小數是有固定的精度的浮點數。小數類型對錶現固定精度的特徵(例如,錢的總和)以及對實現更好的數字精度是一個理想的工具。我們能夠通過調用在decimal模組中的Decimal的建構函式產檢一個小數對象,並傳入一個字串。這個字串有我們希望在結果中顯示的小數位元。當精讀不同時,python自動升級為小數最多的:
>>>0.1 + 0.1 + 0.1 - 0.3 #浮點數缺乏精確性5.5511151231257827e-17>>>print(0.1 + 0.1 + 0.1 - 0.3) #使用print仍舊不能解決問題5.55111512313e-17>>>>>>>>>from decimal import Decimal #可以使用小數運算來解決>>>Decimal(‘0.1‘) + Decimal(‘0.1‘) + Decimal(‘0.1‘) - Decimal(‘0.3‘) #結果為一位小數Decimal(‘0.0‘)
在python3.1中,將能夠從一個浮點對象建立一個小數對象,通過 decimal.Decimal.from_float(1.25)形式的調用。這一轉換時精確的,但有時候會產生較多的位元。
b)設定全域精度:decimal模組中的其他工具可以用來設定所有小數數值的精度、設定錯誤處理等。例如,這個模組中的一個內容物件允許指定精度(小數位元)和舍入模式(捨去、進位等)。該精度全域性地適用於調用線程中建立的所有小數:
>>> from decimal import Decimal>>>Decimal(‘1‘) / Decimal(‘7‘)Decimal(‘0.1428571428571428571428571429‘)>>> import decimal>>>decimal.getcontext().prec = 4>>> Decimal(‘1‘) / Decimal(‘7‘)Decimal(‘0.1429‘)
c)小數上下文管理器:可使用上下文管理器語句來重新設定臨時精度。在語句退出後,精度又設定為初始值:
>>> import decimal>>> decimal.Decimal(‘1.00‘) / decimal.Decimal(‘3.00‘)Decimal(‘0.333333333333333333333‘)>>>>>>with decimal.localcontext() as ctx:… ctx.prec = 2… decimal.Decimal(‘1.00‘) / decimal.Decimal(‘3.00‘) … Decimal(‘0.33‘)>>>>>> decimal.Decimal(‘1.00‘) / decimal.Decimal(‘3.00‘)Decimal(‘0.333333333333333333333‘)
四:分數類型:
a)分數的建立:1,分數以類似於小數的方式使用,它也存在於模組中;匯入其建構函式並傳遞一個分子和一個分母就可以產生一個分數。
2,分數對象也可以從浮點數字串來建立,這和小數很相似。
>>>from fractions import Fraction #用建構函式建立分數對象>>>x = Fraction(1,3) #Numerator,denominator>>>y = Fraction(4,6)>>>from fractions import Fraction #用浮點數字串建立分數對象>>>Fraction(‘.25‘)Fraction(1,4)>>>Fraction(‘1.25‘)Fraction(5,4)
b)數值精度:實際上,分數保持精確性,並且自動化簡結果。
>>>from fractions import Fraction #分數自動化簡>>>Fraction(6,12)Fraction(1,2)
c)轉換和混合類型:為了支援分數轉換,浮點數對象現在有一個方法(float.as_integer_ratio()),能夠產生它們的分子和分母比,分數有一個from_float方法,並且float接受一個Fraction作為參數。(測試中 *是一個特殊的文法,它把一個元祖擴充到單個的參數中 )
>>> (2.5).as_integer_ratio() #float object method(5,2)>>>>>>f = 2.5>>>z = Fraction(*(f.as_integer_ratio())) #Convert float ->fraction: two args>>>zFraction(5,2)>>>>>>Fraction.from_float(1.75)Fraction(7,4)>>>>>>Fraction(*(1.75).as_integer_ratio()) #Convert float ->fraction:other wayFraction(7,4)
混合類型: Fraction + int ->Fraction
Fraction + float -> float
Fraction + Fraction ->Fraction
warning:儘管可以把浮點數轉換成分數,在某些情況下,這麼做的時候會有不可避免的精度損失,因為這個數字在其最初的浮點形式下是不精確的。當需要的時候,我們可以通過限制最大分母值來簡化這樣的結果(fraction.limit_denominator(N),其中N為分母的最大值):
>>>4.0 / 3>>>1.3333333333333>>>x = (4.0 /3).as_integer_ratio() #Precision loss from float to fraction>>>x(6004799503160661, 4503599627370496)>>>>>>a = Fraction(*(4.0 /3).as_integer_ratio())>>>aFraction(6004799503160661, 4503599627370496)>>>>>>a.limit_denominator(10)Fraction(5,3)
五:集合
集合(set)是一種新的類型,這是一些唯一的、不可變的對象的一個無序集合(collection)。根據定義,一個項在集合中只出現一次,不管它添加了多少次。集合是可以迭代的,可以根據需要增長或縮短,並且能夠包含各種物件類型。
a)集合的建立:要建立一個集合對象,向內建的set()函數傳遞一個序列或其他的可迭代的對象;集合并不包含位置資訊,是一組無序集合,集合通過運算式操作符支援一般的數學集合運算。warning:不能在一般序列上應用這些運算式,必須通過序列建立集合後才能使用這些工具。
b)集合的操作符:‘in‘(Membership), ‘-‘ (Difference), ‘|‘ (Union), ‘&‘ (Intersection),‘^‘ (XOR),‘>‘ (Superset), ‘<‘ (Subset)...
c)集合的操作方法:add()(插入一個項目),updata()(按位置求並集),remove()(根據值刪除一個項目) Notice:在任何集合執行個體或集合類型名上允許dir來查看所有可用的方法。
d)作為可迭代的容器,集合也可以用於len、for迴圈和列表解析這樣的操作中,然而,由於它們是無序的,所有不支援像索引和分區這樣的操作。
e)儘管前面介紹的集合運算式通常需要兩個集合,它們基於方法的對應形式往往對任何可迭代類型也有效。Notice:可用isinstance(object,Iterable)來判斷object是不是一個可迭代的對象。
>>>x = set(‘abcde‘) #以下測試均在python2.6 中運行>>>y = set(‘bdxyz‘) #python2.6中建立集合>>>xset([‘a‘,‘b‘,‘c‘,‘d‘,‘e‘])>>>>>>‘e‘ in x #運算子測試True>>>z = x.intersection(y) #x & y #方法測試>>>zset([‘b‘,‘d‘])>>>z.add(‘spam‘)>>>zset([‘b‘,‘d‘,‘spam‘])>>>z.update(set([‘X‘,‘Y‘])) #in-place union>>>zset([‘b‘,‘d‘,‘spam‘,‘X‘,‘Y‘])>>>z.remove(‘b‘)>>>zset([‘d‘,‘spam‘,‘X‘,‘Y‘])>>>>>>>>>s = set([1,2,3])>>>s.union([3,4]) #集合的方法可以用到任何可迭代類型的對象,list類型是可迭代對象set([1,2,3,4])>>>s.intersection((1,3,5)) #元組是可迭代對象set([1,3])s.issubset(range(-5,5)) #判斷s集合的元素範圍是不是在[-5,5]之間True
六:python 3.0中的集合常量
a)在python3.0 中,set([1,2,3,4]) 和{1,2,3,4}是等價的,前面一個是2.6版本的集合形式,後面一個是3.0版本的集合形式。不管如何建立集合,3.0版本都使用新的常量格式來顯示它。但是在3.0版本中要建立空的集合或從已有的可迭代對象構建集合,還是需要內建的set函數。
warning:不可變限制:集合只能包含不可變的(即可散列的)物件類型。因此,列表和字典不能嵌入到集合中,但是,如果你需要儲存複合值的話,元組是可以嵌入的。
集合本身也是不可變的,因此,不能直接嵌入到其它集合中;如果需要在另一個集合中儲存一個集合,可以像調用set一樣來調用frozenset,但是,它建立一個不可變的集合,該集合不可修改並且可以嵌套到其它集合中。
>>>s = {1}>>>s.add([2,3])TypeError: unhashable type: ‘list‘>>>s.add({‘a‘ : 1})TypeError: unhashable type: ‘dict‘>>>s.add((2,3))>>>s{1,(2,3)} #No list or dict,but tuple okay>>>>>>s = frozenset([1,2]) #集合中嵌入集合的方法>>>z = set([3,4])>>>z.add(s)>>>z{frozenset({1, 2}), 3, 4}
七:python 3.0中的集合解析:
除了常量,python 3.0 還引入了一個集合解析構造,類似於介紹過的列表解析的形式,但是,編寫在花括弧中而不是方括弧中,並且作用於集合而不是列表。結果是通過運行代碼建立的一個新的集合。
>>>{x ** 2 for x in [1,2,3,4]} #集合解析{16,1,4,9}
View Code
八:為什麼使用集合?
由於項在集合中只能儲存一次,集合(set)可以用來把重複項從其它集合(collection)中過濾掉。即可以把一個列表中的重複項過濾掉。
>>>L = [1,2,3,1,2,4,5] #過濾掉列表L中的重複元素>>>set(L){1,2,3,4,5}>>>L = list(set(L))>>>L[1,2,3,4,5]
九:布爾型
python 如今正式有了一種明確的布爾型資料類型,叫做bool ,其值為True 和 False ,並且其值True和False 是預先定義的內建的變數名。在內部,僅僅是內建的整數類型 int 的一個子類(以物件導向的觀點看),其行為和整數1和0是一樣的,但它們有特定的顯示邏輯:它們是作為關鍵字True和False 來顯示的,而不是數字1和0(技術上:bool 為它的兩個對象重新定義了str和repr 的字串格式)。此外,布爾值讓真值更精確。eg: 一個無限迴圈現在能編寫成 while True: 而不是 while 1:。類似地,通過使用 flag = False ,可以更清楚地設定標誌位。
三:python 物件類型詳解一:數字(下)