日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
分析Python 3.1核心語言的變化

這里我們將對Python 3.1核心語言的變化進行分析,包括字符串的格式化、說明符以及其他方面的內(nèi)容。希望這些變化能對大家了解Python 3.1有所幫助。

創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、網(wǎng)站設(shè)計、西安網(wǎng)絡(luò)推廣、小程序開發(fā)、西安網(wǎng)絡(luò)營銷、西安企業(yè)策劃、西安品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供西安建站搭建服務(wù),24小時服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com

Python 3.0發(fā)布七個月之后,Python核心開發(fā)人員于2009年6月27日發(fā)布了新的Python 3.1版本。雖然此3.1版本只是對Python 3.0的一次小型升級,但是它不僅為開發(fā)者帶來許多讓人感興趣的特性,同時在性能方面也有所改善。本文將為讀者詳細介紹Python 3.1版本在核心語言、標準程序庫和性能改善方面的變化。

一、字符串的格式化

Python的***版本為我們帶來了討人喜歡的格式字段的自動填數(shù)功能。我們知道,許多程序中經(jīng)常需要格式化字符串。Python 2.x版本使用的是類似[s]printf函數(shù)的百分號操作符,如下所示:

 
 
 
  1. >>> '%s, %s!' % ('Hello', 'World') 

'Hello, World!'而Python 3.0則添加了更高級的字符串格式化功能,如下所示:

 
 
 
  1. >>> '{0}, {1}!'.format('Hello', 'World') 

'Hello, World!'如今,Python 3.1則在字符串格式化方面又有了新的改進。對于Python 3.0來說,每當(dāng)您想在格式串中引用位置參數(shù)時,您必須給出每個位置參數(shù)的索引。但是在Python 3.1中,您就可以將這些索引拋在腦后了,因為Python會依次替您填充這些參數(shù):

 
 
 
  1. >>> '{}, {}!'.format('Hello', 'World')  
  2. 'Hello, World!' 

二、PEP-378:用于千位分隔符的格式說明符

在財務(wù)應(yīng)用程序中,通常要在數(shù)字中使用千位分隔符。從事金融或者財會方面工作的人士是不這樣寫的“您欠我$12345678”,而是“您欠我$12,345,678”,他們慣于使用逗號作為分隔符。那么,如何使用Python達到這種效果呢:

 
 
 
  1. >>> format(12345678, ',') 

'12,345,678'您可以利用其他區(qū)分符對數(shù)字進行分組。這里的寬度說明符(這里為8)包括了逗號和小數(shù)點:

 
 
 
  1. >>> format(1234, ',').replace(',', '_') 

'12,345.7'逗號通常作為默認的分隔字符,如果要使用其他字符作為分隔字符的話,只需通過replace函數(shù)用您喜歡的字符替換逗號即可,具體如下所示:

 
 
 
  1. >>> format(1234, ',').replace(',', '_') 

'1_234'當(dāng)然,您還可以使用format函數(shù)來作為字符串方法:
>>> '{0:8,.1f}'.format(123.456)

三、Maketrans函數(shù)

利用maketrans()和translate()函數(shù),我們可以使用一組字符來替換另一組字符。使用這一替換功能時,多少有點繁瑣,因為它要求使用maketrans()函數(shù)(該函數(shù)的作用是把輸入字符映射到輸出字符)建立一個轉(zhuǎn)換表,然后,再把這個轉(zhuǎn)換表傳遞給translate()函數(shù)。當(dāng)然,string模塊仍然有它自己的maketrans()函數(shù),不過Python 3.1不贊成使用它,而是贊賞使用單獨的maketrans()函數(shù)來操作字節(jié)、字節(jié)數(shù)組和字符串。

下面的例子演示了如何使用maketrans()和translate()函數(shù)處理字節(jié)對象。需要注意的是,用于字節(jié)的轉(zhuǎn)換表具有256個表項(每一項對應(yīng)于一個可能的字節(jié)),并且這個例子把大部分字節(jié)都映射到它們自身,只有1,2和3例外,因為它們分別映射到了4,5和6。如下所示:

 
 
 
  1. >>> tt = bytes.maketrans(b'123', b'456')  
  2. >>> len(tt)  
  3. 256 
  4. >>> tt  
  5. b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\  
  6. t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\  
  7. x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\  
  8. x1e\x1f !"#$%&\'()*+,-./0456456789:;<=>  
  9. ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcd  
  10. efghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\  
  11. x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\  
  12. x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\  
  13. x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\  
  14. xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\  
  15. xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\  
  16. xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\  
  17. xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\  
  18. xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\  
  19. xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\  
  20. xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\  
  21. xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\  
  22. xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\  
  23. xfa\xfb\xfc\xfd\xfe\xff' 

建好轉(zhuǎn)換表之后,我們只需把它傳遞給translate()函數(shù)即可,如下所示:

 
 
 
  1. >>> b'123456'.translate(tt) 

b'456456'我們還可以傳遞其它的參數(shù)作為要刪除的字符:

 
 
 
  1. >>> b'123456'.translate(tt, b'5') 

b'45646'我們可以看到,原來的5已經(jīng)從123456從刪掉了,但是轉(zhuǎn)換得到的5(請記住,我們的映射表將2轉(zhuǎn)化為5)并沒有刪除。這說明,系統(tǒng)是先從原來的字符串中刪除相應(yīng)的字符,然后才進行的轉(zhuǎn)換操作。
字符串的轉(zhuǎn)換稍微有些不同,字符串版本的maketrans函數(shù)返回的是一個字典:

 
 
 
  1. >>> tt = str.maketrans('123', '456')  
  2. {49: 52, 50: 53, 51: 54}  
  3. >>> '123456'.translate(tt)  
  4. '456456' 

四、與數(shù)學(xué)有關(guān)的變化

 
 
 
  1. >>> int.bit_length(19)  
  2. >>> bin(19) 

3.1版本在與數(shù)學(xué)有關(guān)的方面也有所改變。

Int添加了一個bit_length方法

新版本中,int變量具有一個bit_length方法,它能返回該int變量以二進制數(shù)表示的時候的位數(shù)。例如,數(shù)字19的二進制表示為10011,那么它的位數(shù)就是5:

'0b10011'浮點數(shù)的舍入

在Python 3.0以及早先的round()函數(shù)有點反復(fù)無常:如果您不指定精度的時候,它返回的是一個整數(shù);如果指定精度的話,它返回的是您輸入數(shù)據(jù)的類型:

 
 
 
  1. >>> round(1000)  
  2. 1000 
  3. >>> round(1000.0)  
  4. 1000 
  5. >>> round(1000, 2)  
  6. 1000 
  7. >>> round(1000.0, 2)  

1000.0在Python 3.1中,只要輸入的數(shù)字是一個整數(shù)(即使它是用浮點數(shù)的形式表示的,例如1000.0),那么它總是返回一個整型數(shù):

 
 
 
  1. >>> round(1000)  
  2. 1000 
  3. >>> round(1000.0)  
  4. 1000 
  5. >>> round(1000, 2)  
  6. 1000 
  7. >>> round(1000.0, 2) 

1000浮點數(shù)的表示

目前,實數(shù)在大部分的硬件和操作系統(tǒng)中都是用32位(單精度)或者64位(雙精度)來表示的。然而,這會導(dǎo)致一些實數(shù)無法精確表示。由于計算機存儲器的二進制特性,某些數(shù)字利用十進制表示形式非常簡潔,但是要是使用浮點方案表示的話,就要復(fù)雜了。舉例來說,利用32位的單精度浮點數(shù)表示數(shù)字0.6,則為0.59999999999999998:

>>> 0.6

0.59999999999999998對于這種表示方案,上面的數(shù)字是為了做到盡可能的精確,但是對用戶來說卻很不友好。 Python 3.1使用了一個新算法,以便使得原值的表示盡可能得簡練。所以在Python 3.1中,人們輸入上面的數(shù)字,一個更簡潔的表示:

>>> 0.6

0.6這已經(jīng)很精確了,除非遇到算術(shù)運算。舉例來說,表達式0.7+0.1的值用32位浮點表示法表示的話,它是 0.79999999999999993,而數(shù)字0.8的值用32位浮點數(shù)表示則是 0.80000000000000004。 這樣一來,就意味著0.7+0.1并不等于0.8,這會導(dǎo)致一些問題。例如,下面的循環(huán)將永不休止:

 
 
 
  1. >>> x = 0.0 
  2. >>> while x != 1.0:  
  3. ... print(repr(x))  
  4. ... x += 0.1輸出的結(jié)果:  
  5. 0.10000000000000001 
  6. 0.20000000000000001 
  7. 0.30000000000000004 
  8. 0.40000000000000002 
  9. 0.5 
  10. 0.59999999999999998 
  11. 0.69999999999999996 
  12. 0.79999999999999993 
  13. 0.89999999999999991 
  14. 0.99999999999999989 
  15. 1.0999999999999999 
  16. 1.2 
  17. 1.3 
  18. 1.4000000000000001 
  19. 1.5000000000000002 
  20. 1.6000000000000003 

...在Python 3.0中,repr()函數(shù)返回的是實際表示;而在Python 3.1中,它返回的是簡潔表示。無論是在Python 3.0還是在Python 3.1中,print()函數(shù)顯示的都是簡潔表示:

 
 
 
  1. >>> print(0.1)  
  2. 0.1  
  3. >>> print(0.10000000000000001) 

0.1Python語言還有一個稱為decimal的模塊,可用于精確的實數(shù)表示。它使用一個不同的表示方案來表示浮點數(shù),并且在內(nèi)存運行的情況下,用盡量多的數(shù)位來表示一個實數(shù)——并且,當(dāng)進行算術(shù)的時候不會出現(xiàn)舍入誤差。在Python 3.0中,Decimal類型使用了一種新方法來從一個字符串初始化它表示的值;在Python 3.1中,又增加了另一個新方法即from_float()來接收浮點數(shù)。注意,即使當(dāng)使用from_float()的時候,Decimal模塊也會比32位更精確。

 
 
 
  1. >>> from decimal import Decimal  
  2. >>> Decimal.from_float(0.1)  
  3. Decimal('0.1000000000000000055511151231257827021181583404541015625')  

五、改進的WITH語句

在Python 2.5中,WITH語句是作為一個__future__特性引入的,該語句的正式引入實際上是從Python 3.0開始的。到了Python 3.1版本,該語句已經(jīng)能夠支持更多的資源。最常見的情形是,它可以打開輸入、輸出文件并在處理完成后關(guān)閉它們。在Python 3.0中,我們要么使用嵌套的with語句,要么顯式閉合在文件中。下面是一個Python 3.0的例子,它打開了一個輸入文件,將其內(nèi)容作為字符串讀取,用字符串的title()方法處理內(nèi)容,并將結(jié)果寫到一個輸出文件中。
這個示例中含有兩個嵌套的with語句,注意嵌套的with語句中的***一行。當(dāng)代碼試圖讀取out.txt的時候,結(jié)果為空,因為此文件是被緩沖處理的,并且還沒有寫入。當(dāng)此with語句完成的時候,Python會關(guān)閉此文件,所以***一行代碼會認定out.txt的內(nèi)容的確是大寫文字。

 
 
 
  1. open('in.txt', 'w').write('abc def')  
  2. with open('in.txt') as in_file:  
  3. with open('out.txt', 'w') as out_file:  
  4. text = in_file.read()  
  5. assert text == 'abc def' 
  6. text = text.title()  
  7. assert text == 'Abc Def' 
  8. out_file.write(text)  
  9. assert open('out.txt').read() == '' 

assert open('out.txt').read() == 'Abc Def'看到嵌套的with語句,是不是感覺有點頭疼,呵呵。接下來,我們要打開兩個兩個文件,并在處理完成后關(guān)閉它們(如果您需要打開三個文件,那么就需要三個嵌套的with語句)。 Python 3.1運行您使用單個WITH語句打開所有文件:

 
 
 
  1. open('in.txt', 'w').write('abc def')  
  2. with open('in.txt') as in_file:  
  3. with open('out.txt', 'w') as out_file:  
  4. text = in_file.read()  
  5. assert text == 'abc def' 
  6. text = text.title()  
  7. assert text == 'Abc Def' 
  8. out_file.write(text)  
  9. assert open('out.txt').read() == '' 
  10. assert open('out.txt').read() == 'Abc Def' 

Python 3.1的另一項改進就是,gzip.GzipFile和bz2.BZ2File現(xiàn)在也能用于WITH語句。我們知道,這些都是壓縮后的文件格式。下面的示例代碼將使用gzip文件和bz2文件來存儲5000個字節(jié)的內(nèi)容,并顯示其尺寸。這里還有用到一些額外的Python 3特性,比如帶有命名屬性的統(tǒng)計結(jié)果和高級字符串格式化。

 
 
 
  1. from bz2 import BZ2File  
  2. from gzip import GzipFile  
  3. import os  
  4. with GzipFile('1.gz', 'wb') as g, BZ2File('1.bz2', 'wb') as b:  
  5. g.write(b'X' * 5000)  
  6. b.write(b'X' * 5000)  
  7. for ext in ('.gz', '.bz2'):  
  8. filename = '1' + ext  
  9. print ('The size of the {0} file is {1.st_size} bytes'.format(ext, os.stat(filename)))輸出的結(jié)果:  
  10. The size of the .gz file is 43 bytes  
  11. The size of the .bz2 file is 45 bytes 

六、小結(jié)

Python 3.0發(fā)布七個月之后,Python核心開發(fā)人員于2009年6月27日發(fā)布了新的Python 3.1版本。雖然此3.1版本只是對Python 3.0的一次小型升級,但是它不僅為開發(fā)者帶來許多讓人感興趣的特性,同時在性能方面也有所改善。本文為讀者詳細介紹了Python 3.1版本在核心語言方面的變化,在接下來的文章中,我們將繼續(xù)為讀者介紹新版本中標準程序庫和性能改善方面的變化。

【編輯推薦】

  1. PHP老手談PHP和Python的基礎(chǔ)特性
  2. Ruby和Python的語法比較
  3. Ruby使用心得匯總:尋找高效的實現(xiàn)
  4. 對話Python之父:Python的成功之路
  5. Python:你所需要的***種也是***一種語言

本文名稱:分析Python 3.1核心語言的變化
URL鏈接:http://www.dlmjj.cn/article/dpspeig.html