
小編今天跟大家分享的又是python的“為什么”系列的文章哦。大家都知道python是一款強(qiáng)大的數(shù)據(jù)分析工具,我們平常工作和生活中也總是會(huì)用到。但是對(duì)于python的一些基本理論卻是一知半解,希望通過小編今天給大家分享的這篇:Python 為什么會(huì)有個(gè)奇怪的“...”對(duì)象?的文章,使大家對(duì)于python有進(jìn)一步的了解。
以下文章來源: Python貓
作者:豌豆花下貓
在寫上一篇《Python 為什么要有 pass 語句?》時(shí),我想到一種特別的寫法,很多人會(huì)把它當(dāng)成 pass 語句的替代。在文章發(fā)布后,果然有三條留言提及了它。
所謂特別的寫法就是下面這個(gè):
# 用 ... 替代 pass def foo(): ...
它是中文標(biāo)點(diǎn)符號(hào)的半個(gè)省略號(hào),也即由英文的 3 個(gè)點(diǎn)組成。如果你是第一次看到,很可能會(huì)覺得奇怪:這玩意是怎么回事?PS:如果你知道它,仔細(xì)看過本文后,你同樣可能會(huì)覺得奇怪!
事實(shí)上,它是 Python 3 中的一個(gè)內(nèi)置對(duì)象,有個(gè)正式的名字叫作——Ellipsis,翻譯成中文就是“省略號(hào)”。
更準(zhǔn)確地說,它是一個(gè)內(nèi)置常量(Built-in Constant),是 6 大內(nèi)置常量之一(另外幾個(gè)是 None、False、True、NotImplemented、__debug__)。
關(guān)于這個(gè)對(duì)象的基礎(chǔ)性質(zhì),下面給出了一張截圖,你們應(yīng)該能明白我的意思:
“...“并不神秘,它只是一個(gè)可能不多見的符號(hào)型對(duì)象而已。用它替換 pass,在語法上并不會(huì)報(bào)錯(cuò),因?yàn)?Python 允許一個(gè)對(duì)象不被賦值引用。
嚴(yán)格來說, 這是旁門左道,在語義上站不住腳——把“...”或其它常量或已被賦值的變量放在一個(gè)空的縮進(jìn)代碼塊中,它們是與動(dòng)作無關(guān)的,只能表達(dá)出“這有個(gè)沒用的對(duì)象,不用管它”。
Python 允許這些不被實(shí)際使用的對(duì)象存在,然而聰明的 IDE 應(yīng)該會(huì)有所提示(我用的是Pycharm),比如告訴你:Statement seems to have no effect 。
但是“...”這個(gè)常量似乎受到了特殊對(duì)待,我的 IDE 上沒有作提示。
很多人已經(jīng)習(xí)慣上把它當(dāng)成 pass 那樣的空操作來用了(在最早引入它的郵件組討論中,就是舉了這種用法的例子)。但我本人還是傾向于使用 pass,不知道你是怎么想的呢?
... 在 PEP-3100 中被引入,最早合入在 Python 3.0 版本,而 Ellipsis 則在更早的版本中就已包含。
雖然官方說它們是同一個(gè)對(duì)象的兩種寫法,而且說成是單例的(singleton),但我還發(fā)現(xiàn)一個(gè)非常奇怪的現(xiàn)象,與文檔的描述是沖突的:
如你所見,賦值給 ... 時(shí)會(huì)報(bào)錯(cuò)SyntaxError: cannot assign to Ellipsis ,然而 Ellipsis 卻可以被賦值,它們的行為根本就不同嘛!被賦值之后,Ellipsis 的內(nèi)存地址以及類型屬性都改變了,它成了一個(gè)“變量”,不再是常量。
作為對(duì)比,給 True 或 None 之類的常量賦值時(shí),會(huì)報(bào)錯(cuò)SyntaxError: cannot assign to XXX,但是給 NotImplemented 常量賦值時(shí)不會(huì)報(bào)錯(cuò)。
眾所周知,在 Python 2 中也可以給布爾對(duì)象(True/False)賦值,然而 Python 3 已經(jīng)把它們改造成不可修改的。
所以有一種可能的解釋:Ellipsis 和 NotImplemented 是 Python 2 時(shí)代的遺留產(chǎn)物,為了兼容性或者只是因?yàn)楹诵拈_發(fā)者遺漏了,所以它們?cè)诋?dāng)前版本(3.8)中還可以被賦值修改。
... 出生在 Python 3 的時(shí)代,或許在將來會(huì)完全取代 Ellipsis。目前兩者共存,它們不一致的行為值得我們注意。我的建議:只使用"..."吧,就當(dāng) Ellipsis 已經(jīng)被淘汰了。
接下來,讓我們回到標(biāo)題的問題:Python 為什么要使用“...”對(duì)象?
這里就只聚焦于 Python 3 的“...”了,不去追溯 Ellipsis 的歷史和現(xiàn)狀。
之所以會(huì)問這個(gè)問題,我的意圖是想知道:它有什么用處,能夠解決什么問題?從而窺探到 Python 語言設(shè)計(jì)中的更多細(xì)節(jié)。
大概有如下的幾種答案:
官方文檔中給出了這樣的說明:
Special value used mostly in conjunction with extended slicing syntax for user-defined container data types.
這是個(gè)特殊的值,通常跟擴(kuò)展的切片語法相結(jié)合,用在自定義的數(shù)據(jù)類型容器上。
文檔中沒有給出具體實(shí)現(xiàn)的例子,但用它結(jié)合__getitem__() 和 slice() 內(nèi)置函數(shù),可以實(shí)現(xiàn)類似于 [1, ..., 7] 取出 7 個(gè)數(shù)字的切片片段的效果。
由于它主要用在數(shù)據(jù)操作上,可能大部分人很少接觸。聽說 Numpy 把它用在了一些語法糖用法上,如果你在用 Numpy 的話,可以探索一下都有哪些玩法?
... 可以被用作占位符,也就是我在《Python 為什么要有 pass 語句?》中提到 pass 的作用。前文中對(duì)此已有部分分析。
有人覺得這樣很 cute,這種想法獲得了 Python 之父 Guido 的支持 :
Python 3.5 引入的 Type Hint 是“...”的主要使用場合。
它可以表示不定長的參數(shù),比如Tuple[int, ...] 表示一個(gè)元組,其元素是 int 類型,但數(shù)量不限。
它還可以表示不確定的變量類型,比如文檔中給出的這個(gè)例子:
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í)無法確定,當(dāng)函數(shù)被調(diào)用時(shí),T 的實(shí)際類型才被確定。
在 .pyi 格式的文件中,... 隨處可見。這是一種存根文件(stub file),主要用于存放 Python 模塊的類型提示信息,給 mypy、pytype 之類的類型檢查工具 以及 IDE 來作靜態(tài)代碼檢查。
最后,我認(rèn)為有一個(gè)非常終極的原因,除了引入“...”來表示,沒有更好的方法。
先看看兩個(gè)例子:
兩個(gè)例子的結(jié)果中都出現(xiàn)了“...”,它表示的是什么東西呢?
對(duì)于列表和字典這樣的容器,如果其內(nèi)部元素是可變對(duì)象的話,則存儲(chǔ)的是對(duì)可變對(duì)象的引用。那么,當(dāng)其內(nèi)部元素又引用容器自身時(shí),就會(huì)遞歸地出現(xiàn)無限循環(huán)引用。
無限循環(huán)是無法窮盡地表示出來的,Python 中用 ... 來表示,比較形象易懂,除了它,恐怕沒有更好的選擇。
最后,我們來總結(jié)一下本文的內(nèi)容:
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營問題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當(dāng)下,精準(zhǔn)營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務(wù)數(shù)據(jù)分析:概念辨析與協(xié)同價(jià)值 在數(shù)據(jù)驅(qū)動(dòng)決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務(wù)數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實(shí)踐到業(yè)務(wù)價(jià)值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計(jì)模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價(jià)值導(dǎo)向 統(tǒng)計(jì)模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10