rank | vote | view | answer | url |
---|---|---|---|---|
90 | 1038 | 651117 | 27 | url |
生成包含大写字母和数字的随机字符串
我希望生成N大小的字符串.
里面只含有数字和大写字母,比如:
- 6U1S75
- 4Z4UKK
- U911K4
有没有什么Pythonic的方法?
一行写的答案:
''.join(random.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
和random
模块,string
模块包含了所有常用的ASCII字符,random
模块处理随机数的生成.
string.ascii_uppercase + string.digits
是一个包含大写字母和数字的列表:
>>> string.ascii_uppercase
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.digits
'0123456789'
>>> string.ascii_uppercase + string.digits
'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
然后我们用列表推导式创建n
个元素的列表:
>>> range(4) # n个数字的列白哦
[0, 1, 2, 3]
>>> ['elem' for _ in range(4)] # 在一个列表创建4次'elem'
['elem', 'elem', 'elem', 'elem']
在上面的例子中,我们用[]
来创建列表,和id_generator
函数不一样,生成器不再内存中创建列表,只是在程序运行时一个一个的生成列表元素(更多见这里)
下面是在列表中随机取出一个元素:
>>> 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'