簡體   English   中英

Python,是映射類或函數

[英]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是一個函數,您也會編寫相同的內容。 這就是為什么你感到困惑。


簡而言之,

  1. map CPython 2 中的一個函數,但是 CPython 3中的一個類。這在兩個版本的help(map)中都很清楚,這就是CPython實現的作用。

  2. 該文檔將其保留在“內置函數”下,而CPython實現發現自由為其編寫類,從而引起混亂。

  3. 可惜的是,在文檔中沒有明確區分這兩者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM