【问题标题】:python function parameter screwing uppython函数参数搞砸了
【发布时间】:2011-02-10 03:41:24
【问题描述】:

所以我有

def gcd(a,b):
    if a == 0:
            return b
    while b != 0:
            if a > b:
                    a = a - b
            else:
                    b = b - a
    return a 

但是当我从控制台调用 gcd(1,2) 时,错误

Traceback(最近一次调用最后一次): 文件“”,第 1 行,在 G.gcd(1,2) TypeError: gcd() 只需要 2 个参数(给定 3 个)

来了....

这完全没有意义,因为我只给出了 2 个参数...

我做错了什么?

好的,所以我删除了其他所有内容,这是我班上唯一的内容:

import random
import math

class RSA:
    def gcd(a,b):
        if a == 0:
            return b
        while b != 0:
            if a > b:
                a = a - b
            else:
                b = b - a
        return a 

问题依旧

【问题讨论】:

  • 您还有更多未展示的内容。
  • 我真的不知道你使用的是什么版本,但对于 python 2.6 >= 你可以使用 from fractions import gcd 只是为了不重新发明轮子。

标签: python function parameters


【解决方案1】:

您将函数作为方法调用。添加“self”作为第一个参数,它会起作用。

【讨论】:

  • SpliFF 给出了相同的答案,而且比我早 14 秒。但我接受了。我想这是我的幸运日。
  • 或者,如果您不想添加“self”,只需调用未绑定的方法。然后它就像函数一样。应该是 RSA.gcd() 而不是 G.gcd()
【解决方案2】:

您尚未发布所有代码。您未发布的代码如下所示:

class SomeClass:

    def gcd(a,b):
        if a == 0:
                return b
        while b != 0:
                if a > b:
                        a = a - b
                else:
                        b = b - a
        return a 

G = SomeClass()
G.gcd(1,2)

在python中,当你定义一个类成员函数时,类实例会自动传递给该函数。将您的代码更改为如下所示:

class SomeClass:

    def gcd(a,b):
        if a == 0:
                return b
        while b != 0:
                if a > b:
                        a = a - b
                else:
                        b = b - a
        return a 

G = SomeClass()
G.gcd(1,2)

或者更好

def gcd( a,b):
    if a == 0:
            return b
    while b != 0:
            if a > b:
                    a = a - b
            else:
                    b = b - a
    return a 

gcd(1,2)

一切都会好起来的。

【讨论】:

    【解决方案3】:

    您可以像这样使用staticmethod 装饰器:

    ...
    class RSA:    
    
        @staticmethod
        def gcd(a,b):
            ...
    

    【讨论】:

    • 在正文中从不使用self 的实例方法是代码异味。这应该是一个静态方法,或者在类外部某处定义为函数
    【解决方案4】:

    如果 gcd 是类中的一个方法,那么你应该如下定义它:

    def gcd(self, a, b): 等等

    【讨论】:

      【解决方案5】:

      我怀疑(因为错误出现在您未提供的代码中)gcd 实际上是一种方法,而您将其称为 obj.gcd(a,b)。这被翻译为 gcd(self, a, b) = 3 个参数。您需要使用 self 参数定义函数。

      【讨论】:

        【解决方案6】:

        已经有一个公认的答案可以解决这个问题,但我想指出,(恕我直言)Python 中更惯用的解决方案是将类外的 gcd 方法移动到模块。

        我的意思是,这是一个通用功能。在 Python 中没有理由将其封装在一个类中。

        【讨论】:

          【解决方案7】:

          我刚刚将该代码放入 Python(在解释器模式下),它似乎工作得很好。您确定 gcd 没有在任何地方重新定义吗?如果我没记错的话,Python 将允许你在没有警告的情况下重新定义函数。

          【讨论】:

            【解决方案8】:

            您提供的代码在解释器中运行良好。如果您将 gcd() 作为方法调用,则需要添加“self”作为第一个参数。

                def gcd(self, a, b):
                    //...
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-04-16
              • 2012-11-06
              • 2020-10-13
              • 2014-01-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多