For循环Python没有为len运行

For循环Python没有为len运行,python,list,loops,for-loop,Python,List,Loops,For Loop,我编写了一个for循环(见下文)来检查一个对象实例是否与任何四个其他对象实例发生了碰撞,如果发生了碰撞,函数应该返回一个,以启动另一个反应链。for循环要运行四次——它只运行一次,所以它没有检测到与三个受体的碰撞 def spriteCollide(neurotransmitter1): print len(receptors) for i in range(len(receptors)): return receptors[i].receptorObjectIn

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

def spriteCollide(neurotransmitter1):
    print len(receptors)
    for i in range(len(receptors)):
        return receptors[i].receptorObjectInstance.colliderect(neurotransmitter1.neurotransmitterObjectInstance)
如您所见,for循环应该根据包含四个对象地址的列表的长度来运行。经过一段时间的运行,它将第一次运行&然后打破循环

我试着把一切都包括进去


谢谢,

循环在第一次到达
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):
    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.

您还应该考虑将
接收器
作为函数的参数传递。将所有内容保持在正确的范围内会更容易,如果由于函数外部对接收器的更改而出现错误,则更容易找出原因。

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

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.

您还应该考虑将
接收器
作为函数的参数传递。将所有内容都保持在正确的范围内会更容易,如果由于函数外部对接收器的更改而出现问题,则更容易找出原因。

正如前面提到的,循环(和函数)一点击返回就退出。您应该将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

如前所述,循环(和函数)一到达return就退出。您应该将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

我们可以做得更好

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

这将根据每个受体是否与你传递的神经递质发生碰撞,建立一个
True
s和
False
s的列表。如果其中任何一个发生碰撞,它将返回
True
,如果没有碰撞,它将返回
False

我们可以改进这一点

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

这将根据每个受体是否与你传递的神经递质发生碰撞,建立一个
True
s和
False
s的列表。如果其中任何一个发生冲突,它将返回
True
,如果没有冲突,它将返回
False

谢谢,有没有其他方法可以“返回”函数外的值?再次查看答案。谢谢,有没有其他方法可以“返回”函数外的值?再次查看答案。您应该为范围内的i(len(受体))更改
受体[i]
。。。简单地
表示受体中的受体
表示受体
表示范围内的i(len(受体)):
在Python中是不允许的。对受体中的受体使用
代替。你应该为范围内的i(len(受体))更改
受体[i]
。。。简单地
表示受体中的受体
表示受体
表示范围内的i(len(受体)):
在Python中是不允许的。对receptor中的receptor使用
。我得到了一个语法错误!真的不知道在哪里!可能在缩进里。我可能把这些行分割错了,iirc不管它是Python2还是Python3,都可以在没有
的情况下分割行定义spriteCollide(受体,神经递质):`应该都在一行上,其余的都应该在下一行缩进一次。@AshleyCollinge噢,不是,因为我忘了条件在列表comp中的位置。让我编辑…我得到一个语法错误!真的不知道在哪里!可能在缩进里。我可能把这些行分割错了,iirc不管它是Python2还是Python3,都可以在没有
的情况下分割行定义spriteCollide(受体,神经递质):`应该都在一行上,其余的都应该在下一行缩进一次。@AshleyCollinge噢,不是,因为我忘了条件在列表comp中的位置。让我来编辑。。。。