关于魔术8球程序的问题,以及使用Python自动完成无聊的东西中的列表

时间:2019-07-18 23:06:58

标签: python

我在用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吗?

提前感谢您的答复!

4 个答案:

答案 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的索引。最后一个索引的位置始终等于长度减一。所以这就是为什么我们做减一的原因。我只是想澄清和扩展这一点,因为您所描述的内容不太准确。