Облажался параметр функции Python - PullRequest
1 голос
/ 10 февраля 2011

так у меня

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) Ошибка типа: 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 

и проблема все еще сохраняется

Ответы [ 8 ]

7 голосов
/ 10 февраля 2011

Вы вызываете функцию как метод. Добавьте «self» в качестве первого аргумента, и он будет работать.

5 голосов
/ 10 февраля 2011

Вы не опубликовали весь свой код. Код, который вы не опубликовали, выглядит следующим образом:

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 голосов
/ 10 февраля 2011

Вы можете использовать декоратор staticmethod следующим образом:

...
class RSA:    

    @staticmethod
    def gcd(a,b):
        ...
2 голосов
/ 10 февраля 2011

если gcd является методом внутри класса, то вы должны определить его следующим образом:

def gcd (self, a, b): и т. Д.

1 голос
/ 10 февраля 2011

Уже есть принятый ответ, который решает проблему, но я хотел бы отметить, что (ИМХО) более идиоматическим решением в Python было бы перемещение метода gcd вне класса в обычную функцию вмодуль.

Я имею в виду, это функция общего назначения.В Python нет причин заключать его в класс.

1 голос
/ 10 февраля 2011

Я подозреваю (поскольку ошибка в коде, который вы не предоставили), что gcd на самом деле является методом, и вы называете его как obj.gcd (a, b).Это переводится как gcd (self, a, b) = 3 аргумента.вам нужно определить функцию с аргументом self.

0 голосов
/ 10 февраля 2011

Код, как вы его предоставили, прекрасно работает в интерпретаторе.Если вы вызываете gcd () в качестве метода, вам необходимо добавить «self» в качестве первого аргумента.

    def gcd(self, a, b):
        //...
0 голосов
/ 10 февраля 2011

Я только что бросил этот код в Python (в режиме интерпретатора), и он, кажется, работает просто отлично.Вы уверены, что gcd нигде не переопределяется?Python позволит вам переопределить функции без предупреждения, если я правильно помню.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...