把我的功能变成一个班级

时间:2013-04-18 00:38:20

标签: python class

我的功能完全按照我的要求运行,但对于我的课程工作,我必须将此功能转换为以下类:

  • 必须有一个名为solveIt的函数,
  • 返回以下两个值:
    • 一个布尔值,如果你已经解决了这个背包问题,那就是True,
    • 背包对象,其中包含正确的值。

该类必须具有__str__()函数,该函数返回这样的字符串。第一行是大小,第二行是以逗号分隔的元素列表:

10
4,1,9,2,0,4,4,4,3,7

我不太了解课程,所以任何帮助都将受到赞赏。这是我现在的功能:

from itertools import combinations

def com_subset_sum(seq, target):
    if target == 0 or target in seq:
        print(target)
        return True

    for r in range(len(seq),1,-1):
        for subset in combinations(seq, r):
            if sum(subset) == target:
                print(subset)
                return True
    return False

print(com_subset_sum([4,1,9,2,0,4,4,4,3,7],10))

1 个答案:

答案 0 :(得分:1)

将函数转换为类的一种显而易见的方法是将函数参数(或其中一些参数)转换为对象属性。例如:

class Knapsack(object):
    def __init__(self, seq, target):
        self.seq = seq
        self.target = target
        self.solution = None
    def solveIt(self):
        if self.target == 0 or self.target in self.seq:
            self.solution = (target,)
            return True, self.solution
        for r in range(len(self.seq),1,-1):
            for subset in combinations(self.seq, r):
                if sum(subset) == self.target:
                   self.solution = subset
                   return True, self.solution
        return False, ()

现在你可以这样做:

>>> knapsack = Knapsack([4,1,9,2,0,4,4,4,3,7],10)
>>> print(knapsack.solveIt())
(True, (4, 1, 2, 0, 3))

然后,添加__str__方法很简单:

def __str__(self):
    if self.solution is None:
        self.solveIt()
    return '{}\n{}'.format(len(self.seq), 
                           ','.join(map(str, self.solution)))

我添加self.solution的原因是,一遍又一遍地调用__str__不会一直反复计算结果。您可以轻松地删除该成员并写下:

def __str__(self):
    solved, solution = self.solveIt()
    return '{}\n{}'.format(len(self.seq), 
                           ','.join(map(str, solution)))

无论哪种方式,我都不确定这比功能更好。 (事实上​​,它严格地更糟糕:使用该函数,你总是可以使用functools.partial来绑定序列,或者同时绑定序列和目标,或者当然两者都不绑定,而对于类,你总是必须在两者中绑定。)

也许你的教授给了你一些关于你如何使用这个可能有用的对象的提示?或者也许你的教授只是一个白痴,不知道如何为你教授关于课程的良好激励任务......