python随机选取字符串_在Python中用大写字母和数字随机生成字符串

webchat.jpg

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

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

6U1S75

4Z4UKK

U911K4

如何以pythonic的方式实现这一点?

回答一行:

''.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_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的n次,而是要求Python创建n次从随机字符序列中挑选出来的随机字符:

>>> random.choice("abcde")

'a'

>>> random.choice("abcde")

'd'

>>> random.choice("abcde")

'b'

因此,(size)中的 random.choice(chars)确实正在创建一个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'

这个Stackoverflow的问题是目前Google的“随机字符串Python”的结果。目前的最佳答案是:

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

这是一个很好的方法,但随机的PRNG不具有密码安全性。我想很多人研究这个问题将要产生随机字符串加密或密码。您可以通过在上面的代码中做一些小改动来安全地做到这一点:

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

使用random.SystemRandom(),而不是随机在* nix机器上使用/ dev / urandom,在Windows中使用CryptGenRandom()。这些是密​​码安全的PRNG。在需要安全PRNG的应用进程中使用random.choice而不是random.SystemRandom()。choice可能具有破坏性,考虑到这个问题的普及,那个错误已经做了很多次了。

如果您使用python3.6或更高版本,则可以使用新的[机密< / a>模块。

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

模块文档还讨论了生成安全令牌和最佳做法。

未经作者同意,本文严禁转载,违者必究!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值