Python3.8的幾大新功能,你都知道嗎?

2021-03-02 程式設計師小灰

繼3.7版本之後Python再次發布了新版本,雖然新版本帶來了不少調整,但是其中很大一部分都是對代碼底層設計的修改,又或是typing、pickle等不常用的功能,對多數用戶而言影響不大,今天我想重點聊一聊那些將對我們的代碼編寫產生較大影響的新功能。

在體驗開始前先說下準備工作,由於Python3.8還沒有正式發布,因此通過Anaconda的多版本管理搭建Python3.8新環境的方法是行不通的,我的做法是到官網下載對應的最新版本後單獨安裝。


為了避免與現有環境衝突,將其更名為Python38(下圖),下文中的Python如無特殊說明均為Python3.6, Python38為Python3.8。接下來就正式開始新特性體驗。

我們都知道Python中的字典是無序的,Python3.6對這一問題進行了修訂,默認情況下會按照鍵的創建順序進行排序,但也僅限於此,你無法像列表那樣對字典直接進行排序操作。

這一情況在Python3.8中進一步得到改善,Python3.8中reversed()方法增加了對字典對象的支持,可以對字典進行逆序操作

在下面這段代碼中,對字典進行簡單的迭代,將會按照順序輸出字典的鍵。

現在改變一下代碼,加入reversed()方法:

先來看使用Python3.6的運行結果(下圖),可以看到在Python3.6中,字典是不支持recersed()方法的。

然後用Python3.8運行結果如下可以看到,字典按照鍵創建順序的逆序進行了輸出。雖然只是非常小的一點功能提升,但是在某些場景下對於字典對象的應用可能會起到非常關鍵的作用。



在Python3.8中的參數傳遞方面引入了一個新的特性:PEP 570 Positional-Only Argument——限定位置參數,下面就詳細聊聊這究竟是怎麼回事。

一般來說,Python中的參數傳遞有三種形式:位置參數、關鍵字參數和可變參數,為了避免不必要的麻煩,規定在可變參數之後只允許使用關鍵字參數。可是即便如此還是給程式設計師們留下了很大的自由空間,比如在可變參數之前,位置參數和關鍵字參數的使用幾乎不受限制。這樣就出現了一個問題,假如一個團隊中很多人進行合作開發,函數的定義形式和調用模式是很難規範和統一的

因此Python3.8就引入了一個「Positional-Only Argument」的概念和分隔符「/」,在分隔符「/」左側的參數,只允許使用位置參數的形式進行傳遞。

舉個例子來進行說明,首先建立下面這樣一個函數,由於函數中使用了分隔符「/」,因此只能使用Python3.8運行。

def add_num(x, y, z=100, /, a=100):
    print(x + y + z + a)

嘗試以下面這種方式調用函數:

結果在運行的時候發生了報錯:

接著嘗試全部以位置參數的形式調用函數(如下),結果順利執行。可見「Positional-Only Argument」對分隔符「/」右側的參數形式並沒有限制

# 輸入
add_num(1, 2, 4, 5)
# 輸出
12

那麼如果只給定前兩個參數,後面兩個參數使用默認值又如何呢?通過下面的調用可以發現,也是可以正常運行的。

通過上面這個例子我們發現Python3.8對於參數傳遞的限制僅僅作用於分隔符「/」的左側,而且只是在函數調用時發生作用。


Python3.8中新增了賦值表達式「:=」操作符,簡單來說就是把運算操作和賦值操作放在了一起,有點類似於「a+=b」這種表達方式,我想賦值表達式的出現應該是python追求簡潔的傳統理念所致。

來看下面這段代碼,在func函數的if語句中,運算、賦值、判斷操作在同一條語句中完成,即使變量a原本不存在也沒關係。

# 輸入
def func(x, y, z):
    if (a := x + y) != z:
        print(a)
    else:
        print(z)
func(1, 2, 5)
# 輸出
3

當然,就上面這段代碼本身來看,將 x+y 的結果進行賦值似乎意義不大,但是如果運算表達式的計算量非常大或者要進行大規模獨寫等操作的話,重複執行對代碼的效率將造成大的影響;而如果事先對運算表達式賦值則需要多寫一行代碼。

目前來看,賦值表達式最重要的作用就是使代碼變得更加簡潔,至於運行效率的差異,目前還沒有驗證。

在之前的Python版本中,「f表達式」——f'{expr}'的作用與eval()函數基本相同,例如:

f'{[1, 2, 3, 4, 5, 6]}'的結果是列表[1, 2, 3, 4, 5, 6];

f'{3 + 2}'的結果是運算後的值5。

Python3.8中對該功能進行了優化,f'{expr}'語句中增加了對等號「=」的支持,在保留原來功能的基礎上,還能夠同時輸出運算表達式本身。

例如執行先面這段代碼,除了計算並輸出運算結果外,還會將「=」和其左側的算式一併輸出:

x = 3
print(f'{x * 2 = }')

執行結果:

f'{expr}'不僅適用於基本的算術運算,還能夠進行其他對象的操作,以列表為例,令lst=[1, 2, 3, 4, 5, 6],現在對其進行擴展操作:

lst = eval('[1, 2, 3, 4, 5, 6]')
print(f'{lst = }')
print(f'{lst + [7] = }')

運行結果如下:

函數運算同樣適用,例如對兩個列表求交集,執行下面這段代碼:

lst1 = [1, 2, 3, 4, 5]
lst2 = [3, 5, 7]
print(f'{list(set(lst1).intersection(set(lst2))) = }')

運行結果:

相比僅輸出結果,連帶運算表達式一起輸出有助於定位檢查,在調試代碼的時候使用真的是快捷又方便。

進程是系統進行資源分配的獨立單位,在以前的python版本中,進程間的數據交互只能通過Queue、Pipes等方式來實現,數據無法直接共享。

在Python 3.8中,multiprocessing模塊提供了SharedMemory類,可以在不同的Python進程之間創建共享的內存block。目前支持int、float、str、bytes、bool、None、numpy.ndarray等一部分Python對象。

還是舉個例子來進行說明,在下面這段代碼中建立了2個進程,在進程1中對列表中的每個元素執行+10操作,進程1結束後執行進程2,輸出列表內容。

由於進程之間數據無法共享,因此進程2中輸出的列表是沒有進行過+10操作的內容:

現在我們對代碼進行一下小小的修改,nums不是作為一個普通的list,而是作為一個共享內存對象來創建,代碼如下:

由於shared_memory是Python3.8中的新增內容,因此在Python3.6下運行會出錯,我們還是用Python3.8來運行這段代碼(結果如下)可以看到,進程2中輸出的結果與進程1中是一樣的,兩個進程之間通過shared_memory實現了數據共享。

當然,shared_memory在實際應用中肯定不會如此簡單,

Python3.8發布的新特性和新功能還有很多,對一些內置模塊的改進和優化則更多,想嘗鮮的同學可以百度了解更多相關內容。你對Python3.8新特性怎麼看,歡迎吱一聲留言!

—————END—————

喜歡本文的朋友們,歡迎長按下圖關注訂閱號程式設計師小灰,收看更多精彩內容

歡迎掃碼關注公眾號 程式設計師內推圈,優秀的內推機會等著你!

相關焦點

  • asyncio REPL(Python 3.8)
    前言我最近都在寫一些Python 3.8的新功能介紹的文章,在自己的項目中也在提前體驗新的Python版本。
  • Visual Studio Code 8 月 Python 擴展更新
    微軟發布了 8 月的 Visual Studio Code Python 擴展更新,此版本共關閉了 76 個問題,主要內容有 Jupyter Notebook 單元調試、引入了 Insiders
  • 官宣:Python 3.8來了,新版本的強大功能,你知道嗎?
    就在昨天Python官網悄悄發布一則消息,Python3.8來了……3.9正在開發中。想知道Python3.8和Python3.7的區別嗎?仔細看,別眨眼↓↓↓1. 要將python嵌入到應用程式中,必須向python3 config--libs--embed傳遞一個新的--embed選項,以獲取-lpython3.8(將應用程式連結到libpython)。若要同時支持3.8和更高版本,請嘗試python3 config--libs--embed first,如果前面的命令失敗,請回退到python3 config--libs(不帶--embed)。
  • Python和C/C++交互的幾種方法總結
    這篇文章主要給大家總結介紹了Python和C/C++交互的幾種方法,文中介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。前言python作為一門腳本語言,其好處是語法簡單,很多東西都已經封裝好了,直接拿過來用就行,所以實現同樣一個功能,用Python寫要比用C/C++代碼量會少得多。
  • Python2 已終結,入手Python 3,你需要這30個技巧
    這篇教程有 30 個你會喜歡的方法。勤勞的程式設計師們,這裡有 30 條使用 Python 時實用的建議和小技巧。你可以把讀這篇文章當做工作間隙的小憩,而且我保證你學到的東西會跟工作時一樣多。如果你關注 Python 的話,應該會知道 Python 2 已經於今年(2020 年)1 月 1 日正式棄用了。
  • 5個無聊Python程序,用Python整蠱你的朋友們吧
    print("猜錯嘍")你的朋友將永遠無法知道你在想什麼。當然我安裝 360 之後,程序沒了。有興趣研究免殺的,可以在給本文點個讚,點讚過 100,我出套 Python 免殺教程。d88' `88b d88' `"Y8 888 .8P' `888 888 888 888 888 888 8888888 `"Y88b 888ooo888 888 888888. 888 888 888 888 888 d88' oo .d8P 888 .o 888 .o8
  • 利用python做串口通訊上位機
    安裝python開發環境首先到python官網https://www.python.org/downloads/windows/下載python軟體。如下圖所示,最新版本為3.8.下載好的文件名為:python-3.8.1-amd64.exe.雙擊這個文件,進行安裝。安裝時,選擇Add python3.8 to PATH。這一點也非常重要!
  • 深圳Python培訓班打造行業高標準Python人才
    我們都知道Web前端一直都是不可忽視的存在,我們離不開網絡,離不開Web前端,利用Python的框架可以做網站,而且都是一些精美的前端界面,另外我們需要掌握一些數據的應用。Python火的原因1、python相比別的高級語言集成度更高,除了執行的效率低些,開源可以調用的類庫實在太多了,要實現一個功能,如果換作傳統的程式語言,需要實現基本的功能模塊,但直接調用類庫很方便的搞定,特別適合零基礎的學習, 幾行代碼就能實現很強大的功能。
  • Python Tool 101 - Tool 002 - Python 情感分析 SnowNLP
    SnowNLP是咋們中國人受到了TextBlob的啟發後開發的python類庫,能夠非常方便的處理中文文本內容,劃重點方便處理中文的類庫!!!,類庫中的算法和訓練好的字典都已經準備好了。唯一需要注意的是要使用unicode編碼,所以使用時請自行decode成unicode。知道這個SnowNLP是什麼之後,我們開始設計下實驗方案。
  • 大揭秘:必須學會的Python數據分析利器
    二、誰在用Jupyter Notebook也許還有朋友不知道Jupyter Notebook,到底都是誰在用它?這是從官網上看到的使用者:谷歌、微軟、NASA、IBM等國際知名公司都在其中。所以,你確定還不用嗎?
  • 24 個好用到爆的 Python 實用技巧!
    新版本意味著新功能 —— 除非你的版本已過時。不過不要擔心。使用該__future__模塊[4]可以幫助你用Python的未來版本導入功能。從字面上看,這就像時間旅行、魔法或其他東西。pip install howdoi無論你有什麼問題,都可以問它,它會盡力回復。
  • Python3.6安裝BeautifulSoup4模塊
    首先要確保自己的python3.6運行正常?何為運行正常呢?就是你在cmd後出現的「黑屏幕」上直接輸入python然後出現下面的界面就是正確的了。然後我們安裝的話,需要在 直接進入的cmd裡面進行安裝,而非python3.6環境中我們關閉上面的python3.6環境。重新cmd,進入「黑屏幕」。
  • 慢步python,你苦苦找尋的python中文使用手冊在哪裡?這裡有答案
    #學習難度大python對大家來說,應該算是相對新的程式語言。其實也挺多了,網上搜索到處都是。即使這樣,我們學習python的道路依舊困難重重。問題在,相關的學習資料不夠系統。初學者使用手冊像以前剛開始使用電視、手機一樣,都有一本使用說明書,即使用手冊。
  • Python爬蟲數據抓取方法匯總!所有方法都在此!
    2、python簡易代碼實現web抓取: 1 #coding=utf-8 2 3 import urllib,urllib2 4 5 #繼續以抓取豆瓣電影分類連結為例 6 7 movie_list = ['%E7%BA%AA%E5%BD%95%E7%89%
  • 你真的知道 Python 字符串怎麼用嗎?
    字符串不可以做的事上文內容都是 Python 字符串特有的操作方法,相信讀完之後,你更清楚知道 Python 能夠做什麼了。但是,這還不足以回答本文標題的問題——你真的知道 Python 的字符串怎麼用嗎?這些特有的操作方法,再加上之前文章提到的序列共有的操作、字符串讀寫文件、字符串列印、字符串Intern機制等等內容,才差不多能夠回答這個問題。儘管如此,為了體現嚴謹性,我試著再聊聊「Python 字符串不可以做的事」,從相反的維度來補充回答這個問題。
  • 推薦幾款可以直接在手機上編程的app(包含Java、C、Python等)
    3.python:QPython3、Termux。4.CSS/HTML/JavaScript:HTMLplay。:1.apt install python 默認安裝的是Python3,畢竟python3是未來啊2.apt install clang 大名鼎鼎的c++ 編譯器,用來編譯c或c++程序3.apt install vim termux自帶vi,如果想使用vim(畢竟神之編輯器),則必須安裝,且默認安裝vim 8.0 版本, 配合.vimrc,bundle和git
  • iOS14什麼時候出來 支持哪些設備 有哪些新功能?你想知道的都在這!
    而根據目前的爆料來看,下一代iOS14加入了不少值得期待的新功能。以下是iOS14發布時間、支持設備、爆料的新功能匯總,你想知道一切都在這!iOS14什麼時候出來?iOS14必會支持的iPhone機型一覽:iPhone 12系列(秋季發布)、iPhone 11系列、iPhone SE2、iPhone XS、iPhone XS Max、iPhone XR、iPhone X、iPhone 8/8 Plus、iPhone 7/7 PlusiOS14
  • CentOS8 終於發布了,嘗鮮!
    RedHat8在5月7號正式發布後,就一直期待CentOS新版本的發布,今天終於發布了,迫不及待的嘗鮮CentOS我就不多介紹了,目前各大鏡像站點已經都可以下載了,請看文章最後附的地址安裝也不算複雜,不過和之前的版本不同的地方在於,如果你和我一樣,下載的是一個boot類型的鏡像的話,它需要你先手動配置好網絡,以及配置一個repository
  • Python 2和Python 3代碼有哪些區別?
    來源:網絡綜合圖源:網絡編輯:@編程大咖免責聲明:1.本公眾號所轉載文章均來自公開網絡,僅供學習交流使用,不會用於任何商業用途。2.如果出處標註有誤或侵犯到原著作者權益,請在公眾號對話框回復消息刪除。3.轉載本號中的文章請註明原文連結和作者,否則產生的任何版權糾紛均與本號無關。
  • Python入門講解
    一行寫多個語句Python是一個語句放在一行,行尾可以選擇性的加上;但如果想在一行放多個語句,就需要用;來分隔語句:a = 1; b = 2; c = 3;雖然這在語法上可行,但不是一個好習慣,絕大多數的編程規範都是要一行寫一個語句.