对于循环Python不运行len

时间:2014-01-30 17:26:39

标签: python list loops for-loop

我编写了一个for循环(见下文)来检查一个对象实例是否与任何其他四个对象实例发生冲突,如果发生碰撞,该函数应返回一个,以启动另一个反应链。 for循环意味着运行四次 - 它只运行一次,因此它不会检测到与三个受体的碰撞。

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

如您所见,for循环应基于包含四个受体对象的地址的列表长度来运行。经过一段时间后,它将第一次运行&然后打破循环。

我试图包含所有内容

谢谢,

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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的更改而出现问题,则更容易找出原因。

答案 2 :(得分:0)

正如已经提到的,循环(和函数)一旦返回就退出。你应该把你的return语句置于IF条件下。

例如(假设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

答案 3 :(得分:0)

我们可以做得更好!

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

根据每个受体是否与您传递的神经递质发生碰撞,构建TrueFalse的列表。如果其中任何一个发生碰撞,则返回True,如果没有碰撞,则返回False