[英]Python, is map a class or function
它用作函數,但是為什么:
>>> help(map)
Help on class map in module builtins:
class map(object)
| map(func, *iterables) --> map object
|
| Make an iterator that computes the function using arguments from
| each of the iterables. Stops when the shortest iterable is exhausted.
|
| Methods defined here:
|
| __getattribute__(self, name, /)
| Return getattr(self, name).
...
如何理解上面的輸出,其中顯示了一個類和一些方法?
謝謝。
造成誤解的原因是文檔不完善,沒有對規范進行重大更改,或者是由於CPython實現敢於為規范中列出的內置函數編寫類。
在Python 2中,它是一個返回列表的函數。 在Python 2的在線文檔中,它在內置函數下列出 。 CPython 2.7.10的help(map)
的第一行讀取
幫助內置模塊中的內置功能圖
正確地將其稱為函數。
在Python 3中,他們更改了返回迭代器而不是列表的規范。 正如@RafaelC所指出的,它具有延遲加載的優點。 盡管它仍然在“ Built-n Functions”下,但CPython實現決定將其設為一個類。 此更改反映在您在問題中已經看到並引用的help(map)
。
在CPython 3中調用map()
時,您正在執行的操作是使用拋出的參數創建類map
的對象。 當您嘗試打印map()
返回的內容時,可以清楚地看到這一點。
CPython 2.7.10:
>>> map(int, "12345")
[1, 2, 3, 4, 5]
CPython 3.7.2:
>>> map(int, "12345")
<map object at 0x1023454e0>
因此,您顯然正在創建class map
的對象,這使您在help(map)
看到的內容聽起來非常不錯。
因此,對於CPython核心開發人員來說, 類可以是具有某些“功能”定義的“功能”。 這顯然是誤導的。 無論如何,它實現了使其能夠用作迭代器的必要方法。 (如文檔所述,如果您忽略它在內置函數下列出。)
用作功能
這是因為調用函數並獲取其返回值的語法與創建類對象(通過調用其初始化程序)並獲取對象相同。
例如,在return_value = my_function()
使用函數my_function()
在語法上與在my_object = my_class()
創建my_class()
的類對象沒有什么區別。 在CPython 3中調用map()
時,您正在創建class map
的對象。 但是,即使map
是一個函數,您也會編寫相同的內容。 這就是為什么你感到困惑。
簡而言之,
map
是 CPython 2 中的一個函數,但是是 CPython 3中的一個類。這在兩個版本的help(map)
中都很清楚,這就是CPython實現的作用。
該文檔將其保留在“內置函數”下,而CPython實現發現自由為其編寫類,從而引起混亂。
可惜的是,在文檔中沒有明確區分這兩者。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.