【问题标题】:For Loop Python not running for lenFor Loop Python 没有为 len 运行
【发布时间】:2014-01-30 17:26:39
【问题描述】:

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

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

如您所见,for 循环应该根据包含四个受体对象地址的列表的长度来运行。运行一段时间后,它会第一次运行然后中断循环。

我已尝试包含所有内容

谢谢,

【问题讨论】:

  • 你应该把for i in range(len(receptors))...receptors[i]...改成for receptor in receptors...receptor...
  • for i in range(len(receptors)):在 Python 中是不行的。请改用for receptor in receptors:

标签: python list loops for-loop


【解决方案1】:

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

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

【讨论】:

  • 谢谢,有没有其他方法可以“返回”函数外的值?
  • 再看答案。
【解决方案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 而出现问题,则更容易找出原因。

【讨论】:

    【解决方案3】:

    如前所述,循环(和函数)在返回时立即退出。您应该将您的 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
    

    【讨论】:

      【解决方案4】:

      我们可以做得更好!

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

      这会根据每个受体是否与您传递的神经递质发生碰撞来构建Trues 和Falses 的列表。如果它们中的任何一个发生碰撞,则返回 True,如果没有碰撞,则返回 False

      【讨论】:

      • 我收到了一个语法错误!不确定到底在哪里!
      • 可能在缩进中。我可能错误地拆分了这些行,而 iirc 重要的是它是 Python2 还是 Python3 用于拆分没有 `. def spriteCollide(receptors,neurotransmitter):` 的行应该都在一行上,其余的都应该缩进一次下一行。
      • @AshleyCollinge 哎呀,不,这是因为我忘记了条件在列表组合中的位置。让我编辑....
      猜你喜欢
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      相关资源
      最近更新 更多