日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

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

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

創(chuàng)新互聯(lián)建站專注為客戶提供全方位的互聯(lián)網綜合服務,包含不限于成都做網站、網站設計、西安網絡推廣、小程序開發(fā)、西安網絡營銷、西安企業(yè)策劃、西安品牌公關、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)建站為所有大學生創(chuàng)業(yè)者提供西安建站搭建服務,24小時服務熱線:13518219792,官方網址: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的***版本為我們帶來了討人喜歡的格式字段的自動填數功能。我們知道,許多程序中經常需要格式化字符串。Python 2.x版本使用的是類似[s]printf函數的百分號操作符,如下所示:

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

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

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

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

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

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

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

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

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

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

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

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

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

三、Maketrans函數

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

下面的例子演示了如何使用maketrans()和translate()函數處理字節(jié)對象。需要注意的是,用于字節(jié)的轉換表具有256個表項(每一項對應于一個可能的字節(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' 

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

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

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

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

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

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

四、與數學有關的變化

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

3.1版本在與數學有關的方面也有所改變。

Int添加了一個bit_length方法

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

'0b10011'浮點數的舍入

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

 
 
 
  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中,只要輸入的數字是一個整數(即使它是用浮點數的形式表示的,例如1000.0),那么它總是返回一個整型數:

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

1000浮點數的表示

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

>>> 0.6

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

>>> 0.6

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

 
 
 
  1. >>> x = 0.0 
  2. >>> while x != 1.0:  
  3. ... print(repr(x))  
  4. ... x += 0.1輸出的結果:  
  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()函數返回的是實際表示;而在Python 3.1中,它返回的是簡潔表示。無論是在Python 3.0還是在Python 3.1中,print()函數顯示的都是簡潔表示:

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

0.1Python語言還有一個稱為decimal的模塊,可用于精確的實數表示。它使用一個不同的表示方案來表示浮點數,并且在內存運行的情況下,用盡量多的數位來表示一個實數——并且,當進行算術的時候不會出現(xiàn)舍入誤差。在Python 3.0中,Decimal類型使用了一種新方法來從一個字符串初始化它表示的值;在Python 3.1中,又增加了另一個新方法即from_float()來接收浮點數。注意,即使當使用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版本,該語句已經能夠支持更多的資源。最常見的情形是,它可以打開輸入、輸出文件并在處理完成后關閉它們。在Python 3.0中,我們要么使用嵌套的with語句,要么顯式閉合在文件中。下面是一個Python 3.0的例子,它打開了一個輸入文件,將其內容作為字符串讀取,用字符串的title()方法處理內容,并將結果寫到一個輸出文件中。
這個示例中含有兩個嵌套的with語句,注意嵌套的with語句中的***一行。當代碼試圖讀取out.txt的時候,結果為空,因為此文件是被緩沖處理的,并且還沒有寫入。當此with語句完成的時候,Python會關閉此文件,所以***一行代碼會認定out.txt的內容的確是大寫文字。

 
 
 
  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語句,是不是感覺有點頭疼,呵呵。接下來,我們要打開兩個兩個文件,并在處理完成后關閉它們(如果您需要打開三個文件,那么就需要三個嵌套的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é)的內容,并顯示其尺寸。這里還有用到一些額外的Python 3特性,比如帶有命名屬性的統(tǒng)計結果和高級字符串格式化。

 
 
 
  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)))輸出的結果:  
  10. The size of the .gz file is 43 bytes  
  11. The size of the .bz2 file is 45 bytes 

六、小結

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的基礎特性
  2. Ruby和Python的語法比較
  3. Ruby使用心得匯總:尋找高效的實現(xiàn)
  4. 對話Python之父:Python的成功之路
  5. Python:你所需要的***種也是***一種語言

新聞名稱:分析Python 3.1核心語言的變化
標題來源:http://m.5511xx.com/article/dpspeig.html