Python-具有大写字母和数字的随机字符串生成

发布于 2021-02-02 23:20:35

我想生成一个大小为N的字符串。

它应该由数字和大写英文字母组成,例如:

  • 6U1S75
  • 4Z4UKK
  • U911K4
关注者
0
被浏览
271
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    一行回答:

    ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(N))
    

    甚至更短,从Python 3.6开始,使用random.choices()

    ''.join(random.choices(string.ascii_uppercase + string.digits, k=N))
    

    加密更安全的版本;参见https://stackoverflow.com/a/23728630/2213647

    ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.digits) for _ in range(N))
    

    详细而言,具有清除函数以进一步重用:

    >>> import string
    >>> import random
    >>> def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
    ...    return ''.join(random.choice(chars) for _ in range(size))
    ...
    >>> id_generator()
    'G5G74W'
    >>> id_generator(3, "6793YUIO")
    'Y3U'
    

    它是如何工作的 ?

    我们导入string,一个包含常见ASCII字符序列的模块,以及random一个处理随机生成的模块。

    string.ascii_uppercase + string.digits 只是串联表示大写ASCII字符和数字的字符列表:

    >>> string.ascii_uppercase
    'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    >>> string.digits
    '0123456789'
    >>> string.ascii_uppercase + string.digits
    'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
    

    然后,我们使用列表推导来创建“ n”个元素的列表:

    `>>> range(4) # range create a list of ‘n’ numbers
    [0, 1, 2, 3]

    [‘elem’ for _ in range(4)] # we use range to create 4 times ‘elem’
    [‘elem’, ‘elem’, ‘elem’, ‘elem’]`

    在上面的例子中,我们使用[创建列表,但我们不这样做的id_generator功能,所以Python没有在内存中创建列表,但生成的飞行元素,一个接一个(更多相关信息点击这里)。

    elem我们将要求Python创建一个从字符序列中选取的随机字符,而不是创建字符串’n’次:

    >>> random.choice("abcde")
    'a'
    >>> random.choice("abcde")
    'd'
    >>> random.choice("abcde")
    'b'
    

    因此,random.choice(chars) for _ in range(size)实际上是在创建一个size字符序列。从chars以下位置随机选择的字符:

    >>> [random.choice('abcde') for _ in range(3)]
    ['a', 'b', 'b']
    >>> [random.choice('abcde') for _ in range(3)]
    ['e', 'b', 'e']
    >>> [random.choice('abcde') for _ in range(3)]
    ['d', 'a', 'c']
    

    然后,我们只将它们与一个空字符串连接起来,以便该序列成为一个字符串:

    >>> ''.join(['a', 'b', 'b'])
    'abb'
    >>> [random.choice('abcde') for _ in range(3)]
    ['d', 'c', 'b']
    >>> ''.join(random.choice('abcde') for _ in range(3))
    'dac'
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看