溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python3.6和3.5的區(qū)別是什么

發(fā)布時(shí)間:2020-09-10 10:01:24 來(lái)源:億速云 閱讀:594 作者:小新 欄目:編程語(yǔ)言

這篇文章主要介紹python3.6和3.5的區(qū)別是什么,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

新的語(yǔ)法特性:

PEP 498:格式化字符串字面量

PEP 515:數(shù)字字面量中的下劃線

PEP 526:變量注解中的語(yǔ)法

PEP 525:異步生成器

PEP 520:異步解析式

python學(xué)習(xí)網(wǎng),大量的免費(fèi)python視頻教程,歡迎在線學(xué)習(xí)!

新的庫(kù)模塊:

Secrets:PEP 506 - 在標(biāo)準(zhǔn)庫(kù)中添加了Secrets模塊

CPython實(shí)現(xiàn)的改進(jìn):

重新實(shí)現(xiàn)了字典(dict)類型,以便能像PyPy的字典類型一樣使用更緊湊的表達(dá)方式。與Python 3.5相比,這使字典的內(nèi)存用量減少了20%到25%。

用新協(xié)定優(yōu)化了類的自定義建立。

類屬性定義順序(class attribute definition order)現(xiàn)在被保留了**kwargs內(nèi)的元素順序現(xiàn)在對(duì)應(yīng)于將關(guān)鍵字(保留字)參數(shù)傳遞給函數(shù)的順序。

新增了對(duì)DTrace和SystemTap probing的支持。

新PYTHONMALLOC環(huán)境變量現(xiàn)在可用于調(diào)試解釋器內(nèi)存分配與訪問(wèn)錯(cuò)誤。

標(biāo)準(zhǔn)庫(kù)的重大改進(jìn):

為asyncio模塊開發(fā)了新功能、顯著的可用性、性能優(yōu)化,以及大量的錯(cuò)誤修復(fù)。 從Python 3.6開始,asyncio模塊不再是臨時(shí)的了,其API也進(jìn)入了穩(wěn)定狀態(tài)。

實(shí)現(xiàn)了用于支持類路徑對(duì)象(path-like objects)的新文件系統(tǒng)路徑協(xié)議。 所有在路徑(path)上使用的標(biāo)準(zhǔn)庫(kù)函數(shù)都已更新,以便適應(yīng)于新協(xié)議。

datetime模塊已獲得對(duì)本地時(shí)間消歧(Local Time Disambiguation)的支持。

針對(duì)typing模塊的一些改進(jìn),使其不再是臨時(shí)模塊。

tracemalloc模塊已重大改進(jìn),現(xiàn)用于為ResourceWarning提供更好的輸出,并為內(nèi)存分配錯(cuò)誤提供更好的診斷。 

安全相關(guān)的改進(jìn):

新secrets模塊被用于簡(jiǎn)化那些適用于管理密文的密碼學(xué)安全偽隨機(jī)數(shù)生成器(cryptographically strong pseudo-random numbers)的生成過(guò)程,如認(rèn)證、token等。

在Linux上,現(xiàn)將os.urandom()改成了阻塞模式,直到系統(tǒng)的urandom的熵池(entropy pool)的初始化具有更高的安全性。 解釋請(qǐng)參見(jiàn)PEP 524。

hashlib和ssl模塊現(xiàn)已支持OpenSSL 1.1.0。

改進(jìn)了ssl模塊的默認(rèn)設(shè)置和特性集。

新增了hashlib模塊對(duì)BLAKE2、SHA-3、SHAKE哈希算法以及scrypt()密鑰導(dǎo)出函數(shù)的支持。

Windows上的改進(jìn):

PEP 528與PEP 529,Windows文件系統(tǒng)和控制臺(tái)的編碼已更改為UTF-8。

當(dāng)用戶沒(méi)有指定版本(通過(guò)命令行參數(shù)或配置文件)時(shí),py.exe啟動(dòng)器以交互方式使用時(shí),不再以Python 2優(yōu)先于Python 3。 處理shebang行的方式保持不變 - 此處的“python”依舊指Python 2。

python.exe和pythonw.exe已標(biāo)記為長(zhǎng)路徑敏感(long-path aware),這意味著260字符路徑限制可能不再適用。 有關(guān)詳細(xì)信息,請(qǐng)參閱刪除MAX_PATH限制。

可以添加._pth文件以強(qiáng)制隔離模式(isolated mode)并完全指定所有搜索路徑,以避免注冊(cè)表查找和環(huán)境查找。 

一個(gè)python36.zip文件現(xiàn)可用作一個(gè)地標(biāo)(landmark)以臆指PYTHONHOME。

新特性:

PEP 498: 格式化字符串

PEP 498引入了一種新的字符串:_f-strings_, 或者格式化字符串。

格式化字符串帶'f'前綴,類似于str.format()接受的格式字符串。它們包含了由花括號(hào)括起來(lái)的替換字段。替換字段是表達(dá)式,它們會(huì)在運(yùn)行時(shí)計(jì)算,然后使用format()協(xié)議進(jìn)行格式化:

>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}" # nested fields
'result: 12.35'

PEP 498 - 字符串插值。

PEP 526: 變量注釋語(yǔ)法

PEP 484引入了函數(shù)參數(shù)的類型注釋的標(biāo)準(zhǔn),又名類型提示。這個(gè)PEP添加了用來(lái)注釋變量(包括類變量和實(shí)例變量)類型的語(yǔ)法:

primes: List[int] = []
captain: str # Note: no initial value!
class Starship:
stats: Dict[str, int] = {}

正如函數(shù)注釋,Python解釋器不附加任何特殊意義到變量注釋上,只是將它們存儲(chǔ)在一個(gè)類或者模塊的__annotations__屬性中。

與靜態(tài)類型語(yǔ)言中的變量聲明相比,注釋語(yǔ)法的目的在于提供一種簡(jiǎn)單的方式,通過(guò)抽象語(yǔ)法樹和__annotations__屬性,來(lái)為第三方工具和庫(kù)指定結(jié)構(gòu)化類型元數(shù)據(jù)。

PEP 526 - 變量注釋語(yǔ)法。

使用或?qū)⒁褂眠@個(gè)新語(yǔ)法的工具:mypy, pytype, PyCharm等等。

PEP 515: 數(shù)值文字中的下劃線

PEP 515添加了在數(shù)值文字中使用下劃線的能力,以提高可讀性。例如:

>>> 1_000_000_000_000_000
1000000000000000
>>> 0x_FF_FF_FF_FF
4294967295

數(shù)字之間和任何基本符號(hào)之后允許單個(gè)下劃線。不允許前置、后置或者多個(gè)連續(xù)的下劃線。

字符串格式化語(yǔ)言現(xiàn)在還支持'_'選項(xiàng),該選項(xiàng)用來(lái)通知對(duì)浮點(diǎn)表示類型和整型表示類型'd',會(huì)把下劃線當(dāng)成千位分隔符使用。對(duì)于整型表示類型'b', 'o', 'x', 和'X', 下劃線將會(huì)被插入到每4個(gè)數(shù)字之間:

>>> '{:_}'.format(1000000)
'1_000_000'
>>> '{:_x}'.format(0xFFFFFFFF)
'ffff_ffff'

PEP 515 - 數(shù)值文字中的下劃線

PEP 525: 異步生成器

PEP 492 引入支持原生協(xié)程和async /await的語(yǔ)法到Python 3.5。

在Python 3.5實(shí)現(xiàn)里的一個(gè)值得注意的局限性就在于它不可能使用await和`yield'在同一個(gè)函數(shù)體中。 而在Python 3.6中,這個(gè)限制已解除,這使得定義異步生成器成為可能:

async def ticker(delay, to):
"""Yield numbers from 0 to *to* every *delay* seconds."""
for i in range(to):
yield i
await asyncio.sleep(delay)

新的語(yǔ)法允許更快更簡(jiǎn)潔的代碼。

PEP 525 - 異步生成器

PEP 530: 異步解析式

PEP 530 添加了對(duì)async for在list、set、dict解析式以及generator表達(dá)式中的使用支持:

result = [i async for i in aiter() if i % 2]

此外,所有解析式都支持“await”表達(dá)式:

result = [await fun() for fun in funcs if await condition()]

PEP 530 - 異步解析式

PEP 487: 用于建立類的更簡(jiǎn)單的自定義

現(xiàn)在可以在不使用元類的情況下自定義子類。每當(dāng)創(chuàng)建一個(gè)新的子類時(shí),新的__init_subclass__類方法將在基類上被調(diào)用:

class PluginBase:
subclasses = []
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
cls.subclasses.append(cls)
class Plugin1(PluginBase):
pass
class Plugin2(PluginBase):
pass

為了允許零參數(shù)super()從_init_subclass __()實(shí)現(xiàn)中被正確的調(diào)用并工作,自定義元類必須確保新的__classcell__命名空間輸入傳遞到type .__ new__(如創(chuàng)建類對(duì)象)

PEP 487 - 用于建立類的更簡(jiǎn)單的自定義

功能文檔

PEP 487: 描述符協(xié)議增強(qiáng)

PEP 487 擴(kuò)展描述符協(xié)議必須包括新的可選的__set_name __()方法。 每當(dāng)定義一個(gè)新類時(shí),新方法將會(huì)調(diào)用定義中所有的描述符,并給它們提供定義類的引用,以及類命名空間中給予描述符的名字。 換句話說(shuō),描述符的實(shí)例現(xiàn)在可以獲知所有者類的屬性名:

class IntField:
def __get__(self, instance, owner):
return instance.__dict__[self.name]
def __set__(self, instance, value):
if not isinstance(value, int):
raise ValueError(f'expecting integer in {self.name}')
instance.__dict__[self.name] = value
# this is the new initializer:
def __set_name__(self, owner, name):
self.name = name
class Model:
int_field = IntField()

PEP 487 - 用于建立類的更簡(jiǎn)單的自定義

PEP 519: 添加文件系統(tǒng)路徑協(xié)議

文件系統(tǒng)路徑過(guò)去被表示為str或bytes對(duì)象。這會(huì)導(dǎo)致那些編寫操作文件系統(tǒng)路徑代碼的人,假定這些對(duì)象只能是這兩種類型之一(一個(gè)代表著文件描述符的int對(duì)象將不被計(jì)入即它不是一個(gè)文件路徑)。

不幸的是,這種假設(shè)局限了文件系統(tǒng)路徑表示代方法,如已經(jīng)存在的pathlib,同時(shí)也包括python的一些標(biāo)準(zhǔn)庫(kù)。

為了解決這種情況,定義了一個(gè)由os.PathLike表示的新接口。通過(guò)實(shí)現(xiàn)__fspath__()方法,一個(gè)對(duì)象表示一個(gè)路徑,然后,可以將文件系統(tǒng)路徑表示為一個(gè)較低等級(jí)的str或者bytes對(duì)象。這意味著,如果一個(gè)對(duì)象實(shí)現(xiàn)os.PathLike或者是str或bytes,該對(duì)象被認(rèn)為是path-like,它代表一個(gè)文件系統(tǒng)路徑。你可以使用os.fspath(),os.fsdecode()或os.fsencode()顯式獲取str以及/或bytes來(lái)表示一個(gè)path-like對(duì)象。

內(nèi)建函數(shù)open()已經(jīng)更新,可以接受os.PathLike對(duì)象,以及在os和os.path模塊中的所有函數(shù),以及標(biāo)準(zhǔn)庫(kù)中的大多數(shù)其他函數(shù)和類。類os.DirEntry以及pathlib中相關(guān)的類也已經(jīng)可以實(shí)現(xiàn)os.PathLike。

希望對(duì)操作文件系統(tǒng)路徑基本功能的更新能夠讓第三方代碼在不改變?nèi)魏未a,或者至少是非常少的代碼(例如,在操作path-like對(duì)象之前,在代碼的開頭調(diào)用os.fspath())的情況下,能夠隱含地支持所有path-like objects對(duì)象。

下面舉一些例子說(shuō)明新接口是如何讓預(yù)先存在的代碼簡(jiǎn)單透明地使用pathlib.Path:

>>> import pathlib
>>> with open(pathlib.Path("README")) as f:
... contents = f.read()
...
>>> import os.path
>>> os.path.splitext(pathlib.Path("some_file.txt"))
('some_file', '.txt')
>>> os.path.join("/a/b", pathlib.Path("c"))
'/a/b/c'
>>> import os
>>> os.fspath(pathlib.Path("some_file.txt"))
'some_file.txt'

PEP 519 - 添加文件系統(tǒng)路徑協(xié)議

PEP 495: 本地時(shí)間消歧

世界上大多數(shù)地方,都曾經(jīng)出現(xiàn)也將出現(xiàn)多次的時(shí)間回調(diào)。在這種時(shí)候,引入時(shí)間間隔用以表示本地時(shí)鐘在同一天中出現(xiàn)兩次相同的時(shí)間的情況,在這些情況下,本地時(shí)鐘顯示的時(shí)間(或存在在python datetime中的實(shí)例)不足及時(shí)表示特定的時(shí)刻。

為了區(qū)分本地時(shí)間相同的兩個(gè)時(shí)刻,PEP 495 在類 datetime.datetime 和 `datetime.time` 的實(shí)例中增加了新的fold屬性:

>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
>>> for i in range(4):
... u = u0 + i*HOUR
... t = u.astimezone(Eastern)
... print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
...
04:00:00 UTC = 00:00:00 EDT 0
05:00:00 UTC = 01:00:00 EDT 0
06:00:00 UTC = 01:00:00 EST 1
07:00:00 UTC = 02:00:00 EST 0

屬性 fold 的值除了表示不明確情況下的第二(時(shí)間順序)時(shí)刻之外,其他所有實(shí)例的值都為 0。

PEP 495 - 本地時(shí)間消歧

PEP 529: 更改windows下文件系統(tǒng)編碼格式為UTF-8

使用str (Unicode) 表示文件系統(tǒng)路徑比bytes能獲得更好的效果。盡管如此,在某些情況下bytes也足以勝任并且也是正確的。

在3.6之前,使用bytes路徑可能導(dǎo)致數(shù)據(jù)丟失。改進(jìn)后, windows下現(xiàn)在支持使用bytes表示路徑,這些bytes將以sys.getfilesy

stemencoding()的方式編碼,默認(rèn)編碼格式為'utf-8'。

不使用str方式表示路徑的應(yīng)用程序應(yīng)當(dāng)使用os.fsencode()和os.fsdecode() 以確保他們的bytes被正確編碼。要回復(fù)到之前的狀態(tài), 設(shè)置 PYTHONLEGACYWINDOWSFSENCODING 或者調(diào)用sys._enablelegacywindowsfsencoding()。

PEP 528: 更改windows控制臺(tái)編碼為UTF-8

windows下的默認(rèn)控制臺(tái)現(xiàn)在支持所有的Unicode字符并可以正確讀取Python代碼中的str對(duì)象。sys.stdin, sys.stdout

以及 sys.stderr 現(xiàn)在的默認(rèn)使用utf-8編碼。

這一變化僅適用于使用交互控制臺(tái)之時(shí),而非重定向文件或者管道。如果要使用之前的交互控制臺(tái), 需設(shè)置 PYTHONLEGACYWINDOWSIOENCODING。

PEP 528 - 修改windows控制臺(tái)編碼為UTF-8

PEP 520: 保存類屬性定義順序

類的定義體中的屬性有一個(gè)自然順序:即源碼中屬性名出現(xiàn)的順序。 這個(gè)順序現(xiàn)在保存在新的類__dict__ 的屬性中。

同樣, 有效的缺省類和執(zhí)行空間 (從type.prepare()返回)是一個(gè)保存插入順序的映射。

PEP 520 - 保存類屬性定義順序

PEP 468: 保存關(guān)鍵字參數(shù)順序

函數(shù)聲明中的**kwargs 的順序現(xiàn)在被保證是插入順序的映射。

PEP 468 - 保存關(guān)鍵字參數(shù)順序

新的字典dict類型的實(shí)現(xiàn)

字典dict類型現(xiàn)在使用 PyPy首創(chuàng)的 "緊湊" 表達(dá)方式。 新字典dict() 的內(nèi)存占用比Python3.5中減少20%到25%。

新的實(shí)現(xiàn)中保存順序的功能被認(rèn)為是不可過(guò)于依賴的(未來(lái)也許會(huì)改變,不過(guò)在將所有當(dāng)前和未來(lái)的Python實(shí)現(xiàn)的語(yǔ)言規(guī)范轉(zhuǎn)換為保證順序的語(yǔ)法之前的幾個(gè)版本中,新的dict有望被實(shí)現(xiàn)的; 這也能幫助保證對(duì)那些仍舊是隨機(jī)迭代順序的舊版本的向后兼容,比如Python 3.5)。

PEP 523:添加一個(gè)frame解析API到CPython

雖然Python提供了自定義代碼執(zhí)行方式的廣泛支持,但是還有一個(gè)它沒(méi)這樣做的地方是frame對(duì)象的解析。如果你想要通過(guò)某些方式在Python中攔截frame解析,那么除了直接對(duì)定義的函數(shù)操作函數(shù)指針之外,真的沒(méi)有什么其他方式。

PEP 523改變了這個(gè)處境,它提供了一個(gè)API,讓frame解析在C層次上可插拔。這將允許諸如調(diào)試器或者JIT這樣的工具在Python代碼開始執(zhí)行之前攔截frame解析。這使得python代碼的可替換解析實(shí)現(xiàn)、跟蹤frame解析等地使用成為可能。

這個(gè)API并不是受限的C API的一部分,并且被標(biāo)為私有,表示期望限制這個(gè)API的使用,并且只能應(yīng)用在非常選定的低層次用例上。這個(gè)API的語(yǔ)義將在必要的時(shí)候隨著Python改動(dòng)。

以上是python3.6和3.5的區(qū)別是什么的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI