您好,登錄后才能下訂單哦!
這篇文章主要介紹python3.6和3.5的區別是什么,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
新的語法特性:
PEP 498:格式化字符串字面量
PEP 515:數字字面量中的下劃線
PEP 526:變量注解中的語法
PEP 525:異步生成器
PEP 520:異步解析式
python學習網,大量的免費python視頻教程,歡迎在線學習!
新的庫模塊:
Secrets:PEP 506 - 在標準庫中添加了Secrets模塊
CPython實現的改進:
重新實現了字典(dict)類型,以便能像PyPy的字典類型一樣使用更緊湊的表達方式。與Python 3.5相比,這使字典的內存用量減少了20%到25%。
用新協定優化了類的自定義建立。
類屬性定義順序(class attribute definition order)現在被保留了**kwargs內的元素順序現在對應于將關鍵字(保留字)參數傳遞給函數的順序。
新增了對DTrace和SystemTap probing的支持。
新PYTHONMALLOC環境變量現在可用于調試解釋器內存分配與訪問錯誤。
標準庫的重大改進:
為asyncio模塊開發了新功能、顯著的可用性、性能優化,以及大量的錯誤修復。 從Python 3.6開始,asyncio模塊不再是臨時的了,其API也進入了穩定狀態。
實現了用于支持類路徑對象(path-like objects)的新文件系統路徑協議。 所有在路徑(path)上使用的標準庫函數都已更新,以便適應于新協議。
datetime模塊已獲得對本地時間消歧(Local Time Disambiguation)的支持。
針對typing模塊的一些改進,使其不再是臨時模塊。
tracemalloc模塊已重大改進,現用于為ResourceWarning提供更好的輸出,并為內存分配錯誤提供更好的診斷。
安全相關的改進:
新secrets模塊被用于簡化那些適用于管理密文的密碼學安全偽隨機數生成器(cryptographically strong pseudo-random numbers)的生成過程,如認證、token等。
在Linux上,現將os.urandom()改成了阻塞模式,直到系統的urandom的熵池(entropy pool)的初始化具有更高的安全性。 解釋請參見PEP 524。
hashlib和ssl模塊現已支持OpenSSL 1.1.0。
改進了ssl模塊的默認設置和特性集。
新增了hashlib模塊對BLAKE2、SHA-3、SHAKE哈希算法以及scrypt()密鑰導出函數的支持。
Windows上的改進:
PEP 528與PEP 529,Windows文件系統和控制臺的編碼已更改為UTF-8。
當用戶沒有指定版本(通過命令行參數或配置文件)時,py.exe啟動器以交互方式使用時,不再以Python 2優先于Python 3。 處理shebang行的方式保持不變 - 此處的“python”依舊指Python 2。
python.exe和pythonw.exe已標記為長路徑敏感(long-path aware),這意味著260字符路徑限制可能不再適用。 有關詳細信息,請參閱刪除MAX_PATH限制。
可以添加._pth文件以強制隔離模式(isolated mode)并完全指定所有搜索路徑,以避免注冊表查找和環境查找。
一個python36.zip文件現可用作一個地標(landmark)以臆指PYTHONHOME。
新特性:
PEP 498: 格式化字符串
PEP 498引入了一種新的字符串:_f-strings_, 或者格式化字符串。
格式化字符串帶'f'前綴,類似于str.format()接受的格式字符串。它們包含了由花括號括起來的替換字段。替換字段是表達式,它們會在運行時計算,然后使用format()協議進行格式化:
>>> 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: 變量注釋語法
PEP 484引入了函數參數的類型注釋的標準,又名類型提示。這個PEP添加了用來注釋變量(包括類變量和實例變量)類型的語法:
primes: List[int] = [] captain: str # Note: no initial value! class Starship: stats: Dict[str, int] = {}
正如函數注釋,Python解釋器不附加任何特殊意義到變量注釋上,只是將它們存儲在一個類或者模塊的__annotations__屬性中。
與靜態類型語言中的變量聲明相比,注釋語法的目的在于提供一種簡單的方式,通過抽象語法樹和__annotations__屬性,來為第三方工具和庫指定結構化類型元數據。
PEP 526 - 變量注釋語法。
使用或將要使用這個新語法的工具:mypy, pytype, PyCharm等等。
PEP 515: 數值文字中的下劃線
PEP 515添加了在數值文字中使用下劃線的能力,以提高可讀性。例如:
>>> 1_000_000_000_000_000 1000000000000000 >>> 0x_FF_FF_FF_FF 4294967295
數字之間和任何基本符號之后允許單個下劃線。不允許前置、后置或者多個連續的下劃線。
字符串格式化語言現在還支持'_'選項,該選項用來通知對浮點表示類型和整型表示類型'd',會把下劃線當成千位分隔符使用。對于整型表示類型'b', 'o', 'x', 和'X', 下劃線將會被插入到每4個數字之間:
>>> '{:_}'.format(1000000) '1_000_000' >>> '{:_x}'.format(0xFFFFFFFF) 'ffff_ffff'
PEP 515 - 數值文字中的下劃線
PEP 525: 異步生成器
PEP 492 引入支持原生協程和async /await的語法到Python 3.5。
在Python 3.5實現里的一個值得注意的局限性就在于它不可能使用await和`yield'在同一個函數體中。 而在Python 3.6中,這個限制已解除,這使得定義異步生成器成為可能:
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)
新的語法允許更快更簡潔的代碼。
PEP 525 - 異步生成器
PEP 530: 異步解析式
PEP 530 添加了對async for在list、set、dict解析式以及generator表達式中的使用支持:
result = [i async for i in aiter() if i % 2]
此外,所有解析式都支持“await”表達式:
result = [await fun() for fun in funcs if await condition()]
PEP 530 - 異步解析式
PEP 487: 用于建立類的更簡單的自定義
現在可以在不使用元類的情況下自定義子類。每當創建一個新的子類時,新的__init_subclass__類方法將在基類上被調用:
class PluginBase: subclasses = [] def __init_subclass__(cls, **kwargs): super().__init_subclass__(**kwargs) cls.subclasses.append(cls) class Plugin1(PluginBase): pass class Plugin2(PluginBase): pass
為了允許零參數super()從_init_subclass __()實現中被正確的調用并工作,自定義元類必須確保新的__classcell__命名空間輸入傳遞到type .__ new__(如創建類對象)
PEP 487 - 用于建立類的更簡單的自定義
功能文檔
PEP 487: 描述符協議增強
PEP 487 擴展描述符協議必須包括新的可選的__set_name __()方法。 每當定義一個新類時,新方法將會調用定義中所有的描述符,并給它們提供定義類的引用,以及類命名空間中給予描述符的名字。 換句話說,描述符的實例現在可以獲知所有者類的屬性名:
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 - 用于建立類的更簡單的自定義
PEP 519: 添加文件系統路徑協議
文件系統路徑過去被表示為str或bytes對象。這會導致那些編寫操作文件系統路徑代碼的人,假定這些對象只能是這兩種類型之一(一個代表著文件描述符的int對象將不被計入即它不是一個文件路徑)。
不幸的是,這種假設局限了文件系統路徑表示代方法,如已經存在的pathlib,同時也包括python的一些標準庫。
為了解決這種情況,定義了一個由os.PathLike表示的新接口。通過實現__fspath__()方法,一個對象表示一個路徑,然后,可以將文件系統路徑表示為一個較低等級的str或者bytes對象。這意味著,如果一個對象實現os.PathLike或者是str或bytes,該對象被認為是path-like,它代表一個文件系統路徑。你可以使用os.fspath(),os.fsdecode()或os.fsencode()顯式獲取str以及/或bytes來表示一個path-like對象。
內建函數open()已經更新,可以接受os.PathLike對象,以及在os和os.path模塊中的所有函數,以及標準庫中的大多數其他函數和類。類os.DirEntry以及pathlib中相關的類也已經可以實現os.PathLike。
希望對操作文件系統路徑基本功能的更新能夠讓第三方代碼在不改變任何代碼,或者至少是非常少的代碼(例如,在操作path-like對象之前,在代碼的開頭調用os.fspath())的情況下,能夠隱含地支持所有path-like objects對象。
下面舉一些例子說明新接口是如何讓預先存在的代碼簡單透明地使用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 - 添加文件系統路徑協議
PEP 495: 本地時間消歧
世界上大多數地方,都曾經出現也將出現多次的時間回調。在這種時候,引入時間間隔用以表示本地時鐘在同一天中出現兩次相同的時間的情況,在這些情況下,本地時鐘顯示的時間(或存在在python datetime中的實例)不足及時表示特定的時刻。
為了區分本地時間相同的兩個時刻,PEP 495 在類 datetime.datetime 和 `datetime.time` 的實例中增加了新的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 的值除了表示不明確情況下的第二(時間順序)時刻之外,其他所有實例的值都為 0。
PEP 495 - 本地時間消歧
PEP 529: 更改windows下文件系統編碼格式為UTF-8
使用str (Unicode) 表示文件系統路徑比bytes能獲得更好的效果。盡管如此,在某些情況下bytes也足以勝任并且也是正確的。
在3.6之前,使用bytes路徑可能導致數據丟失。改進后, windows下現在支持使用bytes表示路徑,這些bytes將以sys.getfilesy
stemencoding()的方式編碼,默認編碼格式為'utf-8'。
不使用str方式表示路徑的應用程序應當使用os.fsencode()和os.fsdecode() 以確保他們的bytes被正確編碼。要回復到之前的狀態, 設置 PYTHONLEGACYWINDOWSFSENCODING 或者調用sys._enablelegacywindowsfsencoding()。
PEP 528: 更改windows控制臺編碼為UTF-8
windows下的默認控制臺現在支持所有的Unicode字符并可以正確讀取Python代碼中的str對象。sys.stdin, sys.stdout
以及 sys.stderr 現在的默認使用utf-8編碼。
這一變化僅適用于使用交互控制臺之時,而非重定向文件或者管道。如果要使用之前的交互控制臺, 需設置 PYTHONLEGACYWINDOWSIOENCODING。
PEP 528 - 修改windows控制臺編碼為UTF-8
PEP 520: 保存類屬性定義順序
類的定義體中的屬性有一個自然順序:即源碼中屬性名出現的順序。 這個順序現在保存在新的類__dict__ 的屬性中。
同樣, 有效的缺省類和執行空間 (從type.prepare()返回)是一個保存插入順序的映射。
PEP 520 - 保存類屬性定義順序
PEP 468: 保存關鍵字參數順序
函數聲明中的**kwargs 的順序現在被保證是插入順序的映射。
PEP 468 - 保存關鍵字參數順序
新的字典dict類型的實現
字典dict類型現在使用 PyPy首創的 "緊湊" 表達方式。 新字典dict() 的內存占用比Python3.5中減少20%到25%。
新的實現中保存順序的功能被認為是不可過于依賴的(未來也許會改變,不過在將所有當前和未來的Python實現的語言規范轉換為保證順序的語法之前的幾個版本中,新的dict有望被實現的; 這也能幫助保證對那些仍舊是隨機迭代順序的舊版本的向后兼容,比如Python 3.5)。
PEP 523:添加一個frame解析API到CPython
雖然Python提供了自定義代碼執行方式的廣泛支持,但是還有一個它沒這樣做的地方是frame對象的解析。如果你想要通過某些方式在Python中攔截frame解析,那么除了直接對定義的函數操作函數指針之外,真的沒有什么其他方式。
PEP 523改變了這個處境,它提供了一個API,讓frame解析在C層次上可插拔。這將允許諸如調試器或者JIT這樣的工具在Python代碼開始執行之前攔截frame解析。這使得python代碼的可替換解析實現、跟蹤frame解析等地使用成為可能。
這個API并不是受限的C API的一部分,并且被標為私有,表示期望限制這個API的使用,并且只能應用在非常選定的低層次用例上。這個API的語義將在必要的時候隨著Python改動。
以上是python3.6和3.5的區別是什么的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。