rank vote url
63 367 163 862 url

生成包含大写字母和数字的随机字符串

我希望生成N大小的字符串.

里面只含有数字和大写字母,比如:

  • 6U1S75
  • 4Z4UKK
  • U911K4

有没有什么Pythonic的方法?


一行写的答案:

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

为了重用可以这样写:

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

如何工作?

我们引入stringrandom模块,string模块包含了所有常用的ASCII字符,random模块处理随机数的生成.

string.ascii_uppercase + string.digits是一个包含大写字母和数字的列表:

  1. >>> string.ascii_uppercase
  2. 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  3. >>> string.digits
  4. '0123456789'
  5. >>> string.ascii_uppercase + string.digits
  6. 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'

然后我们用列表推导式创建n个元素的列表:

  1. >>> range(4) # n个数字的列白哦
  2. [0, 1, 2, 3]
  3. >>> ['elem' for _ in range(4)] # 在一个列表创建4次'elem'
  4. ['elem', 'elem', 'elem', 'elem']

在上面的例子中,我们用[]来创建列表,和id_generator函数不一样,生成器不再内存中创建列表,只是在程序运行时一个一个的生成列表元素(更多见这里)

下面是在列表中随机取出一个元素:

  1. >>> random.choice("abcde")
  2. 'a'
  3. >>> random.choice("abcde")
  4. 'd'
  5. >>> random.choice("abcde")
  6. 'b'

所以random.choice(chars) for _ in range(size)会取出size个字符.字符随机的在chars中取出:

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

然后我们可以用空字符串把它们连起来成为一个字符串:

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