为了循环python没有跑步



我已经写了一个for loop(见下文),以检查一个对象实例是否与其他四个对象实例相撞,如果发生碰撞,该函数应返回一个,以启动另一个反应链。for循环是四次运行 - 它只能通过一次,因此它没有检测到与三个受体的碰撞。

def spriteCollide(neurotransmitter1):
    print len(receptors)
    for i in range(len(receptors)):
        return receptors[i].receptorObjectInstance.colliderect(neurotransmitter1.neurotransmitterObjectInstance)

您可以看到,FO循环应根据包含四个受体对象地址的列表的长度进行操作。经过一会儿,它将第一次运行&然后打破循环。

我尝试包括所有内容

谢谢,

第一次到达return语句时,周期退出。存储结果,然后返回存储的值:

def spriteCollide(neurotransmitter1):
    result = []
    print len(receptors)
    for i in range(len(receptors)):
        result.append(receptors[i].receptorObjectInstance.colliderect(neurotransmitter1.neurotransmitterObjectInstance)
    return result

return将停止函数并返回值。如果您想要所有值,请尝试将它们附加到列表/字典中并返回。

def spriteCollide(neurotransmitter1, receptors):  # add receptors as a param
    values = []  # create an empty list to store you processed data
    print len(receptors)  # I assume this was for testing
    for i in range(len(receptors)):
        values.append(receptors[i].receptorObjectInstance.colliderect(neurotransmitter1.neurotransmitterObjectInstance))  # appends the reulst of collideDirect() to values
    return values  # returns the list so you can use it.

您还应该考虑将receptors作为函数的参数传递。将所有内容保留在正确的范围内,如果出现问题,则由于功能外的receptors发生了更改,将更容易弄清楚为什么。

正如已经提到的那样,循环(和函数)击中返回后立即退出。您应该将返回声明放在条件下。

例如(假设Colliderect()返回1或0 ...或true或false),如果发生任何相撞,则应返回1:

def spriteCollide(neurotransmitter1):
    print len(receptors)
    for i in range(len(receptors)):
        if receptors[i].receptorObjectInstance.colliderect(neurotransmitter1.neurotransmitterObjectInstance):
            return 1
    return 0

我们可以使它变得更好!

def spriteCollide(receptors,neurotransmitter):
    return any( [True if
                    receptorObjectInstance.colliderect(neurotransmitter.neurotransmitterObjectInstance)
                    else False for receptor in receptors] )

这是根据每个受体是否与您通过的神经递质碰撞的True S和False S列表。如果其中任何一个碰撞,它将返回True,如果没有碰撞,则False

最新更新