我在这里有一个名为factors
的函数,我用它来定义第二个函数permutations
。首先factors
:
def factors(x):
factors = []
for x in range(1,x+1):
factors.append(x)
return factors
我使用因子的下一段代码是:
import itertools as it
def permutations(x):
for p in it.permutations(factors(x)):
return(np.array(p))
当我尝试运行permutations(3)
时,它会返回:
array([1 2 3])
我似乎无法返回所有行,而只是获取数组的第一行。我试过打印它,打印工作:
import itertools as it
for p in it.permutations(factors(3)):
print(np.array(p))
返回:
[1 2 3]
[1 3 2]
[2 1 3]
[2 3 1]
[3 1 2]
[3 2 1]
我认为这与我返回的方式有关,因为我只是要求第一个数组,我不会以某种方式迭代它来显示所有数组。我希望它返回所有数组作为返回我的函数。
答案 0 :(得分:3)
当你的函数遇到一个return语句时,它返回for good。将return
更改为yield
以生成生成器:
def permutations(x):
for p in it.permutations(factors(x)):
yield np.array(p)
演示:
>>> list(permutations(3))
[array([1, 2, 3]), array([1, 3, 2]), array([2, 1, 3]), array([2, 3, 1]), array([3, 1, 2]), array([3, 2, 1])]
另一件事:你的factors
功能毫无意义。您可以使用range
执行相同的操作,例如:
>>> range(1, 5)
[1, 2, 3, 4]
所以行
for p in it.permutations(factors(x)):
应该写成
for p in it.permutations(range(1, x+1)):
最后,如果您使用的是Python 3.3或更高版本,则可以使用yield from
语法:
def permutations(x):
yield from map(np.array, it.permutations(range(1, x+1)))
答案 1 :(得分:1)
return
语句会立即终止该函数并返回给调用者。在你的情况下,这意味着它永远不会进入第二次循环迭代。
而不是for循环:
for p in it.permutations(factors(x)):
return(np.array(p))
尝试使用list comprehension构建数组:
return [np.array(p) for p in it.permutations(factors(x))]