Python 3.3 序列号生成器列表问题

IPD*_*ino 2 python random for-loop list sys

我正在为学校练习制作串行密钥生成器,但遇到了一个小问题。当我运行程序并输入我想要制作 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()
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

你在那里做一些完全没有必要的非常时髦的事情。

这个循环是你的问题:

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

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

您的代码可以大大简化:

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))
Run Code Online (Sandbox Code Playgroud)

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

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