tipos syntaxerror solucion sintaxis significa que print invalid imprimir errores error python object methods arguments

syntaxerror - Error de compilador de Python, x no toma argumentos(se da 1)



syntaxerror invalid syntax que significa (4)

Asegúrese de que todos los métodos de su clase ( updateVelocity , updatePosition , ...) tomen al menos un argumento posicional, que canónicamente se denomina self y se refiere a la instancia actual de la clase.

Cuando llamas a particle.updateVelocity() , el método llamado implícitamente obtiene un argumento: la instancia, aquí particle como primer parámetro.

Estoy escribiendo un pequeño trozo de pitón como una tarea, ¡y no voy a lograr que se ejecute! No tengo mucha experiencia con Python, pero conozco bastante Java. Estoy tratando de implementar un algoritmo de optimización de enjambre de partículas, y esto es lo que tengo:

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)

Ahora, no veo ninguna razón por la cual esto no debería funcionar. Sin embargo, cuando lo ejecuto, obtengo este error:

"TypeError: updateVelocity () no toma argumentos (se da 1)"

¡No entiendo! ¡No le doy ningún argumento!

Gracias por la ayuda,

Linus


Me ha intrigado mucho este problema, ya que soy totalmente nuevo en Python. No puedo aplicar la solución al código dado por el cuestionado, ya que no es auto ejecutable. Entonces traigo un código muy simple:

from turtle import * ts = Screen(); tu = Turtle() def move(x,y): print "move()" tu.goto(100,100) ts.listen(); ts.onclick(move) done()

Como puede ver, la solución consiste en utilizar dos argumentos (ficticios) , ¡incluso si no son utilizados por la función en sí o al invocarla! Suena loco, pero creo que debe haber una razón para ello (¡oculto para el novato!).

He intentado muchas otras formas (''yo'' incluido). Es el único que funciona (para mí, al menos).


Python pasa implícitamente el objeto a las llamadas a métodos, pero necesita declarar explícitamente el parámetro para ello. Esto se llama habitualmente self :

def updateVelocity(self):


Su método updateVelocity() tiene el parámetro self explícito en su definición.

Debería ser algo como esto:

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

Sus otros métodos (excepto __init__ ) tienen el mismo problema.