一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - 詳解Python3.1版本帶來的核心變化

詳解Python3.1版本帶來的核心變化

2020-05-30 23:47腳本之家 Python

這篇文章主要介紹了詳解Python3.1版本帶來的核心變化,Python3.1的版本升級(jí)在3.0的基礎(chǔ)上帶來了更多影響以后版本的變化,本文分析了其中一些常用功能的改變,如Maketrans函數(shù)等,需要的朋友可以參考下

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

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

一、字符串的格式化

Python的最新版本為我們帶來了討人喜歡的格式字段的自動(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來說,每當(dāng)您想在格式串中引用位置參數(shù)時(shí),您必須給出每個(gè)位置參數(shù)的索引。但是在Python 3.1中,您就可以將這些索引拋在腦后了,因?yàn)镻ython會(huì)依次替您填充這些參數(shù):

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

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

在財(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)行分組。這里的寬度說明符(這里為8)包括了逗號(hào)和小數(shù)點(diǎn):

 

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

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

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

'1_234'當(dāng)然,您還可以使用format函數(shù)來作為字符串方法:

?
1
>>> '{0:8,.1f}'.format(123.456)

三、Maketrans函數(shù)

利用maketrans()和translate()函數(shù),我們可以使用一組字符來替換另一組字符。使用這一替換功能時(shí),多少有點(diǎn)繁瑣,因?yàn)樗笫褂胢aketrans()函數(shù)(該函數(shù)的作用是把輸入字符映射到輸出字符)建立一個(gè)轉(zhuǎn)換表,然后,再把這個(gè)轉(zhuǎn)換表傳遞給translate()函數(shù)。當(dāng)然,string模塊仍然有它自己的maketrans()函數(shù),不過Python 3.1不贊成使用它,而是贊賞使用單獨(dú)的maketrans()函數(shù)來操作字節(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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
>>> tt = bytes.maketrans(b'123', b'456')
>>> len(tt)
256
>>> tt
b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\
t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\
x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\
x1e\x1f !"#$%&\'()*+,-./0456456789:;<=>
?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcd
efghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\
x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\
x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\
x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\
xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\
xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\
xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\
xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\
xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\
xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\
xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\
xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\
xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\
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'我們可以看到,原來的5已經(jīng)從123456從刪掉了,但是轉(zhuǎn)換得到的5(請(qǐng)記住,我們的映射表將2轉(zhuǎn)化為5)并沒有刪除。這說明,系統(tǒng)是先從原來的字符串中刪除相應(yīng)的字符,然后才進(jìn)行的轉(zhuǎn)換操作。
字符串的轉(zhuǎn)換稍微有些不同,字符串版本的maketrans函數(shù)返回的是一個(gè)字典:

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

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

?
1
2
3
>>> int.bit_length(19)
5
>>> 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ù)無常:如果您不指定精度的時(shí)候,它返回的是一個(gè)整數(shù);如果指定精度的話,它返回的是您輸入數(shù)據(jù)的類型:

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

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

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

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

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

?
1
>>> 0.6

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

?
1
>>> 0.6

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

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

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

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

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

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

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

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

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

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

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

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

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

六、小結(jié)

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 特黄特黄一级高清免费大片 | 男人午夜禁片在线观看 | 国产精品久久久久久久久齐齐 | 大胸纲手被羞羞漫画网站 | narutomanga玖辛奈之乳 | 97精品国产自在现线免费观看 | 91精品国产麻豆国产自产在线 | 国产成人精品午夜视频' | 日本mv精品中文字幕 | 国产精品久久久久久久免费大片 | tube62hdxxxx日本| 美女牲交毛片一级视频 | 三上悠亚国产精品一区 | 思久久| 脱了白丝校花的内裤猛烈进入 | 教室里的激情电影 | 色琪琪原网站亚洲香蕉 | 国产成人综合一区精品 | 欧美一级xxx| 国内精品视频九九九九 | 手机国产乱子伦精品视频 | daring国家队在线观看樱花动漫 | 欧美高清免费一级在线 | 欧美日韩中文字幕一区二区高清 | 国产精品林美惠子在线观看 | 7个黑人玩北条麻妃 | 女bbbbxxxx视频 | 日本不卡在线视频高清免费 | 欧美综合亚洲图片综合区 | 日日爱爱| 国产欧美一区二区精品性色 | 美女脱了内裤打开腿让你桶爽 | 国产嘿咻| 日本高清视频网址 | 国产欧美曰韩一区二区三区 | 色综合色狠狠天天综合色hd | 欧美亚洲桃花综合 | 亚洲精品tv久久久久久久久久 | 国产亚洲高清国产拍精品 | 古装一级无遮挡毛片免费观看 | 成人精品一级毛片 |