【问题标题】:Why psi() takes 3 positional arguments but 4 were given?为什么 psi() 需要 3 个位置参数但给出了 4 个?
【发布时间】:2020-10-08 06:38:05
【问题描述】:

Emm,我知道类似的问题在stackoverflow中被问了很多次,但它们不起作用....而且我猜self是两次定义的。但是删除它也是错误的......它显示 psi() 接受 2 个位置参数,但给出了 3 个

所以我请人帮忙....

# -*- coding: utf-8 -*-
import math
import numpy as np
import matplotlib as plt

class HT(object):
    def __init__(self,vi=1.0,w=1.0,wave_number=101,dot_number=101,r=10.0):
        self.vi=vi
        self.w=w
        self.wave_number=wave_number
        self.dot_number=dot_number
        self.r=r
        self.H=np.zeros((wave_number,wave_number))
        for i in range(wave_number):
            for j in range(wave_number):
                self.H[i,j]=self.H_mn(i,j)

    def psi(self,x,si):
        return math.sqrt(self.vi/math.pi)*math.exp(-self.vi*(x-si)**2)

    def psi2(self,x,si):
        return self.psi(x,self.vi,si)*(2.0*self.vi*(-1.0+2.0*self.vi*(x-si)**2))

    def T_x(self,x,m,n):
        h=2.0*self.r/(self.wave_number-1.0)
        return -0.5*self.psi(x,-self.r+m*h)*self.psi2(x,-self.r+n*h)

    def V_x(self,x,m,n):
        h=2.0*self.r/(self.wave_number-1.0)
        return self.psi(x,-self.r+m*h)*0.5*self.w**2.0*x**2*self.psi(x,-self.r+n*h)

    def T_mn(self,m,n):
        T_mn=0.0
        hp=2.0*self.r/(self.dot_number)
        for i in range(self.dot_number):
            T_mn=T_mn+hp/3.0*(self.T_x(-self.r+2.0*i*hp,m,n)\
                              +4.0*self.T_x(-self.r+(2.0*i+1.0)*hp,m,n)\
                                 +self.T_x(-self.r+(2.0*i+2.0)*hp,m,n))
        return T_mn
    
    def V_mn(self,m,n):
        V_mn=0.0
        hp=2.0*self.r/(self.dot_number)
        for i in range(self.dot_number):
            V_mn=V_mn+hp/3.0*(self.V_x(-self.r+2.0*i*hp,m,n)\
                              +4.0*self.V_x(-self.r+(2.0*i+1.0)*hp,m,n)\
                                 +self.V_x(-self.r+(2.0*i+2.0)*hp,m,n))
        return V_mn
    
    def H_mn(self,m,n):
        return self.V_mn(m,n)+self.T_mn(m,n)
    
myht=HT()

【问题讨论】:

  • 如果你从它的类中调用函数,也就是self.your_func,你不必传递self参数,我的意思是你可以调用它self.psi(argument1,argument2),你试过了吗?
  • 不,它显示“无效语法”@YossiLevi
  • 在您的代码中一无所知,只是为了澄清这一点,我将函数 psi2 编辑为此 - return self.psi(x,self.vi)*(2.0*self.vi*(-1.0+2.0*self.vi*(x-si)**2)) ,并且没有遇到任何错误。注意你之前传递了 3 个参数,而不是我传递的 2 个(只是删除了其中一个)
  • 我找到了,损坏的bug...@YossiLevi

标签: python python-3.x class


【解决方案1】:

表示self是类的主体,不需要再次调用selfie,所以你的函数只能有2个变量

你的功能:

def psi(self,x,si):
    return math.sqrt(self.vi/math.pi)*math.exp(-self.vi*(x-si)**2)

如果你尝试这样称呼它:

self.psi(x,self.vi,si)

函数的第一个值:self

函数的第二个值:x

函数的第三个值:self.vi

你的函数值在你发送“si”之后完成,这将是第四个值和程序输出:

3 positional arguments but 4 were given.

你要做的就是让psi函数取值的个数:

def psi(self,x,si,other):
    .......

或在调用函数时指定较小的值,如下所示:

self.psi(x,self.vi)

或:

self.psi(self.vi,si)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 2021-10-05
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多