Python 把我的函数变成一个类

Python 把我的函数变成一个类,python,class,Python,Class,我有一个函数,它的工作方式完全符合我的要求,但在我的课程工作中,我必须将此函数转换为一个类: 必须具有名为solveIt的函数 返回以下两个值: 一个布尔值,如果你已经解决了这个背包问题,那么它是真的,并且 背包对象中包含正确的值 该类必须有一个返回如下字符串的\uuuu str\uuu()函数。第一行是大小,第二行是以逗号分隔的元素列表: 10 4,1,9,2,0,4,4,4,3,7 我不太懂课程,所以任何帮助都将不胜感激。以下是我现在拥有的功能: from itertools im

我有一个函数,它的工作方式完全符合我的要求,但在我的课程工作中,我必须将此函数转换为一个类:

  • 必须具有名为
    solveIt
    的函数
  • 返回以下两个值:
    • 一个布尔值,如果你已经解决了这个背包问题,那么它是真的,并且
    • 背包对象中包含正确的值
该类必须有一个返回如下字符串的
\uuuu str\uuu()
函数。第一行是大小,第二行是以逗号分隔的元素列表:

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))

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

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))
然后,添加
\uuuu str\uuu
方法很简单:

def __str__(self):
    if self.solution is None:
        self.solveIt()
    return '{}\n{}'.format(len(self.seq), 
                           ','.join(map(str, self.solution)))
我之所以添加了
self.solution
,是因为反复调用
\uuuu str\uuuu
不会一直反复计算结果。您也可以轻松地删除该成员并编写以下内容:

def __str__(self):
    solved, solution = self.solveIt()
    return '{}\n{}'.format(len(self.seq), 
                           ','.join(map(str, solution)))
不管怎样,我不确定这是如何比函数更好。(事实上,更糟糕的是:对于函数,您始终可以使用
functools.partial
仅绑定序列,或者同时绑定序列和目标,或者当然都不绑定,而对于类,您始终必须同时绑定两者。)


也许你的教授给了你一些提示,告诉你如何使用这个物体,这可能会有所帮助?或者你的教授只是个白痴,不知道如何想出一个好的激励性作业来教你关于类的知识……

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

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))
然后,添加
\uuuu str\uuu
方法很简单:

def __str__(self):
    if self.solution is None:
        self.solveIt()
    return '{}\n{}'.format(len(self.seq), 
                           ','.join(map(str, self.solution)))
我之所以添加了
self.solution
,是因为反复调用
\uuuu str\uuuu
不会一直反复计算结果。您也可以轻松地删除该成员并编写以下内容:

def __str__(self):
    solved, solution = self.solveIt()
    return '{}\n{}'.format(len(self.seq), 
                           ','.join(map(str, solution)))
不管怎样,我不确定这是如何比函数更好。(事实上,更糟糕的是:对于函数,您始终可以使用
functools.partial
仅绑定序列,或者同时绑定序列和目标,或者当然都不绑定,而对于类,您始终必须同时绑定两者。)


也许你的教授给了你一些提示,告诉你如何使用这个物体,这可能会有所帮助?或者你的教授只是一个白痴,不知道如何想出一个好的激励性作业来教你关于课程的知识……

这需要成为一门课程吗?我的意思是,功能摇滚。如果是一门课程,它们通常都是非常不即时的。相信我,我希望它不必是一门课,但老师强制它成为一门课。我想如果我先做一个函数,我可能会理解如何自己做一个课程,但是我没有运气,我完全不知道你从讲师那里得到的信息是否比“做一个……的课程”更多?例如,如果您要向背包对象添加多个不同的操作,这将是创建
knapsack
类的一个很好的理由。或者,如果你想用不同的目标评估同一序列,也许可以跟踪你检查过的所有目标。或者…有很多很好的理由。当然,有一个非常常见的不好的原因:一个不知道如何写出好作业的老师。但我不想只是假设…是的,还有一些说明,但他们没有解释太多我这里有,如果你想看的话:这需要是一门课吗?我的意思是,功能摇滚。如果是一门课程,它们通常都是非常不即时的。相信我,我希望它不必是一门课,但老师强制它成为一门课。我想如果我先做一个函数,我可能会理解如何自己做一个课程,但是我没有运气,我完全不知道你从讲师那里得到的信息是否比“做一个……的课程”更多?例如,如果您要向背包对象添加多个不同的操作,这将是创建
knapsack
类的一个很好的理由。或者,如果你想用不同的目标评估同一序列,也许可以跟踪你检查过的所有目标。或者…有很多很好的理由。当然,有一个非常常见的不好的原因:一个不知道如何写出好作业的老师。但我不想只是假设……是的,还有一些说明,但它们没有解释我这里的内容之外的内容,如果你想看的话,它们是:谢谢你的帮助,但是当我真的要运行代码时,它给了我错误:“未定义全局名称组合您仍然需要在开始时使用itertools导入组合中的
。如果你能写函数的话,我想你会理解import…好吧,当我运行它的时候,我以为我在里面,对不起,我是个傻瓜。有没有一种方法可以让解决方案打印出来,就像我把目标放在最上面的第一行,然后把解决方案设置在下面的一行,用逗号隔开一样?我想“大小”是指
len(seq)
。如果您想要目标,只需将
len(self.seq)
更改为
self.target
。除此之外,它已经满足了你的要求。你真的试过了吗?是的,我运行了它,结果是:(真的,(4,1,2,0,3))谢谢你的帮助,但是当我真的运行代码时,它给了我一个错误:“未定义全局名称组合您仍然需要在开始时使用itertools导入组合中的
。如果你能写函数,我想你会理解import