搜尋
首頁後端開發Python教學了解為什麼說 Python 內建函數並不是萬能的?

python影片教學專欄帶大家認識 Python 內建函數。

了解為什麼說 Python 內建函數並不是萬能的?

Python貓的上一篇文章中,我們比較了兩種建立清單的方法,即字面量用法[]與內建類型用法list(),進而分析出它們在運行速度上的差異。

在分析為什麼list() 會更慢的時候,文中說到它需要經過名稱查找與函數呼叫兩個步驟,那麼,這就引出了一個新的問題:list()不是內建類型麼,為什麼它不能直接就呼叫創建列表的邏輯?也就是說,為什麼解釋器必須經過名稱查找,才能「認識」該做什麼呢?

其實原因很簡單:內建函數/內建類型的名稱並不是關鍵字,它們只是解釋器內建的便利功能,方便開發者開箱即用而已。

PS:內建函數 built-in function 和內建類型 built-in type 很相似,但 list() 實際上是內建類型而不是內建函數。我曾對這兩種易混淆的概念做過辨析,請查看這篇文章。為了方便理解與表述,以下統稱為內建函數。

1、內建函數的尋找優先順序最低

內建函數的名稱並不屬於關鍵字,它們是可以被重新賦值的。

例如下面這個例子:

# 正常调用内置函数list(range(3))  # 结果:[0, 1, 2]# 定义任意函数,然后赋值给 listdef test(n):
    print("Hello World!")
list = test
list(range(3)) # 结果:Hello World!复制代码

了解為什麼說 Python 內建函數並不是萬能的?

#在這個例子中,我們將自訂的test 賦值給了list,程式並沒有報錯。這個範例甚至還可以改成直接定義新的同名函數,也就是"def list(): …"。

這說明了 list 並不是 Python 限定的關鍵字/保留字。

查看官方文檔,可以發現Python 3.9 有35 個關鍵字,明細如下:

了解為什麼說 Python 內建函數並不是萬能的?

如果我們將上例的test 賦值給任一個關鍵字,例如"pass=test",就會報錯:SyntaxError: invalid syntax。

由此,我們可以從這個角度看出內建函數並不是萬能的:它們的名稱並不像關鍵字那般穩固不變,雖然它們處在系統內建作用域裡,但是卻可以被使用者局部作用域的物件所輕易攔截掉!

因為解釋器尋找名稱的順序是“局部作用域->全域作用域->內建作用域”,因此內建函數其實是處在最低優先權。

對於新手來說,這有一定的可能會發生意想不到的情況(內建函數有 69 個,要全記住是有難度的)。

那麼,為什麼 Python 不把所有內建函數的名稱都設為不可重寫的關鍵字呢?

一方面原因是它想控製關鍵字的數量,另一方面可能是想留給使用者更多的自由。內建函數只是解釋器的推薦實作而已,開發者可以根據需要,實作出與內建函數同名的函數。

不過,這樣的場景極少,而且開發者一般會定義成不同名的函數,以Python 標準庫為例,ast模組有literal_eval() 函數(對標eval () 內建函數)、pprint 模組有pprint() 函數(對標print() 內建函數)、以及itertools模組有zip_longest() 函數(對標zip() 內建函數)…

2、內建函數可能不是最快的

由於內建函數的名稱並非保留的關鍵字,以及它處於名稱查找的末位順序,所以內建函數有可能不是最快的。

了解為什麼說 Python 內建函數並不是萬能的?

上篇文章展示了[] 比list() 快2~3 倍的事實,其實這還可以推廣到str()、tuple()、set( )、dict() 等等內建類型中,都是字面量用法稍微快於內建類型用法。

對於這些內建類型,當我們呼叫 xxx() 時,可以簡單地理解成正在做類別的實例化。在物件導向語言中,類別先實例化再使用,這是再正常不過的。

但是,這樣的做法有時也顯得繁瑣。 為了方便使用,Python 給一些常用的內建類型提供了字面量表示法,也就是""、[]、()、{} 等等,表示字串、列表、元組和字典等資料類型。

了解為什麼說 Python 內建函數並不是萬能的?

文件來源:docs.python.org/3/reference…

一般而言,所有程式語言都必須有一些字面量表示,但基本上都局限在數字類型、字串、布林類型以及 null 之類的基礎類型。

Python 中也增加了幾種資料結構類型的字面量,所以是更為方便的,同時這也解釋了為什麼內建函數可能不是最快的。

一般而言,同樣的完備功能,內建函數總是比我們自訂的函數要快,因為解釋器可以做一些底層的最佳化,例如len() 內建函數肯定比使用者定義的x .len() 函數快。

有些人據此形成了「內建函數總是更快」的認識誤區。

解釋器內建函數相對於使用者定義函數,前者接近走後門;而字面量表示法相對於內建函數,前者是在走更快的後門。

也就是說,在有字面量表示法的情況下,某些內建函數/內建型別並不是最快的!

小結

誠然,Python 本身並不是萬能的,那它的任何語法構成部分(內建函數/型別),就更不是萬能的了。但是,一般我們會認為內建函數/型別總歸是「高人一等」的,是受到諸多特殊優待的,顯得像是「萬能的」。

本文從「list() 竟然會敗給[]」破題,從兩個角度揭示了內建函數其實存在著某種不足:內建函數的名稱並不是關鍵字,而內置作用域位於名稱查找的最低優先級,因此在呼叫時,某些內建函數/類型的執行速度就明顯慢於它們對應的字面量表示法。

本文對上一個「Python為什麼」主題做了延展討論,一方面充實了前面的內容,另一方面,也有助於大家理解 Python 的幾個基礎概念及其實現。

如果你喜歡本文,請按讚支持下吧!另外,我還寫了20 篇類似的話題,請關注Python貓查看,並在Github 上給我一顆小星星吧~~

相關免費學習推薦:python影片教學

#

以上是了解為什麼說 Python 內建函數並不是萬能的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:juejin。如有侵權,請聯絡admin@php.cn刪除
Python腳本可能無法在UNIX上執行的一些常見原因是什麼?Python腳本可能無法在UNIX上執行的一些常見原因是什麼?Apr 28, 2025 am 12:18 AM

Python腳本在Unix系統上無法運行的原因包括:1)權限不足,使用chmod xyour_script.py賦予執行權限;2)Shebang行錯誤或缺失,應使用#!/usr/bin/envpython;3)環境變量設置不當,可打印os.environ調試;4)使用錯誤的Python版本,可在Shebang行或命令行指定版本;5)依賴問題,使用虛擬環境隔離依賴;6)語法錯誤,使用python-mpy_compileyour_script.py檢測。

舉一個場景的示例,其中使用Python數組比使用列表更合適。舉一個場景的示例,其中使用Python數組比使用列表更合適。Apr 28, 2025 am 12:15 AM

使用Python數組比列表更適合處理大量數值數據。 1)數組更節省內存,2)數組對數值運算更快,3)數組強制類型一致性,4)數組與C語言數組兼容,但在靈活性和便捷性上不如列表。

在Python中使用列表與數組的性能含義是什麼?在Python中使用列表與數組的性能含義是什麼?Apr 28, 2025 am 12:10 AM

列表列表更好的forflexibility andmixDatatatypes,何時出色的Sumerical Computitation sand larged數據集。 1)不可使用的列表xbilese xibility xibility xibility xibility xibility xibility xibility xibility xibility xibility xibles and comply offrequent elementChanges.2)

Numpy如何處理大型數組的內存管理?Numpy如何處理大型數組的內存管理?Apr 28, 2025 am 12:07 AM

numpymanagesmemoryforlargearraysefefticefticefipedlyuseviews,副本和內存模擬文件.1)viewsAllowSinglicingWithOutCopying,直接modifytheoriginalArray.2)copiesCanbecopy canbecreatedwitheDedwithTheceDwithThecevithThece()methodervingdata.3)metservingdata.3)memore memore-mappingfileShessandAstaStaStstbassbassbassbassbassbassbassbassbassbassbb

哪個需要導入模塊:列表或數組?哪個需要導入模塊:列表或數組?Apr 28, 2025 am 12:06 AM

Listsinpythondonotrequireimportingamodule,helilearraysfomthearraymoduledoneedanimport.1)列表列表,列表,多功能和canholdMixedDatatatepes.2)arraysaremoremoremoremoremoremoremoremoremoremoremoremoremoremoremoremoremeremeremeremericdatabuteffeftlessdatabutlessdatabutlessfiblesible suriplyElsilesteletselementEltecteSemeTemeSemeSemeSemeTypysemeTypysemeTysemeTypysemeTypepe。

可以在Python數組中存儲哪些數據類型?可以在Python數組中存儲哪些數據類型?Apr 27, 2025 am 12:11 AM

pythonlistscanStoryDatatepe,ArrayModulearRaysStoreOneType,and numpyArraySareSareAraysareSareAraysareSareComputations.1)列出sareversArversAtileButlessMemory-Felide.2)arraymoduleareareMogeMogeNareSaremogeNormogeNoreSoustAta.3)

如果您嘗試將錯誤的數據類型的值存儲在Python數組中,該怎麼辦?如果您嘗試將錯誤的數據類型的值存儲在Python數組中,該怎麼辦?Apr 27, 2025 am 12:10 AM

WhenyouattempttostoreavalueofthewrongdatatypeinaPythonarray,you'llencounteraTypeError.Thisisduetothearraymodule'sstricttypeenforcement,whichrequiresallelementstobeofthesametypeasspecifiedbythetypecode.Forperformancereasons,arraysaremoreefficientthanl

Python標準庫的哪一部分是:列表或數組?Python標準庫的哪一部分是:列表或數組?Apr 27, 2025 am 12:03 AM

pythonlistsarepartofthestAndArdLibrary,herilearRaysarenot.listsarebuilt-In,多功能,和Rused ForStoringCollections,而EasaraySaraySaraySaraysaraySaraySaraysaraySaraysarrayModuleandleandleandlesscommonlyusedDduetolimitedFunctionalityFunctionalityFunctionality。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境