python3.7 的新特性詳解
Python 3.7增添了眾多新的類,可用于數(shù)據(jù)處理、針對(duì)腳本編譯和垃圾收集的優(yōu)化以及更快的異步I/O。
Python這種語言旨在使復(fù)雜任務(wù)變得簡(jiǎn)單,最新版本Python 3.7已正式進(jìn)入測(cè)試版發(fā)布階段。Python 3.7的最終版定于2018年6月發(fā)布,但此后不會(huì)為Python 3.7版本添加任何新功能。
Python 3.7最重要的添加和改進(jìn)之處包括如下:
- 用類處理數(shù)據(jù)時(shí)減少樣板代碼的數(shù)據(jù)類。
- 一處可能無法向后兼容的變更涉及處理生成器中的異常。
- 面向解釋器的“開發(fā)模式”。
- 具有納秒分辨率的時(shí)間對(duì)象。
- 環(huán)境中默認(rèn)使用UTF-8編碼的UTF-8模式。
- 觸發(fā)調(diào)試器的一個(gè)新的內(nèi)置函數(shù)。
Python數(shù)據(jù)類
眾所周知,Python是處理結(jié)構(gòu)化數(shù)據(jù)的一種快捷又方便的方法。Python提供了用來組織管理結(jié)構(gòu),并將常見行為與數(shù)據(jù)實(shí)例聯(lián)系起來的類,但是擁有許多初始化器的類歷來存在這個(gè)弊端:需要大量的樣板代碼為它們創(chuàng)建實(shí)例。比如說:
為了使這實(shí)現(xiàn)自動(dòng)化:為類創(chuàng)建實(shí)例,Python 3.7引入了一個(gè)新的模塊dataclasses,如PEP 557中所述(https://www.python.org/dev/peps/pep-0557/)。它提供了一個(gè)裝飾器,能夠以異常簡(jiǎn)單的方式重現(xiàn)上述行為:
因而生成的類運(yùn)行起來如同普通的Python類。你還可以聲明某些字段是“凍結(jié)”或不可變的,并且使創(chuàng)建屬性的特殊方法(比如__hash__或__repr__)實(shí)現(xiàn)自動(dòng)化(或手動(dòng)覆蓋)。
Python生成器異常處理
正如PEP 479中概述(https://www.python.org/dev/peps/pep-0479/),開發(fā)了一段時(shí)間的一處變更旨在讓人們更容易調(diào)試Python生成器引發(fā)的StopIteration異常。以前,生成器遇到另一個(gè)問題時(shí)很容易引發(fā)StopIteration,而不是由于它用完了需要迭代的東西。這帶來了一整批很難追蹤的代碼缺陷。
在Python 3.7中,生成器引發(fā)StopIteration異常后,StopIteration異常將被轉(zhuǎn)換成RuntimeError異常,那樣它不會(huì)悄悄一路影響應(yīng)用程序的堆??蚣?。這意味著如何處理生成器的行為方面不太敏銳的一些程序會(huì)在Python 3.7中拋出RuntimeError。而在Python 3.6中,這種行為生成一個(gè)棄用警告;在Python 3.7中,它生成一個(gè)完整的錯(cuò)誤。
一個(gè)簡(jiǎn)易的方法是使用try/except代碼段,在StopIteration傳播到生成器的外面捕獲它。更好的解決方案是重新考慮如何構(gòu)建生成器――比如說,使用return語句來終止生成器,而不是手動(dòng)引發(fā)StopIteration。想進(jìn)一步了解如何在現(xiàn)有代碼中補(bǔ)救這個(gè)問題,如何在新代碼中防范該問題,請(qǐng)參閱PEP 469(https://www.python.org/dev/peps/pep-0479/)。
Python開發(fā)模式
Python解釋器新的命令行開關(guān):-X讓開發(fā)人員可以為解釋器設(shè)置許多低級(jí)選項(xiàng)。在Python 3.7中,選項(xiàng)-X dev啟用“開發(fā)模式”,這種運(yùn)行時(shí)檢查機(jī)制通常對(duì)性能有重大影響,但在調(diào)試過程中對(duì)開發(fā)人員很有用。
-X dev激活的選項(xiàng)包括:
- asyncio模塊的調(diào)試模式。這為異步操作提供了更詳細(xì)的日志記錄和異常處理,而異常操作可能很難調(diào)試或推理。
- 面向內(nèi)存分配器的調(diào)試鉤子。這對(duì)于編寫CPython擴(kuò)展件的那些人很有用。它能夠?qū)崿F(xiàn)更明確的運(yùn)行時(shí)檢查,了解CPython如何在內(nèi)部分配內(nèi)存和釋放內(nèi)存。
- 啟用faulthandler模塊,那樣發(fā)生崩潰后,traceback始終轉(zhuǎn)儲(chǔ)出去。
具有納秒分辨率的Python時(shí)間函數(shù)
Python 3.7中一類新的時(shí)間函數(shù)返回納秒精度的時(shí)間值。盡管Python是一種解釋型語言,但是Python的核心開發(fā)人員維克多•斯廷納(Victor Stinner)主張報(bào)告納秒精度的時(shí)間。最主要的原因是,在處理轉(zhuǎn)換其他程序(比如數(shù)據(jù)庫)記錄的時(shí)間值時(shí),可以避免丟失精度。
新的時(shí)間函數(shù)使用后綴_ns。比如說,time.process_time()的納秒版本是time.process_time_ns()。請(qǐng)注意,并非所有的時(shí)間函數(shù)都有對(duì)應(yīng)的納秒版本,因?yàn)槠渲幸恍r(shí)間函數(shù)并不得益于此。
Python UTF-8模式
Python一直支持UTF-8,以便輕松處理字符串和文本。但是周圍環(huán)境中的語言環(huán)境(locale)有時(shí)仍是ASCII,而不是UTF-8,檢測(cè)語言環(huán)境的機(jī)制并不總是很可靠。
Python 3.7添加了所謂的“UTF-8模式”,可通過-X命令行開關(guān)啟用該模式,該模式假設(shè)UTF-8是環(huán)境提供的語言環(huán)境。在POSIX語言環(huán)境中,UTF-8模式默認(rèn)情況下已被啟用,但在其他位置默認(rèn)情況下被禁用,以免破壞向后兼容。值得試一試在默認(rèn)情況下開啟UTF-8模式,但不應(yīng)該在生產(chǎn)環(huán)境下啟用它,除非你確信Python與周圍環(huán)境的所有交互都使用UTF-8。
內(nèi)置breakpoint()函數(shù)
Python隨帶內(nèi)置的調(diào)試器,不過它也可以連入到第三方調(diào)試工具,只要它們能與Python的內(nèi)部調(diào)試API進(jìn)行對(duì)話。不過,Python到目前為止缺少一種從Python應(yīng)用程序里面以編程方式觸發(fā)調(diào)試器的標(biāo)準(zhǔn)化方法。
Python 3.7添加了breakpoint(),這個(gè)內(nèi)置函數(shù)使得函數(shù)被調(diào)用時(shí),讓執(zhí)行切換到調(diào)試器。相應(yīng)的調(diào)試器不一定是Python自己的pdb,可以是之前被設(shè)為首選調(diào)試器的任何調(diào)試器。以前,調(diào)試器不得不手動(dòng)設(shè)置,然后調(diào)用,因而使代碼更冗長(zhǎng)。而有了breakpoint(),只需一個(gè)命令即可調(diào)用調(diào)試器,并且讓設(shè)置調(diào)試器和調(diào)用調(diào)試器涇渭分明。
其他新的Python 3.7功能
Python 3.7有另外的眾多變更。下面是你在使用最新版本的Python時(shí)可能會(huì)遇到的其他一些功能:
面向線程本地存儲(chǔ)支持的C-API
PEP 539中描述(https://www.python.org/dev/peps/pep-0539/),線程特定存儲(chǔ)(TSS)API取代了老式的線程本地存儲(chǔ)(TLS)API。如果誰定制CPython或編寫使用解釋器的內(nèi)部API的CPython擴(kuò)展件,就要明白這一點(diǎn)。
模塊屬性訪問定制
你在Python程序中創(chuàng)建模塊時(shí),現(xiàn)在可以針對(duì)該模塊的實(shí)例定制屬性訪問的行為。為此,只需要在模塊里面創(chuàng)建一個(gè)__getattr__方法,就跟為一個(gè)類創(chuàng)建方法那樣。這樣一來,就可以對(duì)諸如請(qǐng)求模塊里面不存在的函數(shù)或方法之類的操作進(jìn)行攔截、標(biāo)記或代理。
Python importlib資源
importlib模塊現(xiàn)在可用來讀取“資源”,即隨Python應(yīng)用程序一并交付的二進(jìn)制工件,比如數(shù)據(jù)文件。這樣一來,開發(fā)人員可以通過importlib的抽象來訪問那些文件,所以它們存儲(chǔ)在系統(tǒng)上某個(gè)地方的.zip文件中還是存儲(chǔ)在目錄中并不重要。
底層優(yōu)化
現(xiàn)在許多單獨(dú)的操作更快速了:
由于新的操作碼,方法調(diào)用起來最多快20%。(除非你在編寫直接處理Python操作碼的代碼,否則不需要擔(dān)心由此帶來的影響。)正則表達(dá)式中不區(qū)分大小寫的匹配速度更快了,有時(shí)要快20倍。
源代碼中的一些常量現(xiàn)在可以更高效地優(yōu)化。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
一文帶你了解Python中的數(shù)據(jù)序列化與反序列化
Python提供了豐富的工具和庫來處理數(shù)據(jù)序列化與反序列化,本文帶領(lǐng)大家一起學(xué)習(xí),包括基本概念、常見的序列化格式、示例和最佳實(shí)踐,快跟隨小編一起學(xué)習(xí)起來吧2023-10-10利用Python中的pandas庫對(duì)cdn日志進(jìn)行分析詳解
這篇文章主要介紹了利用Python中的pandas庫進(jìn)行cdn日志分析的相關(guān)資料,文中分享了pandas對(duì)cdn日志分析的完整示例代碼,然后詳細(xì)介紹了關(guān)于pandas庫的相關(guān)內(nèi)容,需要的朋友可以參考借鑒,下面來一起看看吧。2017-03-03利用python為PostgreSQL的表自動(dòng)添加分區(qū)
這篇文章主要介紹了利用python為PostgreSQL的表自動(dòng)添加分區(qū),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Python中處理字符串之endswith()方法的使用簡(jiǎn)介
這篇文章主要介紹了Python中處理字符串之endswith()方法的使用,是Python入門中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-05-05Python flask框架請(qǐng)求體數(shù)據(jù)、文件上傳、請(qǐng)求頭信息獲取方式詳解
這篇文章主要介紹了Python flask框架請(qǐng)求體數(shù)據(jù)、文件上傳、請(qǐng)求頭信息獲取方式詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-03-03詳解Python中最常用的10個(gè)內(nèi)置函數(shù)
Python作為一種多用途編程語言,擁有豐富的內(nèi)置函數(shù)庫,這些函數(shù)可以極大地提高開發(fā)效率,本文將介紹Python中最常用的10個(gè)內(nèi)置函數(shù),我們將深入了解每個(gè)函數(shù),并提供示例代碼以幫助您更好地理解它們,需要的朋友可以參考下2023-11-11