用大写字母和数字随机生成字符串

  • 问题:
  • 我想生成一个N大小的字符串

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

    如何在pythonic怎么了?在

  • 答案:
  • 一行回答:

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

    或者更短的时间从python3.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_大写+ 字符串.数字只连接表示大写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_生成器函数中使用,所以Python不会在内存中创建列表,而是动态地生成元素,一个接一个(关于这个的更多信息here)一

    我们不要求创建“n”次字符串elem,而是要求Python创建“n”次从一系列字符中选取的随机字符:

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

    因此随机选择(chars)for-in-range(size)实际上是在创建size字符序列。从字符中随机选取的字符

    >>> [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'