Python 解释器错误,x 不带参数(给定 1)

Posted

技术标签:

【中文标题】Python 解释器错误,x 不带参数(给定 1)【英文标题】:Python interpreter error, x takes no arguments (1 given) 【发布时间】:2011-05-25 15:06:13 【问题描述】:

我正在写一小段 python 作为家庭作业,但我没有让它运行!我没有那么多 Python 经验,但我知道很多 Java。 我正在尝试实现粒子群优化算法,这就是我所拥有的:

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)

现在,我认为这不应该起作用。 但是,当我运行它时,我得到了这个错误:

“TypeError:updateVelocity() 不接受任何参数(给定 1 个)”

我不明白!我没有给它任何论据!

感谢您的帮助,

莱纳斯

【问题讨论】:

我的源代码中没有空行,这就是本网站的格式。 低质量问题:由于混合的空格和制表符,许多不相关的代码具有许多语法错误。重复更好的问题***.com/q/6614123/448474 这是一个非常合理的问题!对于 Python 新手来说,产生的错误很常见。这是一个非常令人困惑的问题!您可以很容易地看到程序员在没有任何参数的情况下调用了“particle.updateVelocity()”,这就是应该如何调用它的想法。它是可以解决的,但不使用标准文档! Python 不是自然编译的,而是解释的。 CPython 是解释器,而不是编译器。 @J. C. Rocamonde:不,CPython 是a compiler and a bytecode interpreter。 【参考方案1】:

Python 隐式地将对象传递给方法调用,但您需要为其显式声明参数。这通常被命名为self

def updateVelocity(self):

【讨论】:

我刚开始学习python。至少现在我认为这很丑。 @fred 我很好奇你是通过在 IronPython 项目上工作的过程中一路探索了解到这一点的,还是有办法调试这种类型的错误?无论哪种方式我都想学习 =D @wiz-_-lee:老实说,我不记得我在哪里学的。我认为它来自 Python 教程,然后是经验。我从未使用过 IronPython 或 Jython,只使用过 CPython。 如果 python 在内部处理来自调用者的传递对象引用,那么为什么它没有在被调用的类行为中处理。得到这样的错误信息并且无法预测原因非常令人困惑。 这是那些讨厌的“陷阱”之一【参考方案2】:

确保所有类方法(updateVelocityupdatePosition、...)至少采用一个位置参数,该参数通常命名为 self,并引用类的当前实例。

当你调用particle.updateVelocity()时,被调用的方法会隐式获取一个参数:实例,这里particle作为第一个参数。

【讨论】:

【参考方案3】:

您的updateVelocity() 方法在其定义中缺少显式self 参数。

应该是这样的:

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

您的其他方法(__init__ 除外)有同样的问题。

【讨论】:

【参考方案4】:

我对这个问题很困惑,因为我是 Python 的新手。我不能将解决方案应用于被质疑者给出的代码,因为它不是自我可执行的。所以我带了一个很简单的代码:

from turtle import *

ts = Screen(); tu = Turtle()

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

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

done()

如您所见,解决方案在于使用两个(虚拟)参数,即使函数本身或调用它都没有使用它们!这听起来很疯狂,但我相信这一定是有原因的(对新手隐藏!)。

我尝试了很多其他方法(包括“自我”)。这是唯一有效的(至少对我而言)。

【讨论】:

这不是问题的答案。 move 不是类的方法,所以 self 没有任何意义。 move 作为回调函数提供。单击屏幕时,它将使用 x 和 y 值调用该函数。你不能使用它们,但你必须接受它们。 对,这适用于主模块的功能,而不是类。我为这个如此常见且令人费解的 Python 错误提供了一个通用的解决方案。

以上是关于Python 解释器错误,x 不带参数(给定 1)的主要内容,如果未能解决你的问题,请参考以下文章

Python:Django TypeError:object()不带参数

Python:类型错误:方法接收的参数多于给定的参数

SwiftUI 参数传递给不带参数的调用

Python 的几个命令行参数

遗传算法用python简单解释

Python之函数的参数