为什么python中没有任何特殊的方法来处理max?

2024-04-19 11:43:00 发布

您现在位置:Python中文网/ 问答频道 /正文

正如标题所要求的。Python有很多特殊的方法,__add____len____contains__等c。为什么在执行max时没有调用__max__方法?示例代码:

class A:
    def __max__():
        return 5

a = A()
max(a)

似乎range()和其他结构可以从中受益。我错过了其他有效的方法吗?¨

附录1: 作为一个简单的例子,max(range(1000000000))需要很长时间才能运行。你知道吗


Tags: 方法代码add标题示例lenreturndef
2条回答

我没有权威的答案,但我可以提出我对这个问题的看法。你知道吗

有几个内置函数没有相应的特殊方法。例如:

  • max
  • min
  • sum
  • all
  • any

它们有一个共同点,就是它们是reduce-like:它们迭代一个iterable,并将其“reduce”为一个值。这里的重点是,这些更像是一个积木。你知道吗

例如,在应用iterable之前,通常将其包装到生成器(或其他理解,或转换,如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到底是什么意思?例如,当我们执行max(list)时,我们在做什么?你知道吗

我认为我们实际上是在检查list的元素,而max操作与list本身根本没有关系。你知道吗

list只是max操作中不需要的容器。它是list或者set或者别的什么,都不重要。真正有用的是这个容器中的元素。你知道吗

因此,如果我们为list定义一个__max__操作,我们实际上在执行另一个完全不同的操作。我们要求一个集装箱给我们关于最大价值的建议。你知道吗

我认为在这种情况下,因为它是一个完全不同的操作,所以它应该是一个容器的方法,而不是重写内置函数的行为。你知道吗

相关问题 更多 >