“需要浮动”错误

时间:2015-02-03 08:28:31

标签: python function

我已经看过很多问题,但是找不到答案。这是导致问题的代码片段:

常数:

antvelocity=float(10) #pixels per frame

代码的另一部分(randir()是一个全局函数):

def randir():
    n=float(random.randint(0,8))
    ang=(n*math.pi)/4

蚂蚁班:

class Ant:
    antx=0
    anty=0
    id=0

    def __init__(self,id):
        self.id=id
    def draw(self):
        SCREEN.blit(antimg,(self.antx,self.anty))
    def seek(self):
        randang=randir()
        velx=math.floor(float(antvelocity)*float(math.cos(randang)))
        vely=math.floor(float(antvelocity)*float(math.sin(randang)))
        self.antx=self.antx+velx
        self.anty=self.anty+velx
        self.draw()
        pygame.display.update()

        #Handling code for seeking
    def carry(self):
        pass
        #Handling code for carrying leaf

++++++++++++++++++++++++ ERROR +++++++++++++++++++++++++++++++

Traceback (most recent call last):
  File "/home/acisace/Python Projects/Gathering/gather.py", line 101, in <module>
    ant1.seek()
  File "/home/acisace/Python Projects/Gathering/gather.py", line 64, in seek
    velx=math.floor(float(antvelocity)*float(math.cos(randang)))
TypeError: a float is required

+++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++

请帮我纠正这个问题


谢谢大家。无法相信我错过了。

3 个答案:

答案 0 :(得分:2)

您的randir()功能不会返回任何内容:

def randir():
    n=float(random.randint(0,8))
    ang=(n*math.pi)/4

因此返回None

>>> import random, math
>>> def randir():
...     n=float(random.randint(0,8))
...     ang=(n*math.pi)/4
... 
>>> randir()
>>> randir() is None
True

然后,您将None值传递给math.cos()

math.cos(randang)

会抛出你的错误:

>>> math.cos(None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: a float is required

如果要解决此问题,则必须在函数中添加return语句:

def randir():
    n=float(random.randint(0,8))
    ang=(n*math.pi)/4
    return ang

答案 1 :(得分:1)

randang=randir()
velx=math.floor(float(antvelocity)*float(math.cos(randang)))

由于该代码段的第二行似乎是问题所在,最可能的原因是randang,因为float()不会要求一个浮点数,如果你做了float('a')这样愚蠢的事情,你会得到一个不同的错误:

  

ValueError:无法将字符串转换为float:a

事实上,randir的定义说明了原因:

def randir():
    n=float(random.randint(0,8))
    ang=(n*math.pi)/4

它没有专门返回任何内容,意味着您将获得None

作为一个更简单的例子,请参阅以下成绩单:

>>> def nothing():
...     pass
...

>>> print nothing()
None

>>> import math
>>> print math.cos(nothing())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: a float is required

你需要从randir()函数返回一个浮点数(或者成为浮点数的东西):

>>> def nothing():
...     return 0.5
...

>>> print nothing()
0.5

>>> import math
>>> print math.cos(nothing())
0.87758256189

在您的情况下,该功能应该是:

def randir():
    n = float(random.randint(0,8))
    ang = (n * math.pi) / 4
    return ang

答案 2 :(得分:1)

看起来randir正在返回None,这不是浮点数。 (如果您没有在任何给定函数中指定返回值,默认情况下它将返回None。)然后您将结果(存储在randang)中传递给cos,仅定义浮动。只需添加:

return ang

randir的结尾。