[英]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
它們的共同點是它們像減少一樣:它們遍歷一個可迭代的對象並將其“減少”到一個值。 這里的要點是,這些更多是一個構建塊。
例如,在應用它們之前,您經常將其迭代器包裝在生成器(或另一種理解,或諸如map
或filter
轉換)中:
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
操作中是不必要的。 它是list
或set
或其他任何東西,都沒有關系。 真正有用的是此容器中的元素。
因此,如果我們為list
定義__max__
動作,則實際上是在執行另一種完全不同的操作。 我們要求一個容器給我們有關最大價值的建議。
我認為在這種情況下,因為它是完全不同的操作,所以它應該是容器的一種方法,而不是覆蓋內置函數的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.