成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

分析Python 3.1核心語言的變化

開發(fā) 后端
我們這里將分析Python 3.1核心語言的變化,對這一版本的變化究竟在哪里,本文為大家揭開面紗。

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

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

一、字符串的格式化

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則在字符串格式化方面又有了新的改進(jìn)。對于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達(dá)到這種效果呢:

  1. >>> format(12345678','

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

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

'12,345.7'逗號通常作為默認(rèn)的分隔字符,如果要使用其他字符作為分隔字符的話,只需通過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)的字符,然后才進(jìn)行的轉(zhuǎn)換操作。
字符串的轉(zhuǎn)換稍微有些不同,字符串版本的maketrans函數(shù)返回的是一個字典:

  1. >>> tt = str.maketrans('123''456')  
  2. {495250535154}  
  3. >>> '123456'.translate(tt)  
  4. '456456' 

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

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

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

Int添加了一個bit_length方法

新版本中,int變量具有一個bit_length方法,它能返回該int變量以二進(jìn)制數(shù)表示的時候的位數(shù)。例如,數(shù)字19的二進(jìn)制表示為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(10002)  
  6. 1000 
  7. >>> round(1000.02)  

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

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

1000浮點數(shù)的表示

目前,實數(shù)在大部分的硬件和操作系統(tǒng)中都是用32位(單精度)或者64位(雙精度)來表示的。然而,這會導(dǎo)致一些實數(shù)無法精確表示。由于計算機存儲器的二進(jìn)制特性,某些數(shù)字利用十進(jìn)制表示形式非常簡潔,但是要是使用浮點方案表示的話,就要復(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ù)運算。舉例來說,表達(dá)式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 
  6. 0.10000000000000001 
  7. 0.20000000000000001 
  8. 0.30000000000000004 
  9. 0.40000000000000002 
  10. 0.5 
  11. 0.59999999999999998 
  12. 0.69999999999999996 
  13. 0.79999999999999993 
  14. 0.89999999999999991 
  15. 0.99999999999999989 
  16. 1.0999999999999999 
  17. 1.2 
  18. 1.3 
  19. 1.4000000000000001 
  20. 1.5000000000000002 
  21. 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)進(jìn)行算術(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')  

五、改進(jìn)的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)閉此文件,所以***一行代碼會認(rè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的另一項改進(jìn)就是,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ā)者帶來許多讓人感興趣的特性,同時在性能方面也有所改善。本文為讀者詳細(xì)介紹了Python 3.1版本在核心語言方面的變化,在接下來的文章中,我們將繼續(xù)為讀者介紹新版本中標(biāo)準(zhǔn)程序庫和性能改善方面的變化。

【編輯推薦】

  1. PHP老手談PHP和Python的基礎(chǔ)特性
  2. Ruby和Python的語法比較
  3. Ruby使用心得匯總:尋找高效的實現(xiàn)
  4. 對話Python之父:Python的成功之路
  5. Python:你所需要的***種也是***一種語言
責(zé)任編輯:彭凡 來源: IT168
相關(guān)推薦

2020-08-02 19:55:46

Python編程語言技術(shù)

2022-09-21 13:53:15

C++移動語義

2022-07-14 16:35:11

C語言編程語言

2023-12-08 08:38:15

升級工具.NET Core.NET 8

2024-09-09 14:57:31

2025-04-27 08:35:00

Python數(shù)據(jù)分析編程

2024-12-04 10:19:49

2015-08-11 15:52:52

大數(shù)據(jù)數(shù)據(jù)分析

2009-07-23 09:42:44

EJB 3.1Java EE 6

2019-09-26 09:42:44

Go語言JavaPython

2023-12-06 07:16:31

Go語言語句

2010-01-25 18:05:40

C++語言

2011-05-27 14:36:06

Android 論探 設(shè)計意圖

2009-11-06 13:33:56

WCF Dispatc

2009-11-19 14:19:45

核心路由器

2017-12-21 08:58:52

2013-03-01 10:46:50

大數(shù)據(jù)核心海量數(shù)據(jù)

2010-02-24 17:38:45

Python 3.1版

2018-03-28 14:10:10

GoPython代碼

2014-01-14 11:17:55

華為核心交換機核心交換機華為
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 在线国产99 | 91大神xh98xh系列全部 | 欧美在线观看一区 | 欧美一区二区三 | 午夜精品久久久 | 国产精品久久久久久久久久久久午夜片 | 精品国产成人 | 亚洲人在线播放 | 欧美黄色小视频 | 久久伊人在 | 亚洲交性 | 欧美激情在线精品一区二区三区 | 性高湖久久久久久久久aaaaa | 日本成年免费网站 | 久久久久久久一区 | 999热精品 | 激情国产| 毛片一级黄色 | 国产福利在线 | 色天天综合 | 久久精品国产亚洲一区二区三区 | 午夜精品福利视频 | 欧美性吧| 在线久草| 日本精品一区二区 | 国产成人精品一区二区三区四区 | 97视频免费 | 欧美中文字幕在线观看 | 亚洲电影第1页 | 成人免费视频 | 欧美成人在线免费 | 成人免费一区二区三区牛牛 | 国产伦精品一区二区三区照片91 | 亚洲激情在线观看 | aaaaaaa片毛片免费观看 | 国产精品欧美一区二区三区不卡 | 久久精品免费看 | 欧美激情精品久久久久久免费 | 一区二区三区中文字幕 | 亚洲一区 | 久操av在线 |