中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么理解Python內置對象

發布時間:2021-10-29 15:27:27 來源:億速云 閱讀:265 作者:iii 欄目:編程語言

這篇文章主要介紹“怎么理解Python內置對象”,在日常操作中,相信很多人在怎么理解Python內置對象問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么理解Python內置對象”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

所謂特別的寫法就是下面這個:

# 用 ... 替代 pass def foo():  ...

它是中文標點符號的半個省略號,也即由英文的 3  個點組成。如果你是第一次看到,很可能會覺得奇怪:這玩意是怎么回事?PS:如果你知道它,仔細看過本文后,你同樣可能會覺得奇怪!

1. 認識一下“...”內置常量

事實上,它是 Python 3 中的一個內置對象,有個正式的名字叫作——Ellipsis,翻譯成中文就是“省略號”。

更準確地說,它是一個內置常量(Built-in Constant),是 6 大內置常量之一(另外幾個是  None、False、True、NotImplemented、__debug__)。

關于這個對象的基礎性質,下面給出了一張截圖,你們應該能明白我的意思:

怎么理解Python內置對象

“...“并不神秘,它只是一個可能不多見的符號型對象而已。用它替換 pass,在語法上并不會報錯,因為 Python 允許一個對象不被賦值引用。

嚴格來說,  這是旁門左道,在語義上站不住腳——把“...”或其它常量或已被賦值的變量放在一個空的縮進代碼塊中,它們是與動作無關的,只能表達出“這有個沒用的對象,不用管它”。

怎么理解Python內置對象

Python 允許這些不被實際使用的對象存在,然而聰明的 IDE 應該會有所提示(我用的是Pycharm),比如告訴你:Statement seems  to have no effect 。

但是“...”這個常量似乎受到了特殊對待,我的 IDE 上沒有作提示。

很多人已經習慣上把它當成 pass 那樣的空操作來用了(在最早引入它的郵件組討論中,就是舉了這種用法的例子)。但我本人還是傾向于使用  pass,不知道你是怎么想的呢?

2. 奇怪的 Ellipsis 和 ...

... 在 PEP-3100 中被引入,最早合入在 Python 3.0 版本,而 Ellipsis 則在更早的版本中就已包含。

雖然官方說它們是同一個對象的兩種寫法,而且說成是單例的(singleton),但我還發現一個非常奇怪的現象,與文檔的描述是沖突的:

怎么理解Python內置對象

如你所見,賦值給 ... 時會報錯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  時代的遺留產物,為了兼容性或者只是因為核心開發者遺漏了,所以它們在當前版本(3.8)中還可以被賦值修改。

... 出生在 Python 3 的時代,或許在將來會完全取代  Ellipsis。目前兩者共存,它們不一致的行為值得我們注意。我的建議:只使用"..."吧,就當 Ellipsis 已經被淘汰了。

3. 為什么要使用“...”對象?

接下來,讓我們回到標題的問題:Python 為什么要使用“...”對象?

這里就只聚焦于 Python 3 的“...”了,不去追溯 Ellipsis 的歷史和現狀。

之所以會問這個問題,我的意圖是想知道:它有什么用處,能夠解決什么問題?從而窺探到 Python 語言設計中的更多細節。

大概有如下的幾種答案:

(1) 擴展切片語法

官方文檔中給出了這樣的說明:

Special value used mostly in conjunction with extended slicing syntax for  user-defined container data types.

這是個特殊的值,通常跟擴展的切片語法相結合,用在自定義的數據類型容器上。

文檔中沒有給出具體實現的例子,但用它結合__getitem__() 和 slice() 內置函數,可以實現類似于 [1, ..., 7] 取出 7  個數字的切片片段的效果。

由于它主要用在數據操作上,可能大部分人很少接觸。聽說 Numpy 把它用在了一些語法糖用法上,如果你在用 Numpy  的話,可以探索一下都有哪些玩法?

(2) 表達“未完成的代碼”語義

... 可以被用作占位符,也就是我在《Python 為什么要有 pass 語句?》中提到 pass 的作用。前文中對此已有部分分析。

有人覺得這樣很 cute,這種想法獲得了 Python 之父 Guido 的支持 :

怎么理解Python內置對象

(3) Type Hint 用法

Python 3.5 引入的 Type Hint 是“...”的主要使用場合。

它可以表示不定長的參數,比如Tuple[int, ...] 表示一個元組,其元素是 int 類型,但數量不限。

它還可以表示不確定的變量類型,比如文檔中給出的這個例子:

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 在函數定義時無法確定,當函數被調用時,T 的實際類型才被確定。

在 .pyi 格式的文件中,... 隨處可見。這是一種存根文件(stub file),主要用于存放 Python 模塊的類型提示信息,給  mypy、pytype 之類的類型檢查工具 以及 IDE 來作靜態代碼檢查。

(4) 表示無限循環

最后,我認為有一個非常終極的原因,除了引入“...”來表示,沒有更好的方法。

先看看兩個例子:

怎么理解Python內置對象

兩個例子的結果中都出現了“...”,它表示的是什么東西呢?

對于列表和字典這樣的容器,如果其內部元素是可變對象的話,則存儲的是對可變對象的引用。那么,當其內部元素又引用容器自身時,就會遞歸地出現無限循環引用。

無限循環是無法窮盡地表示出來的,Python 中用 ... 來表示,比較形象易懂,除了它,恐怕沒有更好的選擇。

最后,我們來總結一下本文的內容:

  • 是 Python 3 中的一個內置常量,它是一個單例對象,雖然是 Python 2 中就有的 Ellipsis  的別稱,但它的性質已經跟舊對象分道揚鑣

  • 可以替代 pass 語句作為占位符使用,但是它作為一個常量對象,在占位符語義上并不嚴謹。很多人已經在習慣上接受它了,不妨一用

  • 在 Python 中不少的使用場景,除了占位符用法,還可以支持擴展切片語法、豐富 Type Hint 類型檢查,以及表示容器對象的無限循環

  • 對大多數人來說,可能并不多見(有人還可能因為它是一種符號特例而排斥它),但它的存在,有些時候能夠帶來便利。希望本文能讓更多人認識它,那么文章的目的也就達成了~

到此,關于“怎么理解Python內置對象”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

黄浦区| 白银市| 娄烦县| 英吉沙县| 军事| 罗源县| 环江| 竹山县| 临城县| 微山县| 普格县| 阿克| 罗城| 泉州市| 福建省| 九江市| 漳浦县| 新干县| 安达市| 肇州县| 灵寿县| 黎平县| 筠连县| 恩平市| 遂昌县| 太仆寺旗| 杭锦后旗| 华亭县| 兴国县| 太保市| 六枝特区| 界首市| 五峰| 金寨县| 都匀市| 高平市| 洪江市| 大方县| 长子县| 原平市| 浮山县|