2016-01-22 65 views
0

我实际上正在尝试创建一个函数来在90°左右转动一个双维列表(它必须适用于n行和n列)。 我找到了一种方法来做两个循环“for”,但它告诉我,当我尝试调用该函数时,生成器不是可自定义的。 当我一个月前开始使用Python时,我不知道发生器是什么,并且我没有清楚我在网上发现的东西。顺便说一下,由于语言的原因,我有麻烦研究隐藏在其他帖子中的答案。面对一个错误“发电机不可自付”

下面的代码,以向右转:

def Rotationversdroite(m,liste): 
    i = 0 
    x, y = 0, 0 
    z = m - 1 
    listebis = ([0]*(m) for i in range(m)) 
    for x in range(m): 
     for y in range(m): 
      listebis[y][z-x] = liste[x][y] 
    return listebis 
+0

当你想让它成为一个列表时,你的'listebis'是一个生成器。将括号替换为parantheses。 – L3viathan

回答

1

您正在使用生成器表达式分配发生器到listebis变量。

与列表理解

listebis = [[0] * m for i in range(m)] 
1
简而言之发电机

在迭代(通常是循环)用于替换

listebis = ([0]*(m) for i in range(m)) 

非常相似列表或元组,但不存储迭代每个值一次可以节省内存空间。

当你写

listebis = ([0]*(m) for i in range(m)) 

它实际上并没有执行循环和每一个值一次存储,而是设置了一个过程,可以基于指定的循环值。

要运行的循环和存储在列表中的结果改变行之一:

listebis = list([0]*(m) for i in range(m)) 
listebis = [[0]*(m) for i in range(m)]  #square brackets instead of round 

在一个侧面说明,你不必初始化I,X,或y,因为它们会在它们各自的循环开始时被初始化。