首页 > 解决方案 > python - 如何定义一个创建与python相互嵌入的for循环的函数?

问题描述

我正在使用 python3 编程。我一直在寻找一个程序,它可以生成 16 个和弦(用于作曲)的每种组合,可以在 C 和弦或 G 和弦之间进行选择。我成功地使用了这段代码:

chords = ['C', 'G']
progressions = []

 for chord1 in chords:
     for chord2 in chords:
         for chord3 in chords:
             for chord4 in chords:
                 for chord5 in chords:
                     for chord6 in chords:
                         for chord7 in chords:
                             for chord8 in chords:
                                 for chord9 in chords:
                                     for chord10 in chords:
                                         for chord11 in chords:
                                             for chord12 in chords:
                                                 for chord13 in chords:
                                                     for chord14 in chords:
                                                         for chord15 in chords:
                                                                  for chord16 in chords:

                                                                       progressions.append([chord1, chord2, chord3, chord4,
                                                                                 chord5, chord6, chord7, chord8,
                                                                                 chord9, chord10, chord11, chord12,
                                                                                 chord13, chord14, chord15, chord16]
                                                                                )
 print(progressions)
 print(f'{len(progressions)} progressions generated.')

这是我得到的输出(这是我需要的确切输出):[ ... ['G','G','G','G','G','G','G' , 'G', 'G', 'G', 'G', 'G', 'C', 'G', 'G', 'G'], ['G', 'G', 'G' ,'G','G','G','G','G','G','G','G','G','G','C','C',' C'],['G','G','G','G','G','G','G','G','G','G','G',' G','G','C','C','G'],['G','G','G','G','G','G','G',' G','G','G','G','G','G','C','G','C'],['G','G','G','G','G','G','G',' G','G','G','G','G','G','C','G','G'],['G','G','G',' G','G','G','G','G','G','G','G','G','G','G','C','C' ],['G','G','G','G','G','G','G','G','G','G','G','G' , 'G', 'G', 'C', 'G'], ['G', 'G', 'G', 'G', 'G', 'G', 'G', 'G' , 'G', 'G', 'G', 'G', 'G','G','G','C'],['G','G','G','G','G','G','G','G','G', 'G', 'G', 'G', 'G', 'G', 'G', 'G']] 65536 级数生成。

显然,这段代码并没有想象中的那么短小可爱。这就是为什么我想定义一个生成循环的函数。为了使它更好,我认为最好将它应该创建的循环数作为函数的参数添加,以便每次执行程序时都会选择它。

先感谢您

卢克

标签: pythonfunctionloops

解决方案


您需要的是您的集合/列表的笛卡尔积chords与自身 16 次。为此,您可以itertools.product()使用 Python。

例如,要实现与您的代码相同的效果,您可以执行以下操作:

import itertools

chords = ['C', 'G']
progressions = list(itertools.product(chords, repeat=16))

print(progressions)
print(f'{len(progressions)} progressions generated.')

推荐阅读