web-dev-qa-db-fra.com

Erreur d'interprétation Python, x ne prend aucun argument (1 donné)

J'écris un petit morceau de python comme devoir, et je ne le fais pas courir! Je n'ai pas beaucoup d'expérience en Python, mais je connais pas mal Java. J'essaie d'implémenter un algorithme d'optimisation de l'essaim de particules, et voici ce que j'ai: 

class Particle:    

    def __init__(self,domain,ID):
        self.ID = ID
        self.gbest = None
        self.velocity = []
        self.current = []
        self.pbest = []
        for x in range(len(domain)):
            self.current.append(random.randint(domain[x][0],domain[x][1])) 
            self.velocity.append(random.randint(domain[x][0],domain[x][1])) 
            self.pbestx = self.current          

    def updateVelocity():
    for x in range(0,len(self.velocity)):
        self.velocity[x] = 2*random.random()*(self.pbestx[x]-self.current[x]) + 2 * random.random()*(self.gbest[x]-self.current[x]) 


    def updatePosition():    
        for x in range(0,len(self.current)):
            self.current[x] = self.current[x] + self.velocity[x]    

    def updatePbest():
        if costf(self.current) < costf(self.best):
            self.best = self.current        

    def psoOptimize(domain,costf,noOfParticles=20, noOfRuns=30):
        particles = []
        for i in range(noOfParticles):    
            particle = Particle(domain,i)    
            particles.append(particle)    

        for i in range(noOfRuns):
            Globalgbest = []
            cost = 9999999999999999999
        for i in particles:    
        if costf(i.pbest) < cost:
                cost = costf(i.pbest)
            Globalgbest = i.pbest
            for particle in particles:
                particle.updateVelocity()
                particle.updatePosition()
                particle.updatePbest(costf)
                particle.gbest = Globalgbest    


        return determineGbest(particles,costf)

Maintenant, je ne vois aucune raison pour que cela ne fonctionne pas. Cependant, quand je le lance, j'obtiens cette erreur:

"TypeError: updateVelocity () ne prend aucun argument (1 donné)"

Je ne comprends pas! Je ne lui donne aucun argument!

Merci pour l'aide,

Linus

55
Linus

Python transmet implicitement l'objet aux appels de méthode, mais vous devez déclarer explicitement le paramètre correspondant. Ceci est habituellement nommé self:

def updateVelocity(self):
117
Fred Larson

Assurez-vous que toutes de vos méthodes de classe (updateVelocity, updatePosition, ...) prennent au moins un argument de position, nommé canoniquement self et faisant référence à l'instance actuelle de la classe.

Lorsque vous appelez particle.updateVelocity(), la méthode appelée obtient implicitement un argument: l'instance, ici particle comme premier paramètre. 

8
miku

Le paramètre explicite self dans sa définition manque dans votre méthode updateVelocity()

Devrait être quelque chose comme ça:

def updateVelocity(self):    
    for x in range(0,len(self.velocity)):
        self.velocity[x] = 2*random.random()*(self.pbestx[x]-self.current[x]) + 2 \
          * random.random()*(self.gbest[x]-self.current[x])

Vos autres méthodes (à l'exception de __init__) ont le même problème.

6
bgporter

Ce problème me laisse beaucoup perplexe, car je suis relativement nouveau en Python. Je ne peux pas appliquer la solution au code donné par le questionné, car ce n'est pas auto-exécutable. Alors j'apporte un code très simple:

from turtle import *

ts = Screen(); tu = Turtle()

def move(x,y):
  print "move()"
  tu.goto(100,100)

ts.listen();
ts.onclick(move)

done()

Comme vous pouvez le constater, la solution consiste à utiliser deux arguments (factices), même s'ils ne sont utilisés ni par la fonction ni par l'appel! Cela semble fou, mais je crois qu’il doit y avoir une raison (cachée au novice!).

J'ai essayé beaucoup d'autres moyens («moi» inclus). C'est le seul qui fonctionne (pour moi, au moins). 

0
Apostolos