您好,登錄后才能下訂單哦!
這篇文章主要介紹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è)資訊頻道!
免責(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)容。