Python 如何定义涉及for循环的迭代函数,其中迭代器i,j,l。。也用于定义的迭代函数中

Python 如何定义涉及for循环的迭代函数,其中迭代器i,j,l。。也用于定义的迭代函数中,python,list,function,loops,iterator,Python,List,Function,Loops,Iterator,我正在尝试使用递归函数来简化下面的“for循环”,用于根据需要运行程序的任意数量的循环。我可以定义一个递归函数,而不需要使用I,j,k,l。。。。在函数中,但我不知道或者我很难用I,j,k定义一个迭代函数。。。 如果有人能帮我想象一下,我会很高兴的 adjcent_spin_product_matrix = [] z_partial = 0 spin = [-1, 1] for i in spin: for j in spin: for k in spin:

我正在尝试使用递归函数来简化下面的“for循环”,用于根据需要运行程序的任意数量的循环。我可以定义一个递归函数,而不需要使用I,j,k,l。。。。在函数中,但我不知道或者我很难用I,j,k定义一个迭代函数。。。 如果有人能帮我想象一下,我会很高兴的

adjcent_spin_product_matrix = []
z_partial = 0
spin = [-1, 1]
for i in spin:
    for j in spin:
        for k in spin:
            for l in spin:
               for m in spin:
                   for o in spin:
                       for p in spin:
                           adjcent_spin_product_matrix = adjcent_spin_product_matrix + [i*j+ j*k+ k*l+ l*n+ m*o+ o*p]

如果您不想使用递归函数来实现这一点,那么可以使用递归函数。将循环的每个级别推送到堆栈中,以便以后可以将其弹出


堆栈是大多数语言中的基本数据结构,因为它是存储函数调用上下文的一种非常自然的方式,也是堆栈溢出的由来。

如果您不想使用递归函数来实现这一点,可以使用。将循环的每个级别推送到堆栈中,以便以后可以将其弹出


在大多数语言中,堆栈是一种基本的数据结构,因为它是存储函数调用上下文的一种非常自然的方式,也是堆栈溢出的由来。

我先前的回答是反对您未经编辑的帖子的,所以这里有一个更新:

从您提供的代码可以清楚地看出,您必须至少有
i
j
的循环

单独评估该循环会得到以下列表:
[1,-1,-1,1]


现在,编码中的每个后续嵌套循环仅复制此列表中的每个元素,然后添加上一个循环中的数组(重复两次):

i、j和k循环给出
[1,1,-1,-1,-1,-1,1]+[1,-1,-1,
1,1,-1,-1,1]=[2,0,-2,0,0,-2,0,2]

i、j、k和l循环给出
[1,1,1,1,1,-1,-1,-1,-1,-1,1,1]+[1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1]=[3,1,1,1,-1,1,-1,1,-1,-1,-1]

等等

因此,您可以简单地尝试以下方法:

adjacent_spin_product_matrix = []
ij_result = [1, -1, -1, 1]

def calc_product(adjacent_spin_product_matrix, number_of_indices):
    if number_of_indices == 2:
        return ij_result
    else:
        number_of_duplicates = 2 ** (number_of_indices - 2)
        curr_array = []
        for elem in ij_result:
            for dup in range(number_of_duplicates):
                curr_array.append(elem)
        prev_array = calc_product(adjacent_spin_product_matrix, number_of_indices - 1)
        temp_array = []
        temp_array.extend(prev_array)
        temp_array.extend(prev_array)
        result = []
        for i, elem in enumerate(curr_array):
            result.append(elem + temp_array[i])

        return result
现在,你应该发现:

print(calc_product([], 2))  # equivalent to i and j case
print(calc_product([], 3))  # equivalent to i, j, and k case
print(calc_product([], 4))  # equivalent to i, j, k, and l case
print(calc_product([], 5))  # equivalent to i, j, k, l, and m case
print(calc_product([], 6))  # equivalent to i, j, k, l, m, and o case
print(calc_product([], 7))  # equivalent to i, j, k, l, m, o, and p case
这些都给出了预期的结果:

[1, -1, -1, 1]
[2, 0, -2, 0, 0, -2, 0, 2]
[3, 1, -1, 1, -1, -3, -1, 1, 1, -1, -3, -1, 1, -1, 1, 3]
[4, 2, 0, 2, 0, -2, 0, 2, 0, -2, -4, -2, 0, -2, 0, 2, 2, 0, -2, 0, -2, -4, -2, 0, 2, 0, -2, 0, 2, 0, 2, 4]
[5, 3, 1, 3, 1, -1, 1, 3, 1, -1, -3, -1, 1, -1, 1, 3, 1, -1, -3, -1, -3, -5, -3, -1, 1, -1, -3, -1, 1, -1, 1, 3, 3, 1, -1, 1, -1, -3, -1, 1, -1, -3, -5, -3, -1, -3, -1, 1, 3, 1, -1, 1, -1, -3, -1, 1, 3, 1, -1, 1, 3, 1, 3, 5]
[6, 4, 2, 4, 2, 0, 2, 4, 2, 0, -2, 0, 2, 0, 2, 4, 2, 0, -2, 0, -2, -4, -2, 0, 2, 0, -2, 0, 2, 0, 2, 4, 2, 0, -2, 0, -2, -4, -2, 0, -2, -4, -6, -4, -2, -4, -2, 0, 2, 0, -2, 0, -2, -4, -2, 0, 2, 0, -2, 0, 2, 0, 2, 4, 4, 2, 0, 2, 0, -2, 0, 2, 0, -2, -4, -2, 0, -2, 0, 2, 0, -2, -4, -2, -4, -6, -4, -2, 0, -2, -4, -2, 0, -2, 0, 2, 4, 2, 0, 2, 0, -2, 0, 2, 0, -2, -4, -2, 0, -2, 0, 2, 4, 2, 0, 2, 0, -2, 0, 2, 4, 2, 0, 2, 4, 2, 4, 6]

我之前的回答是反对你未经编辑的帖子,所以这里有一个更新:

从您提供的代码可以清楚地看出,您必须至少有
i
j
的循环

单独评估该循环会得到以下列表:
[1,-1,-1,1]


现在,编码中的每个后续嵌套循环仅复制此列表中的每个元素,然后添加上一个循环中的数组(重复两次):

i、j和k循环给出
[1,1,-1,-1,-1,-1,1]+[1,-1,-1,
1,1,-1,-1,1]=[2,0,-2,0,0,-2,0,2]

i、j、k和l循环给出
[1,1,1,1,1,-1,-1,-1,-1,-1,1,1]+[1,1,-1,-1,-1,-1,1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,1]=[3,1,1,1,-1,1,-1,1,-1,-1,-1]

等等

因此,您可以简单地尝试以下方法:

adjacent_spin_product_matrix = []
ij_result = [1, -1, -1, 1]

def calc_product(adjacent_spin_product_matrix, number_of_indices):
    if number_of_indices == 2:
        return ij_result
    else:
        number_of_duplicates = 2 ** (number_of_indices - 2)
        curr_array = []
        for elem in ij_result:
            for dup in range(number_of_duplicates):
                curr_array.append(elem)
        prev_array = calc_product(adjacent_spin_product_matrix, number_of_indices - 1)
        temp_array = []
        temp_array.extend(prev_array)
        temp_array.extend(prev_array)
        result = []
        for i, elem in enumerate(curr_array):
            result.append(elem + temp_array[i])

        return result
现在,你应该发现:

print(calc_product([], 2))  # equivalent to i and j case
print(calc_product([], 3))  # equivalent to i, j, and k case
print(calc_product([], 4))  # equivalent to i, j, k, and l case
print(calc_product([], 5))  # equivalent to i, j, k, l, and m case
print(calc_product([], 6))  # equivalent to i, j, k, l, m, and o case
print(calc_product([], 7))  # equivalent to i, j, k, l, m, o, and p case
这些都给出了预期的结果:

[1, -1, -1, 1]
[2, 0, -2, 0, 0, -2, 0, 2]
[3, 1, -1, 1, -1, -3, -1, 1, 1, -1, -3, -1, 1, -1, 1, 3]
[4, 2, 0, 2, 0, -2, 0, 2, 0, -2, -4, -2, 0, -2, 0, 2, 2, 0, -2, 0, -2, -4, -2, 0, 2, 0, -2, 0, 2, 0, 2, 4]
[5, 3, 1, 3, 1, -1, 1, 3, 1, -1, -3, -1, 1, -1, 1, 3, 1, -1, -3, -1, -3, -5, -3, -1, 1, -1, -3, -1, 1, -1, 1, 3, 3, 1, -1, 1, -1, -3, -1, 1, -1, -3, -5, -3, -1, -3, -1, 1, 3, 1, -1, 1, -1, -3, -1, 1, 3, 1, -1, 1, 3, 1, 3, 5]
[6, 4, 2, 4, 2, 0, 2, 4, 2, 0, -2, 0, 2, 0, 2, 4, 2, 0, -2, 0, -2, -4, -2, 0, 2, 0, -2, 0, 2, 0, 2, 4, 2, 0, -2, 0, -2, -4, -2, 0, -2, -4, -6, -4, -2, -4, -2, 0, 2, 0, -2, 0, -2, -4, -2, 0, 2, 0, -2, 0, 2, 0, 2, 4, 4, 2, 0, 2, 0, -2, 0, 2, 0, -2, -4, -2, 0, -2, 0, 2, 0, -2, -4, -2, -4, -6, -4, -2, 0, -2, -4, -2, 0, -2, 0, 2, 4, 2, 0, 2, 0, -2, 0, 2, 0, -2, -4, -2, 0, -2, 0, 2, 4, 2, 0, 2, 0, -2, 0, 2, 4, 2, 0, 2, 4, 2, 4, 6]

不需要特别的递归函数

如果使用
itertools.product
,则可以对每个索引数使用单个循环;您也可以使用
sum
zip
简化计算

from itertools import product
...
spin_products = []
n = int(input('how many indices? '))
...
for indices in product([-1, 1], repeat=n):
    spin_products.append(sum(i*j for i, j in zip(indices, indices[1:])))

不需要特别的递归函数

如果使用
itertools.product
,则可以对每个索引数使用单个循环;您也可以使用
sum
zip
简化计算

from itertools import product
...
spin_products = []
n = int(input('how many indices? '))
...
for indices in product([-1, 1], repeat=n):
    spin_products.append(sum(i*j for i, j in zip(indices, indices[1:])))

我真的不明白。首先,
spin
是一个仅包含2个元素的列表,因此引用
spin[3]
等将导致脚本崩溃并出现错误。尽管所有这些循环都定义了循环变量
i
直到
p
,但您只使用了
i
j
k
。如果你不能提供一个有效的版本,或者我们无法理解你想做什么,那么没有人能够帮助你简化代码。但是现在这就更没有意义了。为什么要对相同的值迭代这么多次?我要解决的问题是要得到相邻自旋积的矩阵,最终的函数需要使用I,j,k。。。来描述矩阵。因此,对于每个自旋对[-1,1],都有一个for循环,for循环的数量取决于晶格点的数量。它只是自旋,而不是自旋[3]等等。。我重新编辑了代码。基本上,我想把所有for循环压缩成一个递归函数,我还想使用I,j,k。。。。从每个for循环中编写最终函数。所以,我想让你明白我,j,k,l。。。。。。参与代码。正如其他人所说,你的问题并不是有史以来提出的最清楚的。。。我已经发布了一个答案,我相信它的当前版本是中肯的,但不是100%(也不是95%);-)确定它正是你所要求的。你能告诉我,可以吗?还是我最好把它取下来?谢谢,我真的不明白。首先,
spin
是一个仅包含2个元素的列表,因此引用
spin[3]
等将导致脚本崩溃并出现错误。尽管所有这些循环都定义了循环变量
i
直到
p
,但您只使用了
i
j
k
。如果你不能提供一个有效的版本,或者我们无法理解你想做什么,那么没有人能够帮助你简化代码。但是现在这就更没有意义了。为什么要对相同的值迭代这么多次?我要解决的问题是要得到相邻自旋积的矩阵,最终的函数需要使用I,j,k。。。来描述矩阵。所以,对于每个自旋对[