【问题标题】:Python 3.3 Serial key generator list problemsPython 3.3 串行密钥生成器列表问题
【发布时间】:2013-06-07 14:37:59
【问题描述】:

我正在为学校练习制作一个串行密钥生成器,但遇到了一个小问题。当我运行程序并输入我想制作 20 个串行密钥时,程序将制作 20 个相同的密钥。造成这种情况的原因是 for 循环在每次经过时都会生成变量。 (v{0} 的事情)

我不知道如何使用另一种方法来读取列表中的所有值,并从中创建变量。

我的代码:

import random, sys

class Application:

    def __init__(self):
        global i
        i = int(input("How many serial codes do you want to create?\n"))
        print("")
        self.main(i)


    def main(self, i):

        seq = "ABCDFGHJIKLMNOPQRSTUVWXYZ1234567890"
        store = []

        for z in range(0, i):  
            for x in range(0, 5):
                first = random.choice(seq)
                second= random.choice(seq)
                third = random.choice(seq)
                fourth =random.choice(seq)
                fifth = random.choice(seq)
                serial = first + second + third + fourth + fifth
                store.append(serial)

            for y, item in enumerate(store):
                setattr(sys.modules[__name__], 'v{0}'.format(y), item)

            create = v0 + "-" + v1 + "-" + v2 + "-" + v3 + "-" + v4
            print(create)
        print("\nCreated", i, "serial keys!")

if __name__ == '__main__':
    app = Application()

【问题讨论】:

    标签: python list random for-loop sys


    【解决方案1】:

    你正在做一些完全没有必要的非常时髦的东西。

    这个循环是你的问题:

    for y, item in enumerate(store):
        setattr(sys.modules[__name__], 'v{0}'.format(y), item)
    

    您一遍又一遍地设置相同的 5 个全局变量,覆盖以前的版本。当您拥有 globals() 函数为您提供全局命名空间作为字典时,您完全不需要使用 setattr(sys.modules[__name__], ..)。但是设置全局变量来解决一个简单的问题就像用霰弹枪捉虫一样。

    您的代码可以大大简化:

    def main(self, count):
        seq = "ABCDFGHJIKLMNOPQRSTUVWXYZ1234567890"
    
        for i in range(count):
            print('-'.join(''.join(random.choice(seq) for _ in range(5)) for _ in range(5)))
    
        print("\nCreated {} serial keys!".format(count))
    

    count 的示例打印输出设置为 5:

    LWLGX-F6MNR-9YIZC-H23TK-TIGB9
    YALYY-4ZARO-8H9BV-YMHVD-HFFGP
    JNA5R-65GT1-TZ3BM-PNMZI-56NM3
    39VCY-MLZ98-SU1PP-PYMX7-RZJQZ
    76LGC-VF5MG-LK7C4-XPUSO-H0B97
    

    【讨论】:

    • 谢谢!我对python有点陌生,所以这是我肯定没有想到的。问题是我的代码正在运行,所以我没有想到在打印中使用循环。
    • 程序的结果很奇怪,但我会努力让它按我想要的方式工作。这是关键之一:U-R-5-J-1
    • 它被称为generator expression
    • @IPDGino:是的,所以您想创建 5 个用破折号分隔的值,每个值有 5 个字符?然后将循环翻倍。
    • @IPDGino:重读您的代码我确实看到您正在尝试这样做。已更新。
    【解决方案2】:

    您可能会发现在最后打印存储以进行调试很有用。您不断地追加到列表中,但只读取前五个元素。

    全局变量的使用对我来说有点奇怪,但根本问题是你使用列表的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-16
      • 2016-10-06
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 1970-01-01
      相关资源
      最近更新 更多