我在用Python自动完成无聊的东西一书中难以理解魔术8球程序。该程序基本上在列表中有一堆消息,然后使用random.randint方法随机选择一条消息。代码如下:
import random
messages = ['It is certain',
'It is decidedly so',
'Yes definitely',
'Reply hazy try again',
'Ask again later',
'Concentrate and ask again',
'My reply is no',
'Outlook not so good',
'Very doubtful']
print(messages[random.randint(0, len(messages) - 1)])
如您所见,该程序非常简单。我的问题是关于最后一行。为什么他从消息长度中减去1? random.randint方法不应该从所有消息中选择某些东西,而不仅仅是一些。有9条消息,但是减去1条消息意味着只有8条消息正在经历random.randint方法。有人可以解释一下为什么他从邮件长度中减去1吗?
提前感谢您的答复!
答案 0 :(得分:3)
Python索引从0开始,而不是从1开始。如果列表中有9个条目,则需要在0-8范围内的随机整数。
答案 1 :(得分:1)
messages
是一个列表。列表的索引从0到n-1,其中n是列表中元素的数量,这也是length
函数返回的长度。但是,您实际上不必担心,因为您可以使用
print(random.choice(messages))
将产生与random.choice
相同的结果,将从列表中选择一个随机元素。
答案 2 :(得分:1)
假设您有一个包含3个对象的列表,并且要打印列表的第3个元素。
>>> s = [1,2,3]
>>> print(s[3])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
这会导致索引超出范围错误,因为列表中的元素从零开始计数,而不是从一个开始计数。
但是,如果您检查列表的长度,它将表示该列表包含3个元素。
>>> s = [1,2,3]
>>> print(len(s))
3
在random.randint(0,len(s))
中传递列表的len值时,范围变为4(0-3)而不是3(0-2)。
要解决此问题,我们将len减去一个random.randint(0,len(s)-1)
,并将范围设为3(0-2)。
现在randint无法选择数字3并将其传递给列表索引,因此不再有错误。
答案 3 :(得分:0)
“ random.randint方法不应该从所有消息中选择某些内容,而不仅仅是一些。”
random.randint方法对列表一无所知。如果我们看看documentation for randint:
random.randint(a,b)
返回一个随机整数N,使a <= N <= b。
因此,如果我们执行random.randint(1,3),它将给我们1,2,或3。
要获得0到9之间的随机数,我们将按照您所说的做,只需要从0到len(messages)进行random.randint,然后使用该数字从列表中获得随机索引。问题在于您的列表有9个项目,因此索引从0到8(最后一个项目是messages [8])。这称为基于0的索引。最后一个索引的位置始终等于长度减一。所以这就是为什么我们做减一的原因。我只是想澄清和扩展这一点,因为您所描述的内容不太准确。