【问题标题】:Python min overridePython 最小覆盖
【发布时间】:2016-01-14 19:16:07
【问题描述】:

在 Python 3 中,我为特定数据结构创建了一个自定义类 C,可用作可迭代对象。

但是该类确保对于C 中的任何数据结构cc[0] 将是c 中所有值的最小值。

有没有一种方法可以让min(c) 的调用简单地返回c[0] 而不会无用地探索所有结构? (如果c 为空,则像往常一样使用ValueError

【问题讨论】:

  • 我不这么认为。如果 Python 真的是面向对象的,那不是很好吗? :P
  • min() 基本上用于多个对象(或列表/可迭代)。简单地定义一个实例方法min() 并从中返回c[0] 不是更好吗?并调用 c.min() 而不是 min(c)
  • @AnandSKumar 可能,但更不像pythonic!
  • 是什么让你觉得它不那么 Pythonic?
  • 能否请您粘贴C 班级的代码?

标签: python python-3.x overriding minimum


【解决方案1】:

有没有一种方法可以简单地调用 min(c) 返回 c[0]?

是的,有两种方法:

第一个是修改python源码,改变内置函数结构,一点都不明智和理性。

第二种方法是在相对命名空间中创建自己的 min 函数。

实际上基于称为LEGB manner的python名称解析方案,当您在范围内使用非限定名称时,Python最多搜索四个范围,本地(L)范围,然后是任何封闭的本地范围( E)范围(如果存在),然后是全局(G)范围,然后是内置(B)范围。因此,由于此规则,内置范围将在最后进行搜索,您可以简单地创建一个新范围在这个范围的顶层。

但请注意,在这种情况下,您不能使用前面的 min 函数,如果碰巧使用了它,您可以使用 del 语句删除装扮函数。

但完成此任务的另一种 Python 方法是在您的类中创建一个 min 函数并将其用作属性:

>>> class C(object):
...    def __init__(self):
...        self.index = 0
...        self.iterable = range(10)
...    def __iter__(self):
...        return self
...    def min(self):
...      try:
...          return self.iterable[self.index]
...      except IndxError:
...          raise Exception('The index is out of range')
>>> c=C()
>>> 
>>> c.min()
0
>>> c.iterable=[5,1,4,8]
>>> c.min()
5

请注意,在这种情况下,您可以为 min 函数指定默认索引以返回相关项。

【讨论】:

    猜你喜欢
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    相关资源
    最近更新 更多