自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

分析Python 3.1核心語(yǔ)言的變化

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

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

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

一、字符串的格式化

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

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

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

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

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

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

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

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

  1. >>> format(12345678','

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

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

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

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

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

三、Maketrans函數(shù)

利用maketrans()和translate()函數(shù),我們可以使用一組字符來(lái)替換另一組字符。使用這一替換功能時(shí),多少有點(diǎn)繁瑣,因?yàn)樗笫褂胢aketrans()函數(shù)(該函數(shù)的作用是把輸入字符映射到輸出字符)建立一個(gè)轉(zhuǎn)換表,然后,再把這個(gè)轉(zhuǎn)換表傳遞給translate()函數(shù)。當(dāng)然,string模塊仍然有它自己的maketrans()函數(shù),不過(guò)Python 3.1不贊成使用它,而是贊賞使用單獨(dú)的maketrans()函數(shù)來(lái)操作字節(jié)、字節(jié)數(shù)組和字符串。

下面的例子演示了如何使用maketrans()和translate()函數(shù)處理字節(jié)對(duì)象。需要注意的是,用于字節(jié)的轉(zhuǎn)換表具有256個(gè)表項(xiàng)(每一項(xiàng)對(duì)應(yīng)于一個(gè)可能的字節(jié)),并且這個(gè)例子把大部分字節(jié)都映射到它們自身,只有1,2和3例外,因?yàn)樗鼈兎謩e映射到了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ù)作為要?jiǎng)h除的字符:

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

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

  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添加了一個(gè)bit_length方法

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

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

在Python 3.0以及早先的round()函數(shù)有點(diǎn)反復(fù)無(wú)常:如果您不指定精度的時(shí)候,它返回的是一個(gè)整數(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ù)字是一個(gè)整數(shù)(即使它是用浮點(diǎn)數(shù)的形式表示的,例如1000.0),那么它總是返回一個(gè)整型數(shù):

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

1000浮點(diǎn)數(shù)的表示

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

>>> 0.6

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

>>> 0.6

0.6這已經(jīng)很精確了,除非遇到算術(shù)運(yùn)算。舉例來(lái)說(shuō),表達(dá)式0.7+0.1的值用32位浮點(diǎn)表示法表示的話,它是 0.79999999999999993,而數(shù)字0.8的值用32位浮點(diǎn)數(shù)表示則是 0.80000000000000004。 這樣一來(lái),就意味著0.7+0.1并不等于0.8,這會(huì)導(dǎo)致一些問(wèn)題。例如,下面的循環(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ù)返回的是實(shí)際表示;而在Python 3.1中,它返回的是簡(jiǎn)潔表示。無(wú)論是在Python 3.0還是在Python 3.1中,print()函數(shù)顯示的都是簡(jiǎn)潔表示:

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

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

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

五、改進(jìn)的WITH語(yǔ)句

在Python 2.5中,WITH語(yǔ)句是作為一個(gè)__future__特性引入的,該語(yǔ)句的正式引入實(shí)際上是從Python 3.0開(kāi)始的。到了Python 3.1版本,該語(yǔ)句已經(jīng)能夠支持更多的資源。最常見(jiàn)的情形是,它可以打開(kāi)輸入、輸出文件并在處理完成后關(guān)閉它們。在Python 3.0中,我們要么使用嵌套的with語(yǔ)句,要么顯式閉合在文件中。下面是一個(gè)Python 3.0的例子,它打開(kāi)了一個(gè)輸入文件,將其內(nèi)容作為字符串讀取,用字符串的title()方法處理內(nèi)容,并將結(jié)果寫到一個(gè)輸出文件中。
這個(gè)示例中含有兩個(gè)嵌套的with語(yǔ)句,注意嵌套的with語(yǔ)句中的***一行。當(dāng)代碼試圖讀取out.txt的時(shí)候,結(jié)果為空,因?yàn)榇宋募潜痪彌_處理的,并且還沒(méi)有寫入。當(dāng)此with語(yǔ)句完成的時(shí)候,Python會(huì)關(guān)閉此文件,所以***一行代碼會(huì)認(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語(yǔ)句,是不是感覺(jué)有點(diǎn)頭疼,呵呵。接下來(lái),我們要打開(kāi)兩個(gè)兩個(gè)文件,并在處理完成后關(guān)閉它們(如果您需要打開(kāi)三個(gè)文件,那么就需要三個(gè)嵌套的with語(yǔ)句)。 Python 3.1運(yùn)行您使用單個(gè)WITH語(yǔ)句打開(kā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() == '' 
  10. assert open('out.txt').read() == 'Abc Def' 

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

  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ā)布七個(gè)月之后,Python核心開(kāi)發(fā)人員于2009年6月27日發(fā)布了新的Python 3.1版本。雖然此3.1版本只是對(duì)Python 3.0的一次小型升級(jí),但是它不僅為開(kāi)發(fā)者帶來(lái)許多讓人感興趣的特性,同時(shí)在性能方面也有所改善。本文為讀者詳細(xì)介紹了Python 3.1版本在核心語(yǔ)言方面的變化,在接下來(lái)的文章中,我們將繼續(xù)為讀者介紹新版本中標(biāo)準(zhǔn)程序庫(kù)和性能改善方面的變化。

【編輯推薦】

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

2020-08-02 19:55:46

Python編程語(yǔ)言技術(shù)

2022-09-21 13:53:15

C++移動(dòng)語(yǔ)義

2022-07-14 16:35:11

C語(yǔ)言編程語(yǔ)言

2024-09-09 14:57:31

2023-12-08 08:38:15

升級(jí)工具.NET Core.NET 8

2025-04-27 08:35:00

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

2024-12-04 10:19:49

2019-09-26 09:42:44

Go語(yǔ)言JavaPython

2009-07-23 09:42:44

EJB 3.1Java EE 6

2015-08-11 15:52:52

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

2010-01-25 18:05:40

C++語(yǔ)言

2023-12-06 07:16:31

Go語(yǔ)言語(yǔ)句

2018-03-28 14:10:10

GoPython代碼

2011-05-27 14:36:06

Android 論探 設(shè)計(jì)意圖

2017-12-21 08:58:52

2009-11-19 14:19:45

核心路由器

2010-02-24 17:38:45

Python 3.1版

2009-11-06 13:33:56

WCF Dispatc

2013-03-01 10:46:50

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

2014-01-14 11:17:55

華為核心交換機(jī)核心交換機(jī)華為
點(diǎn)贊
收藏

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