如何生成大小为N的字符串,由数字和大写英文字母组成,例如:
6个754z4英国U911K4型
如何生成大小为N的字符串,由数字和大写英文字母组成,例如:
6个754z4英国U911K4型
当前回答
从Python 3.6开始,如果你需要密码安全,你应该使用secrets模块,而不是随机模块(否则这个答案与@Ignacio Vazquez Abrams的答案相同):
from secrets import choice
import string
''.join([choice(string.ascii_uppercase + string.digits) for _ in range(N)])
还有一点需要注意:在str.join的情况下,列表理解比使用生成器表达式更快!
其他回答
用一行字回答:
''.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))
加密更安全的版本:请参阅本帖
''.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_capital+string.digitals只是连接表示大写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的“n”倍,而是要求Python创建从一系列字符中选取的随机字符“n”次:
>>> random.choice("abcde")
'a'
>>> random.choice("abcde")
'd'
>>> random.choice("abcde")
'b'
因此,_ in range(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'
如果您想要一个易于使用但高度可定制的密钥生成器,请使用密钥生成器pypi包。
这里是GitHub repo,您可以在其中找到完整的文档。
您可以自定义它,以提供您想要的字符串jist,并提供更多选项。下面是一个示例:
from key_generator.key_generator import generate
custom_key = generate(2, ['-', ':'], 3, 10, type_of_value = 'char', capital = 'mix', seed = 17).get_key()
print(custom_key) # ZLFdHXIUe-ekwJCu
希望这有帮助:)
免责声明:这使用了我制作的密钥生成器库。
从Python 3.6开始,如果你需要密码安全,你应该使用secrets模块,而不是随机模块(否则这个答案与@Ignacio Vazquez Abrams的答案相同):
from secrets import choice
import string
''.join([choice(string.ascii_uppercase + string.digits) for _ in range(N)])
还有一点需要注意:在str.join的情况下,列表理解比使用生成器表达式更快!
我想建议您下一个选择:
import crypt
n = 10
crypt.crypt("any sring").replace('/', '').replace('.', '').upper()[-n:-1]
妄想模式:
import uuid
import crypt
n = 10
crypt.crypt(str(uuid.uuid4())).replace('/', '').replace('.', '').upper()[-n:-1]
import string
from random import *
characters = string.ascii_letters + string.punctuation + string.digits
password = "".join(choice(characters) for x in range(randint(8, 16)))
print password