【问题标题】:TypeError in a simple random walk model--Python简单随机游走模型中的 TypeError——Python
【发布时间】:2012-02-08 15:46:12
【问题描述】:

我一直在看MIT公开课学习python,在第17讲随机游走模拟模型之后,我写了一段简单的代码,但是它不起作用,并且显示如下错误:“TypeError: 'drunk' 对象不可调用”。希望有人能帮我找出问题所在。

from math import*
import random,pylab

    class location(object):

    def __init__(self,x,y):
        self.x=x
        self.y=y
    def move(self,xc,yc):
        return location(self.x+float(xc),self.y+float(yc))
    def getCoordinates(self):
        return self.x,self.y
    def getDistance(self,other):
        ox,oy=other.getCoordinates()
        x=fabs(other.x-self.x)
        y=fabs(other.y-self.y)
        return sqrt(x**2+y**2)


class compasspt(object):

    possibles=('n','s','e','w')
    def __init__(self,pt):
        if pt in self.possibles:
            self.pt=pt
        else:
            raise ValueError
    def move(self,dist):
        if self.pt=='n':return (0,dist)
        elif self.pt=='s':return (0,-dist)
        elif self.pt=='w':return (dist,0)
        elif self.pt=='e':return (-dist,0)
        else:raise ValueError


class field(object):

    def __init__(self,drunk,location):
        self.drunk=drunk
        self.location=location
    def move(self,cp,dist):
        oldLocation=self.location
        xc,yc=cp.move(dist) # shadowing
        self.location=oldLocation.move(xc,yc)
    def getLocation(self):
        return self.location
    def getDrunk(self):
        return self.drunk


class drunk(object):
    def __init__(self,name):
        self.name=name
    def move(self,field,time=1):
        if field.getDrunk()!=self:
            raise ValueError('the drunk is not in the field.')
        for i in range(time):
            pt=compasspt(random.choice(compasspt.possibles)) # random walk
            field.move(pt,1)    # shadowing


def performTrial(time,f):
    start=f.getLocation()
    distances=[0.0]
    for t in range(1,time+1):
        f.getDrunk().move(f)
        newLocation=f.getLocation()
        distance=newLocation.getDistance(start)
        distances.append(distance)
    return distances


drunk=drunk('Alexander')
for i in range(3):
    f=field(drunk,location(0,0))
    distances=performTrial(1000,f)
    pylab.plot(distances)
pylab.title('Alexander\'s random walk')
pylab.xlabel('Time')
pylab.ylabel('Distance from Origin')


def performSimulation(time, numTrials):
    distLists=[]
    for trial in range(numTrials):
        d = drunk('Drunk'+str(trial))
        f=field(d,location(0,0))
        distances=performTrial(time,f)
        distLists.append(distances)
    return distLists


def ansQuest(maxTime,numTrials):
    means=[]
    distLists=performSimulation(maxTime,numTrials)
    for t in range(maxTime+1):
        tot=0.0
        for distL in distLists:
            tot+=distL[t]
        means.append(tot/len(distL))
    pylab.figure()
    pylab.plot(means)
    pylab.ylabel('distance')
    pylab.xlabel('time')
    pylab.title('Average Distance vs. Time('+str(len(distLists))+'trials)')

ansQuest(1000,300)
pylab.show()

【问题讨论】:

    标签: python typeerror


    【解决方案1】:

    我认为您的问题来自于对类名和实例名都使用醉酒...尝试将您的类更改为醉酒,然后

    drunk=Drunk('Alexander')
    

    还有……

    d = Drunk('Drunk'+str(trial))
    

    我没有安装 pylab,所以我删除了所有这些行并且它运行干净(尽管没有输出)

    我正在和 o'Reilly 一起学习 Python,实际上我正在尝试在作业中回答问题,所以我希望这对你有所帮助。

    【讨论】:

    • 嘿,不客气。你介意我把这个给我的导师看吗?另外,你如何找到麻省理工学院的课程?它是复杂的还是相当容易的?
    • 没关系。这些课程内容广泛,但并不难学。我认为对初学者来说很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    相关资源
    最近更新 更多