首页 > 解决方案 > 从python中的字符串中进行随机选择时,空字符串是否可以作为字符返回?

问题描述

假设我想从字符串中获取一个随机字符。在我的特定用例中,我想要包中的一个ascii_letters字符string

import string
import random

random.choice(string.ascii_letters)

现在当我检查

"" in string.ascii_letters
>> True

这是否意味着""将成为 的可能回报之一random.choice?如果不是,为什么不呢?如果是的话,有没有一种pythonic方法来阻止它的发生?

标签: pythonpython-3.x

解决方案


不,随机选择基本上来自一个序列,字符串序列一次给出一个字符,而不是字符之间的空格。这与您没有从以下位置获取空字符串的原因相同:

for ch in "123": print(ch) # gives 1, 2, and 3.

如果choice()允许返回字符之间的任何零宽度位,则这些位是无穷大的,这意味着从所有意图和目的来看,看到其中一个非零宽度字符的机会为零:-)


您得到的原因Trueif "" in "something"由于 Python 文档中的注释:

虽然inandnot in操作在一般情况下仅用于简单的包含测试,但一些专门的序列(例如str,bytesbytearray)也将它们用于子序列测试:

>>> "gg" in "eggs"
True

字符串中没有单个元素(即字符),但该示例返回 true,与对 的返回相同。那是因为这是子序列测试而不是遏制测试。"eggs""gg"""


如果您愿意,可以使用以下方法对其进行测试:

import random
while random.choice("123") != "":
    pass
print("Pax was wrong!")

看看它是否会打印出该声明。

我意识到这不是证据,因为即使是随机数也可能为您提供单个值的无限序列42(例如)。但它至少支持我的论点:-)


推荐阅读