【问题标题】:How do I use values from a tuple which is in a list of tuples as arguments for a function?如何使用元组列表中的元组中的值作为函数的参数?
【发布时间】:2013-08-28 17:26:09
【问题描述】:

我正在尝试构建一个简单的瓷砖地图,作为一个更大项目的一部分,我提出的解决方案之一是使用如下函数:

def tile((value, X, Y)):
    if value == 1:
        pygame.draw.rect(screen, (0, 0, 0) (X, Y, 64, 64), 0)

我的想法是我将级别设置为一个元组列表,其中包含一个值,该值表示要在此处绘制的图块,然后是该图块的坐标。

这当然行不通,因为您不能使用元组作为参数。

我对此的解决方案是从列表中的元组中获取值:

def tile(value, X, Y):
    if value == 1:
        pygame.draw.rect(screen, (0, 0, 0) (X, Y, 64, 64), 0)


level = [(1, 0, 0), (rest of list)]
tile(level[0[0]], level[0[1]], level[0[2]])

哪个没用,给了我

Traceback (most recent call last):
tile(level[0[0]], level[0[1]], level[0[2]])
TypeError: 'int' object has no attribute '__getitem__'

有人对此有解决方法吗?我可以通过某种方式将元组作为一系列参数输入函数?或者我只是在使用一种永远不会奏效的完全特殊的方法?我猜这只是由于我的盲目无能,尽管我想被告知其他情况。

Python 2.7,pygame 1.9

【问题讨论】:

  • 实际上,您已经快到了;除了更简单的*level[0] 语法之外,您应该使用level[0][0], level[0][1], level[0][2]。相反,您的代码尝试索引整数(0[0] 尝试从 int0 获取项目 0,因此您的例外)。
  • "这当然行不通,因为你不能使用元组作为参数。" 这对我来说是个新闻。从什么时候开始?
  • 当我尝试使用它作为参数时,我得到了 TypeError: 'tuple' object is not callable

标签: python list python-2.7 pygame tuples


【解决方案1】:

你有一个关于处理任务的最佳方式的答案,但你这样做的具体问题是你需要做level[0][0]等,而不是level[0[0]]

【讨论】:

    【解决方案2】:

    您遇到的错误可以通过更改来解决:

    tile(level[0[0]], level[0[1]], level[0[2]])
    

    到这里:

    tile(level[0][0], level[0][1], level[0][2])
    

    你只是把括号放错地方了。

    另一个注意事项:您可以使用元组作为函数的参数,如下所示:

    def tile((value, X, Y)):
        if value == 1:
            pygame.draw.rect(screen, (0, 0, 0), (X, Y, 64, 64), 0)
    

    就像您在原始示例中所做的那样。然后将其余代码简化为:

    level = [(1, 0, 0), (rest of list)]
    tile(level[0])
    

    【讨论】:

    • 请注意,元组作为参数的语法在 Python 3 中已被删除。
    【解决方案3】:

    当你这样调用时,你需要解压你的元组:

    tile(*level[0])
    

    【讨论】:

      【解决方案4】:

      你当然可以将一个元组传递给一个函数,你的第一次尝试应该工作得很好:

      def tile((value, X, Y)):
        if value == 1:
          pygame.draw.rect(screen, (0, 0, 0), (X, Y, 64, 64), 0) # Note typo: missing comma
      level = [(1, 0, 0), (1, 10, 10), (1, 42, 99)]
      for x in level:
          tile(x)
      

      如果您希望同时传递所有图块,您也可以这样做。只需将 for 循环移动到您的函数中:

      def tile(l):
        for value, X, Y in l:
          if value == 1:
            pygame.draw.rect(screen, (0, 0, 0), (X, Y, 64, 64), 0)
      level = [(1, 0, 0), (1, 10, 10), (1, 42, 99)]
      tile(level)
      

      最后,如果您不想在函数中接受元组,但希望将数据保存在元组中,这也是一种选择。使用* 运算符:

      def tile(value, X, Y):
          if value == 1:
            pygame.draw.rect(screen, (0, 0, 0), (X, Y, 64, 64), 0)
      level = [(1, 0, 0), (1, 10, 10), (1, 42, 99)]
      for x in level:
          tile(*x)
      

      【讨论】:

        猜你喜欢
        • 2015-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-20
        • 1970-01-01
        • 2014-12-17
        • 2019-10-23
        相关资源
        最近更新 更多