簡體   English   中英

為什么在python中沒有針對__max__的特殊方法?

[英]Why isn't there any special method for __max__ in python?

正如標題所要求的。 Python有很多特殊的方法, __add____len____contains__等溫度。 為什么做max時沒有__max__方法? 示例代碼:

class A:
    def __max__():
        return 5

a = A()
max(a)

似乎range()和其他構造可以從中受益。 我是否缺少其他一些做max的有效方法?

附錄1:作為一個簡單的示例, max(range(1000000000))需要很長時間才能運行。

我沒有權威性的答案,但是我可以提供關於該主題的想法。

有幾個內置函數沒有相應的特殊方法。 例如:

  • max
  • min
  • sum
  • all
  • any

它們的共同點是它們像減少一樣:它們遍歷一個可迭代的對象並將其“減少”到一個值。 這里的要點是,這些更多是一個構建塊。

例如,在應用它們之前,您經常將其迭代器包裝在生成器(或另一種理解,或諸如mapfilter轉換)中:

sum(abs(val) for val in iterable)       # sum of absolutes
any(val > 10 for val in iterable)       # is one value over 10
max(person.age for person in iterable)  # the oldest person

這意味着在大多數情況下,它甚至不會調用iterable的__max__ ,而是嘗試在生成器上訪問它(該實現未實現且無法實現)。

因此,如果實施這些措施,根本沒有太大的好處。 在少數情況下,有必要實現它們,如果您創建自定義方法(或屬性),就會更加明顯,因為它突出顯示了這是“快捷方式”或與“正常結果”不同。

例如,這些函數( min等)具有O(n)運行時,因此,如果您可以做得更好(例如,如果您有排序列表,則可以訪問O(1)max ),則可能有意義明確記錄。

某些操作不是基本操作。 max為例,它實際上是一個基於比較的運算。 換句話說,當你得到一個最大值 ,你實際上得到一個最大的價值。

因此,在這種情況下,為什么我們要實現一個指定的max函數而不覆蓋比較行為呢?


換個方向思考, max到底是什么意思? 例如,當我們執行max(list) ,我們在做什么?

我認為我們實際上是在檢查list的元素,並且max操作根本與list本身無關。

list只是一個容器,在max操作中是不必要的。 它是listset或其他任何東西,都沒有關系。 真正有用的是此容器中的元素。

因此,如果我們為list定義__max__動作,則實際上是在執行另一種完全不同的操作。 我們要求一個容器給我們有關最大價值的建議。

我認為在這種情況下,因為它是完全不同的操作,所以它應該是容器的一種方法,而不是覆蓋內置函數的行為。

暫無
暫無

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

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