Python类/函数和自参数

2024-04-19 10:45:46 发布

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

我有一些简单的代码来查找两个元素的索引,它们加起来就是一个和。(假设sum存在于列表中)

class Solution(object):
    def twoSum(self, nums, target):
        compliment = []
        for ind, item in enumerate(nums):
            print(ind)
            if item in compliment:
                return [nums.index(target - item), ind]
            compliment.append(target - item)
        return [0, 0]

if __name__ == "__main__":

    result = Solution()
    final = result.twoSum([3, 3], 6)

    #Why does this not work without removing the self parameter??
    #final = Solution.twoSum([3, 3], 6)

    print(str(final))

我正在尝试学习如何在Python中最好地实例化一个对象。在我的主要函数中,我想我应该简化它,用一行代替两行。您可以看到我在这个类中调用函数的两次尝试。第二个失败,除非我从函数参数中删除self参数。因为我想传递2个参数而不是3个参数。你知道吗

不管怎样,我很困惑为什么我的两个实现是不同的,为什么一个可以工作而另一个不行,我也不确定我是否需要self。self似乎主要是在您有__init__并且正在为类定义变量时使用的?既然我不在这里,我还需要它吗?你知道吗


Tags: inselftarget参数returnifresultitem
2条回答

self参数只对实例方法是必需的(并且只起作用)。实例方法也是默认类型。要在没有实例和self参数的情况下使用它,请将其修饰为staticmethod

class Solution(object):
    @staticmethod
    def twoSum(nums, target):
        compliment = []
        for ind, item in enumerate(nums):
            print(ind)
            if item in compliment:
                return [nums.index(target - item), ind]
            compliment.append(target - item)
        return [0, 0]

if __name__ == "__main__":

    final = Solution.twoSum([3, 3], 6)
    print(str(final))

在Python中,您可以选择将函数装饰为staticmethod或classmethod。对于classmethod,您需要在方法签名中有cls。下面是一个很好的讨论来区分两者:

What is the difference between @staticmethod and @classmethod?

顺便说一句-对于您的代码,我强烈建议使用集合而不是数组。它将使您的代码更加高效。检查目标值是否已在集合中出现是一个平均时间不变的操作。你知道吗

相关问题 更多 >