
小編今天跟大家分享的又是python的“為什么”系列的文章哦。大家都知道python是一款強大的數(shù)據分析工具,我們平常工作和生活中也總是會用到。但是對于python的一些基本理論卻是一知半解,希望通過小編今天給大家分享的這篇:Python 為什么會有個奇怪的“...”對象?的文章,使大家對于python有進一步的了解。
以下文章來源: Python貓
作者:豌豆花下貓
在寫上一篇《Python 為什么要有 pass 語句?》時,我想到一種特別的寫法,很多人會把它當成 pass 語句的替代。在文章發(fā)布后,果然有三條留言提及了它。
所謂特別的寫法就是下面這個:
# 用 ... 替代 pass def foo(): ...
它是中文標點符號的半個省略號,也即由英文的 3 個點組成。如果你是第一次看到,很可能會覺得奇怪:這玩意是怎么回事?PS:如果你知道它,仔細看過本文后,你同樣可能會覺得奇怪!
事實上,它是 Python 3 中的一個內置對象,有個正式的名字叫作——Ellipsis,翻譯成中文就是“省略號”。
更準確地說,它是一個內置常量(Built-in Constant),是 6 大內置常量之一(另外幾個是 None、False、True、NotImplemented、__debug__)。
關于這個對象的基礎性質,下面給出了一張截圖,你們應該能明白我的意思:
“...“并不神秘,它只是一個可能不多見的符號型對象而已。用它替換 pass,在語法上并不會報錯,因為 Python 允許一個對象不被賦值引用。
嚴格來說, 這是旁門左道,在語義上站不住腳——把“...”或其它常量或已被賦值的變量放在一個空的縮進代碼塊中,它們是與動作無關的,只能表達出“這有個沒用的對象,不用管它”。
Python 允許這些不被實際使用的對象存在,然而聰明的 IDE 應該會有所提示(我用的是Pycharm),比如告訴你:Statement seems to have no effect 。
但是“...”這個常量似乎受到了特殊對待,我的 IDE 上沒有作提示。
很多人已經習慣上把它當成 pass 那樣的空操作來用了(在最早引入它的郵件組討論中,就是舉了這種用法的例子)。但我本人還是傾向于使用 pass,不知道你是怎么想的呢?
... 在 PEP-3100 中被引入,最早合入在 Python 3.0 版本,而 Ellipsis 則在更早的版本中就已包含。
雖然官方說它們是同一個對象的兩種寫法,而且說成是單例的(singleton),但我還發(fā)現(xiàn)一個非常奇怪的現(xiàn)象,與文檔的描述是沖突的:
如你所見,賦值給 ... 時會報錯SyntaxError: cannot assign to Ellipsis ,然而 Ellipsis 卻可以被賦值,它們的行為根本就不同嘛!被賦值之后,Ellipsis 的內存地址以及類型屬性都改變了,它成了一個“變量”,不再是常量。
作為對比,給 True 或 None 之類的常量賦值時,會報錯SyntaxError: cannot assign to XXX,但是給 NotImplemented 常量賦值時不會報錯。
眾所周知,在 Python 2 中也可以給布爾對象(True/False)賦值,然而 Python 3 已經把它們改造成不可修改的。
所以有一種可能的解釋:Ellipsis 和 NotImplemented 是 Python 2 時代的遺留產物,為了兼容性或者只是因為核心開發(fā)者遺漏了,所以它們在當前版本(3.8)中還可以被賦值修改。
... 出生在 Python 3 的時代,或許在將來會完全取代 Ellipsis。目前兩者共存,它們不一致的行為值得我們注意。我的建議:只使用"..."吧,就當 Ellipsis 已經被淘汰了。
接下來,讓我們回到標題的問題:Python 為什么要使用“...”對象?
這里就只聚焦于 Python 3 的“...”了,不去追溯 Ellipsis 的歷史和現(xiàn)狀。
之所以會問這個問題,我的意圖是想知道:它有什么用處,能夠解決什么問題?從而窺探到 Python 語言設計中的更多細節(jié)。
大概有如下的幾種答案:
官方文檔中給出了這樣的說明:
Special value used mostly in conjunction with extended slicing syntax for user-defined container data types.
這是個特殊的值,通常跟擴展的切片語法相結合,用在自定義的數(shù)據類型容器上。
文檔中沒有給出具體實現(xiàn)的例子,但用它結合__getitem__() 和 slice() 內置函數(shù),可以實現(xiàn)類似于 [1, ..., 7] 取出 7 個數(shù)字的切片片段的效果。
由于它主要用在數(shù)據操作上,可能大部分人很少接觸。聽說 Numpy 把它用在了一些語法糖用法上,如果你在用 Numpy 的話,可以探索一下都有哪些玩法?
... 可以被用作占位符,也就是我在《Python 為什么要有 pass 語句?》中提到 pass 的作用。前文中對此已有部分分析。
有人覺得這樣很 cute,這種想法獲得了 Python 之父 Guido 的支持 :
Python 3.5 引入的 Type Hint 是“...”的主要使用場合。
它可以表示不定長的參數(shù),比如Tuple[int, ...] 表示一個元組,其元素是 int 類型,但數(shù)量不限。
它還可以表示不確定的變量類型,比如文檔中給出的這個例子:
from typing import TypeVar, Generic T = TypeVar('T') def fun_1(x: T) -> T: ... # T here def fun_2(x: T) -> T: ... # and here could be different fun_1(1) # This is OK, T is inferred to be int fun_2('a') # This is also OK, now T is str
T 在函數(shù)定義時無法確定,當函數(shù)被調用時,T 的實際類型才被確定。
在 .pyi 格式的文件中,... 隨處可見。這是一種存根文件(stub file),主要用于存放 Python 模塊的類型提示信息,給 mypy、pytype 之類的類型檢查工具 以及 IDE 來作靜態(tài)代碼檢查。
最后,我認為有一個非常終極的原因,除了引入“...”來表示,沒有更好的方法。
先看看兩個例子:
兩個例子的結果中都出現(xiàn)了“...”,它表示的是什么東西呢?
對于列表和字典這樣的容器,如果其內部元素是可變對象的話,則存儲的是對可變對象的引用。那么,當其內部元素又引用容器自身時,就會遞歸地出現(xiàn)無限循環(huán)引用。
無限循環(huán)是無法窮盡地表示出來的,Python 中用 ... 來表示,比較形象易懂,除了它,恐怕沒有更好的選擇。
最后,我們來總結一下本文的內容:
數(shù)據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
LSTM 模型輸入長度選擇技巧:提升序列建模效能的關鍵? 在循環(huán)神經網絡(RNN)家族中,長短期記憶網絡(LSTM)憑借其解決長序列 ...
2025-07-11CDA 數(shù)據分析師報考條件詳解與準備指南? ? 在數(shù)據驅動決策的時代浪潮下,CDA 數(shù)據分析師認證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據透視表中兩列相乘合計的實用指南? 在數(shù)據分析的日常工作中,數(shù)據透視表憑借其強大的數(shù)據匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實施重大更新。 此次更新旨在確保認 ...
2025-07-10BI 大數(shù)據分析師:連接數(shù)據與業(yè)務的價值轉化者? ? 在大數(shù)據與商業(yè)智能(Business Intelligence,簡稱 BI)深度融合的時代,BI ...
2025-07-10SQL 在預測分析中的應用:從數(shù)據查詢到趨勢預判? ? 在數(shù)據驅動決策的時代,預測分析作為挖掘數(shù)據潛在價值的核心手段,正被廣泛 ...
2025-07-10數(shù)據查詢結束后:分析師的收尾工作與價值深化? ? 在數(shù)據分析的全流程中,“query end”(查詢結束)并非工作的終點,而是將數(shù) ...
2025-07-10CDA 數(shù)據分析師考試:從報考到取證的全攻略? 在數(shù)字經濟蓬勃發(fā)展的今天,數(shù)據分析師已成為各行業(yè)爭搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢性檢驗:捕捉數(shù)據背后的時間軌跡? 在數(shù)據分析的版圖中,單樣本趨勢性檢驗如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據類型:時間維度的精準切片? ? 在數(shù)據的世界里,時間是最不可或缺的維度之一,而year_month數(shù)據類型就像一把精準 ...
2025-07-09CDA 備考干貨:Python 在數(shù)據分析中的核心應用與實戰(zhàn)技巧? ? 在 CDA 數(shù)據分析師認證考試中,Python 作為數(shù)據處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗:數(shù)據趨勢與突變分析的有力工具? ? ? 在數(shù)據分析的廣袤領域中,準確捕捉數(shù)據的趨勢變化以及識別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據分析師認證作為國內權威的數(shù)據分析能力認證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應對策略? 長短期記憶網絡(LSTM)作為循環(huán)神經網絡(RNN)的一種變體,憑借獨特的門控機制,在 ...
2025-07-07統(tǒng)計學方法在市場調研數(shù)據中的深度應用? 市場調研是企業(yè)洞察市場動態(tài)、了解消費者需求的重要途徑,而統(tǒng)計學方法則是市場調研數(shù) ...
2025-07-07CDA數(shù)據分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當下,數(shù)據已成為企業(yè)決策、行業(yè)發(fā)展的核心驅動力,數(shù)據分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據分析師考試作為衡量數(shù)據專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉日期:解鎖數(shù)據處理的關鍵技能? 在數(shù)據處理與分析工作中,數(shù)據格式的規(guī)范性是保證后續(xù)分析準確性的基礎 ...
2025-07-04CDA 數(shù)據分析師視角:從數(shù)據迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據已成為企業(yè)決策的核心驅動力,CDA(Certifie ...
2025-07-04CDA 數(shù)據分析師:開啟數(shù)據職業(yè)發(fā)展新征程? ? 在數(shù)據成為核心生產要素的今天,數(shù)據分析師的職業(yè)價值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03