首页 > 解决方案 > 用于反复试验的 Python 多重 for 循环

问题描述

我正在考虑创建一个允许我输出不同值的循环。我的意思是这样的:

list = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 
117, 118, 119, 120, 121, 122]

for i in range(0,len(list)):
    n = list[i]
    con_1 = chr(n)

    for i in range(0,len(list)):
        n = list[i]
        con_2 = chr(n)

        for i in range(0,len(list)):
            n = list[i]
            con_3 = chr(n)

            for i in range(0,len(list)):
                n = list[i]
                con_4 = chr(n)

                for i in range(0,len(list)):
                    n = list[i]
                    con_5 = chr(n)

                    for i in range(0,len(list)):
                        n = list[i]
                        con_6 = chr(n)

                        for i in range(0,len(list)):
                            n = list[i]
                            con_7 = chr(n)

                            for i in range(0,len(list)):
                                n = list[i]
                                con_8 = chr(n)

                                con = con_1 + con_2 +con_3 + con_4 + con_5 + con_6 + con_7 + con_8
                                
                                f = open("wifi_8sf.txt","a+")
                                f.write(con+"\n")
                                f.close()
                                print(con)

这是我为 8 位 wifi 解码器制作的代码(我知道这是破解代码效率最低的方法,但只是为了练习)。

然而,这只是 8 位数字,它需要很长时间,想象一下 50 位数字或以上的任何数字。

所以我在想一种方法来实现它globals(),例如,我需要 50 位输出,所以我将使用globals()定义 50 个不同的变量,每个变量都将作为单独的循环并在结尾。

根据这个想法,有人有办法解决吗?

标签: python

解决方案


如评论中所述,您可以使用该itertools模块来实现上述八个硬编码循环的结果。这将使您能够在构造的字符串中拥有可变数量的字母数字,并使您的代码更具可读性。

见下文:

import itertools

my_list = range(48,58) + range(65,123)

number_of_digits = 8

cartesian_product = itertools.product(my_list, repeat=number_of_digits)

for prod in cartesian_product:

    con = ""
    for digit in prod:
        con += chr(digit)

    print(con)
    # and do other things you want with con

除了上述解决方案之外,还有两件事:

  1. 您的代码中的这个片段:
for in range(0, len(list)):
    n = list[i]
    con_1 = chr(n)

可以用更具可读性和pythonic的方式代替:

for i in list:
    con_1 = chr(i)
  1. 您打开和关闭一个文件以便在每次迭代中写入它,这效率不高。为了加快速度,您至少可以在迭代循环之前打开它一次,并在完成后关闭它。

推荐阅读